当前位置: 首页 > 后端技术 > Java

阿里技术专家压箱底:Redis深度探险笔记

时间:2023-04-01 21:56:52 Java

前言Redis是互联网技术架构的存储系统中应用最为广泛的中间件。也是工程师在技术面试中喜欢问的技能之一,尤其是那些优秀的、竞争激烈的大型互联网公司(如推特、新浪微博、阿里云、腾讯云、淘宝、知乎等),通常要求面试官不仅要掌握Redis的基本使用,还要深刻理解Redis原理的内部实现细节。毫不夸张的说,如果你能把Redis的所有知识点都弄明白,那你的半只脚就已经踏进了你心仪公司的大门!所以小编为大家整理了这篇《Redis深度历险》文档,我将从目录、前言、主要内容三个部分来讲解这篇文档。同时也希望对各位兄弟朋友有些用处,希望大家喜欢!最后,需要这篇《Redis深度历险》文档的小伙伴们可以【直接点这里】获取~先来看看这个Redis目录:这篇《Redis深度历险:核心原理和应用实践》的主要内容主要分为五个部分,分别是应用文章,Principles,Clusters,Expansion,SourceCode,那么接下来,小编将对每篇文章进行细心的拓展,详细讲解本书的知识点!开篇与基础开篇:授人以鱼不如授人以渔——Redis有什么用?基础:从高楼到平地——Redis基础数据结构开篇基础应用应用1:千帆竞发——分布式锁应用2:延缓大军——延迟队列应用3:节衣缩食——位图应用4:四二拨——HyperLogLog应用5:山与山——BloomFilter应用6:TailSurvival——简单限流应用7:Nothing——Funnel限流应用8:临近水——GeoHash应用9:找针Haystack——扫描部分知识点:应用一:千帆竞发——分布式锁应用四:四对二——HyperLogLog在这一节中,我们可以学习使用HyperLogLog数据结构进行估算,非常有价值和可以解决很多精度不高的统计需求。应用五:漫山遍野——Bloomfilter应用七:无物——漏斗限流漏斗限流是最常用的限流方式之一。顾名思义,该算法的灵感来自于漏斗结构。应用8:Proximity——GeoHashRedis在3.2版本之后增加了地理位置GEO模块,也就是说我们可以使用Redis来实现摩拜的“附近的摩拜”,美团、饿了么的“附近的餐厅”等功能。原则原则一:Whip-in-the-threadIO模型原则二:耳语——通信协议原则三:未雨绸缪——恒久论原则四:坚决行动——流水线原则五:同舟共济——事务原则6:八卦--PubSub原则7:开源节流——小对象压缩原则8:有备无患——主从同步部分知识点:原则3:未雨绸缪——持久化Redis数据都在内存中。如果突然宕机,所有的数据都会丢失,所以你必须有一个机制来保证Redis的数据不会因为故障而丢失。这种机制就是Redis的持久化机制。原则四:雷厉风行——管道大家一直对Redis管道有误解。他们认为这是Redis服务器提供的一种特殊技术。通过该技术,可以加快Redis的访问效率。但实际上,Redis管道(Pipelinc)本身并不是Redis服务器直接提供的技术。该技术本质上是由客户端提供的,与服务器没有直接关系。让我们更深入地了解一下这件作品。原则六:八卦—PubSub前面我们讲了如何使用Redis消息队列,但是没有提到Redis消息队列的缺点,就是不支持消息的多提示机制。原则8:有备无患——主从同步很多公司没有用过Redis集群,但至少都做过主从。有了master-slave,当master挂了,运维会让从库接管,服务才能继续。否则,master需要经过数据恢复和重启的过程,可能耗时较长,影响线上业务的持续服务。集群集群1:李代涛僵硬——哨兵集群2:分而治之——Codis集群3:团结一致——集群部分知识点:集群2:分而治之——Codis集群3:团结一致——集群展开展开一:聆听八方——流展开二:无所不知——信息指挥展开三:拾漏补缺——浅谈分布式锁展开四:生死存亡——过期策略展开五:适者生存————LRU拓展六:平波慢进——懒删拓展七:巧手善用——绝地武士的优雅运用拓展八:居安思危——保护Redis拓展九:隔墙有耳——知识点Redis安全通信:扩展一:听八方——StreamRedis5.0是由作者Antirez突然发布的,增加了许多新特性。Redis5.0最大的新特性是增加了一个数据结构Stream,它是一个新的支持多播的强大持久的消息队列。作者承认,RedisStrcam大量借鉴了Kafka的设计。拓展三:拾漏补缺——再谈分布式锁在第三节中,我们详细讲解了分布式锁的原理。它的使用非常简单,一条指令即可完成锁定操作。但是在集群环境下,这种方式是有缺陷的,并不是绝对安全的。拓展六:顺利进行——懒删除我们一直认为Redis是单线程的,单线程给Redis带来了代码的简洁和丰富多样的数据结构。然而,Redis内部其实不止一个主线程,它还有几个异步线程专门处理一些耗时的操作。拓展九:隔墙有耳-Redis安全通信源码源码1:极寒-探索“字符串”内部结构源码2:极寒-探索“字典”内部源码3:极寒-探索“压缩“List”内部源码4:极寒-探索“QuickList”内部源码5:极寒-探索“JumpList”内部结构源码6:极寒-探索“CompactList”内部源码7:Extremely深冷——探究“基数树”内部源码1:极寒课——探究“字符串”内部结构Redis中的字符串是可以修改的字符串,在内存中以字节数组的形式存在。我们知道C语言中字符串的标准形式是以NULL作为结束符,但是在Redis中字符串并不是这样表示的,由于使用了strlen标准库函数来获取以NULL结束的字符串的长度,算法复杂度这个函数的复杂度是O(n),需要遍历和扫描字节数组,这是Redis单线程无法承受的。源代码3:极限课——探索“压缩列表”Redis为了节省内存空间,在元素数量较少的时候,将set和hash容器对象存储在压缩列表(ziplist)中。压缩列表是一个连续的内存空间,其中元素彼此相邻存储,没有任何冗余间隙。源代码5:极寒——侦探“跳转列表”内部结构Redis的zset是一个复合结构。一方面,它需要一个hash结构来存储value和score的对应关系;另一方面,它需要提供根据seore排序的功能,还需要能够指定score的范围来获取valuclist的功能,这就需要另一个结构“jumplist”——源代码7:极寒——探索“偶数树”内部Rax是Redis内部一种特殊的数据结构,是一种有序的字典树(radixtreeRadixTrec),按照key的字典顺序排列,支持快速定位,插入和删除操作。