写点什么

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

作者:小小怪下士
  • 2022-10-26
    湖南
  • 本文字数:2464 字

    阅读完需:约 8 分钟

前言

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 的字典序排列,支持快速的定位、插入和删除操作。


用户头像

还未添加个人签名 2022-09-04 加入

热衷于分享java技术,一起交流学习,探讨技术。 需要Java相关资料的可以+v:xiaoyanya_1

评论

发布
暂无评论
阿里技术专家压箱底好货:Redis深度历险笔记_Java_小小怪下士_InfoQ写作社区