前言
Redis,是互联网技术架构在存储系统中应用最为宽泛的中间件,它也是工程师技术面试中最喜爱问的技能之一,特地是那些优良的、竞争强烈的大型互联网公司(比方 Twitter、新浪微博、阿里云、腾讯云、淘宝、知乎等),通常要求面试者不仅仅把握 Redis 根底应用,更要求深层了解 Redis 外部实现的细节原理。毫不夸大地说,能把 Redis 的知识点全副吃透,你的半只脚就曾经踏进心仪公司的大门!
所以小编给大家整顿了这份《Redis 深度历险》文档,并且将从目录,前言,次要内容,这三个局部大家解说这本文档,同时心愿对各位大哥敌人们有点作用,也心愿你们会喜爱!最初,有须要这篇《Redis 深度历险》文档的敌人们【间接点击此处】即可获取~
先来看看这份 Redis 目录:
次要内容
这篇《Redis 深度历险: 外围原理和利用实际》,次要分为五个局部,为利用篇,原理篇,集群篇,拓展篇,源码篇,所以接下来,小编就每篇认真的开展来具体的为大家解说一下这本书的知识点!
开篇和根底篇
- 开篇: 授人以鱼不如授人以渔——Redis 能够用来做什么?
- 根底: 万丈高楼平地起——Redis 根底数据结构
开篇
根底
利用篇
- 利用 1: 千帆竞发——分布式锁
- 利用 2: 金蝉脱壳——延时队列
- 利用 3: 省吃俭用——位图
- 利用 4: 四两拨千斤—— HyperLogLog
- 利用 5: 层峦叠嶂——布隆过滤器
- 利用 6: 断尾求生——简略限流
- 利用 7: 爱财如命——漏斗限流
- 利用 8: 近水楼台——GeoHash
- 利用 9: 海底捞针——Scan
局部知识点:
利用 1: 千帆竞发——分布式锁
利用 4: 四两拨千斤—— HyperLogLog
这一节咱们能够学会应用 HyperLogLog 数据结构来进行估数,它十分有价值,能够解决很多精确度不高的统计需要。
利用 5: 层峦叠嶂——布隆过滤器
利用 7∶爱财如命——漏斗限流
漏斗限流是最罕用的限流办法之一,顾名思义,这个算法的灵感源于漏斗(funnel)的构造。
利用 8∶近水楼台—— GeoHash
Redis 在 3.2 版本当前减少了地理位置 GEO 模块,意味着咱们能够应用 Redis 来实现摩拜单车「左近的 Mobike」、美团和饿了么「左近的餐馆」这样的性能了。
原理篇
- 原理 1: 鞭辟入里——线程 IO 模型
- 原理 2: 窃窃私语——通信协议
- 原理 3: 防患未然——长久化
- 理 4: 雷厉风行——管道
- 原理 5: 风雨同舟——事务
- 原理 6: 小道消息—-PubSub
- 原理 7: 开源节流——小对象压缩
- 原理 8: 有恃无恐——主从同步
局部知识点:
原理 3∶防患未然——长久化
Redis 的数据全副在内存里,如果忽然宕机,数据就会全副失落,因而必须有一种机制来保障 Redis 的数据不会因为故障而失落,这种机制就是 Redis 的长久化机制。
原理 4∶雷厉风行——管道
大家始终以来对 Redis 管道有一个误会,他们认为这是 Redis 服务器提供的一种特地的技术,有了这种技术就能够减速 Redis 的存取效率。然而实际上 Redis 管道 (Pipelinc) 自身并不是 Redis 服务器间接提供的技术,这个技术实质上是由客户端提供的,跟服务器没有什么间接的关系。上面咱们对这块做一个深刻探索。
原理 6:小道消息—PubSub
后面咱们讲了 Redis 音讯队列的应用办法,然而没有提到 Redis 音讯队列的不足之处,那就是它不反对音讯的多提机制。
原理 8∶有恃无恐——主从同步
很多企业都没有应用到 Redis 的集群,然而至多都做了主从。有了主从,当 master 挂掉的时候,运维让从库过去接管,服务就能够持续,否则 master 须要通过数据恢复和重启的过程,这就可能会拖很长的工夫,影响线上业务的继续服务。
集群篇
- 集群 1: 李代桃僵——Sentinel
- 集群 2: 分而治之——Codis
- 集群 3: 万众一心——Cluster
局部知识点:
集群 2: 分而治之——Codis
集群 3∶万众一心——Cluster
拓展篇
- 拓展 1: 耳听八方——Stream
- 拓展 2: 无所不知—— Info 指令
- 拓展 3: 拾脱漏补——再谈分布式锁
- 拓震 4: 朝生暮死——过期策略
- 拓展 5: 优胜劣汰——LRU
- 拓震 6: 平波缓进———懈怠删除
- 拓展 7: 妙手仁心——优雅地应用 Jedis
- 拓展 8: 居安思危——爱护 Redis
- 拓展 9: 隔墙有耳——Redis 平安通信
局部知识点:
拓展 1: 耳听八方——Stream
Redis5.0 被作者 Antirez 忽然放了进去,减少了很多新的特色性能。而 Redis5.0 最大的新个性就是多出了一个数据结构 Stream,它是一个新的弱小的反对多播的可长久化的音讯队列,作者坦言 Redis Strcam 狠狠地借鉴了 Kafka 的设计。
拓展 3: 拾脱漏补——再谈分布式锁
在第三节,咱们粗疏解说了分布式锁的原理,它的应用非常简单,一条指令就能够实现加锁操作。不过在集群环境下,这种形式是有缺点的,它不是相对平安的。
拓展 6: 平波缓进———懈怠删除
始终以来咱们认为 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰盛多样的数据结构。不过 Redis 外部实际上并不是只有一个主线程,它还有几个异步线程专门用来解决一些耗时的操作。
拓展 9∶隔墙有耳——Redis 平安通信
源码篇
- 源码 1: 极度深寒——摸索「字符串」内部结构
- 源码 2: 极度深寒——摸索「字典」外部
- 源码 3: 极度深寒——摸索「压缩列表」外部
- 源码 4: 极度深寒——摸索「疾速列表」外部
- 源码 5: 极度深寒——摸索「跳跃列表」内部结构
- 源码 6: 极度深寒——摸索「紧凑列表」外部
- 源码 7: 极度深寒——摸索「基数树」外部
源码 1∶极度课寒——探案「字符串」内部结构
Redis 中的字符串是能够批改的字符串,在内存中它是以字节数组的模式存在的。咱们晓得 C 语言外面的字符串规范模式是以 NULL 作为结束符,然而在 Redis 外面字符串不是这么示意的。因为要获取 NULL 结尾的字符串的长度应用的是 strlen 规范库函数,这个函数的算法复杂度是 O(n),它须要对字节数组进行遍历扫描,作为单线程的 Redis 示意接受不起。
源码 3∶极度课寒——摸索「压缩列表」外部
Redis 为了节约内存空间应用,set 和 hash 容器对象在元素个数较少的时候,采纳压缩列表 (ziplist) 进行存储。压缩列表是一块间断的内存空间,元素之间紧挨着存储,没有任何冗余空隙。
源码 5∶极度深寒——探案「跳跃列表」内部结构
Redis 的 zset 是一个复合构造,一方面它须要一个 hash 构造来存储 value 和 score 的对应关系,另一方面须要提供依照 seore 来排序的性能,还须要可能指定 score 的范畴来获取 valuc 列表的性能,这就须要另外一个构造「跳跃列表」-
源码 7∶极度深寒——摸索「甚数树」外部
Rax 是 Redis 外部比拟非凡的一个数据结构,它是一个有序字典树〔基数树 RadixTrec),依照 key 的字典序排列,反对疾速的定位、插入和删除操作。