前言
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的字典序排列,反对疾速的定位、插入和删除操作。