Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >强烈推荐这个大佬的 Redis 系列,看完直呼过瘾

强烈推荐这个大佬的 Redis 系列,看完直呼过瘾

原创
作者头像
码哥字节
发布于 2024-08-03 04:32:06
发布于 2024-08-03 04:32:06
55800
代码可运行
举报
文章被收录于专栏:RedisRedis
运行总次数:0
代码可运行

我是码哥,可以叫我靓仔。我人生中的第一本书《Redis 高手心法》出版了!

作为当今广受欢迎的内存数据库,Redis 以其卓越的性能和广泛的应用场景著称。

掌握 Redis 技术几乎成为每位开发人员、测试人员和运维人员的看家本领!

大约在 2021 ~2023 年期间,我在微信公众号「码哥跳动」(原「码哥字节」,后改名为「码哥跳动」)上发表了 40 多篇 Redis 技术相关文章,有很多读者也是因为看了我的 Redis 系列,关注了我的公众号,感谢大家一路陪伴。

自从签下约稿合同到正式出版,经历了两年之久。

千古无同局,叶底能否藏花,我们未来印证,愿此心法能让你学有所成,你来,我等着。

01打磨只为呈现完美的作品

Chaya:码哥,Redis 这么快,你咋就这么慢呢?从恋爱到生娃都没你这么久。

写书的难度可比写公众号文章大多了。公众号的文章,可能有一些错别字,也有可能存在语病。

编写书的话,要求严格多了,语言要精准正确,不能存在错别字和语病,内容需要循序渐进有层次感,还要经过出版社老师的多次审核、校正,每一段话和文字都是我们精心「雕刻」的成果。

此外,我经过多年对 Redis 的深耕,花了很多时间重新梳理了 Redis 技术架构,加入了 Redis 6.0 ~ 7.0 版本的各种全新特性 ,从更深层次的角度挖掘底层实现原理,并尽量用风趣幽默的语言和 158 张图片解释难懂的技术点

作为后端开发者的我深刻知道,学习是一件比较难的事情,所以我就想着站在开发者的角度,用拟人化、场景化诙谐幽默的言语,再加撩人心弦又准确图片让读者轻松愉快地学习 Redis 实现原理和开发实战技巧。

总之一句话,每一个章节都经过反复推敲,只为呈现出最精彩的内容给你们。在我花费了大量精力更系统更全面地规划,以及出版社老师不断编排打磨,《Redis 高手心法》纸质书成为了去繁存简,精益求精的作品,就好像从钢铁侠战甲马克 1 号,进化到成功拿下灭霸一血的马克 85 战甲。

Chaya:网络资料很多,但碎片化严重,如何才能成为 Redis 高手,建立完整的知识框架?

本书基于 Redis 7.0 版本的源码来讲解,并建立了一个完整的 Redis 知识框架,从全局视角整理 Redis 知识体系,结合难点给出 158 张图片,希望能让你们更容易理解。

对于一门技术,如果只接触了零散的技术点,没有在脑海里建立⼀个完整的知识框架和架构体系,没有系统观,就会很吃力,而且会出现一看好像会,过后就忘记,⼀脸懵逼的情况。

我会引导大家从全局出发,带着问题去寻找答案,尝试输出对一个技术点的思考和理解。

⼀起搭建⼀套完整的知识框架, 学会从全局视角整理整个知识体系

02欲练此功不必自宫只需放松

本书的特点是 Redis 化身成人,将复杂的概念与实际案例相结合,以简洁诙谐幽默的方式,为你揭示 Redis 的精髓

Redis 的第一人称视角出发,以拟人故事化的方式和诙谐幽默的语言与各路“神仙”对话,配合 158 张图片,由浅入深循序渐进地讲解 Redis 的数据结构实现原理。

篇幅有限,我从书中摘取少量内容,给大家感受下文字和图片的温度。

03底层数据结构实现原理

Chaya:我知道你支持很多种数据类型,对于不同的数据类型,底层应该用了多种数据结构来实现存储吧?

小姐姐很聪明,我给开发者提供了 String(字符串)、Hashes(散列表)、Lists(列表)、Sets(无序集合)、Sorted Sets(可根据范围查询的排序集合)、Bitmap(位图)、HyperLogLog、Geospatial(地理空间)和 Stream(流)等数据类型。

为了在速度和内存占用之间找到最优解,我设计了多种数据结构。总之为了实现多快好省(支持数据类型多、速度快、好用、节省内存)。

MySQL:“你都是用 C 语言开发出来的,C 语言本就有字符串,吓唬谁呢?!”

格局能不能打开一点儿,我并没有直接使用 C 语言的字符串,而是自己搞了一个 SDS 的结构体来表示字符串。

为了支持丰富和高性能的字符串操作函数、保存二进制格式数据、节省内存,以及实现“既 要又要还要”的目标。

SDS 中的 len 字段保存了字符串的长度,实现了 O(1) 时间复杂度获取字符串长度。

SDS 结构有一个 flags 字段,表示的是 SDS 类型。实际上 SDS 一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64,区别在于数组的 len 长度和分配空间 长度 alloc 不同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct __attribute__ ((__packed__)) sdshdr8 {
   uint8_t len;
   uint8_t alloc;
   unsigned char flags;
   char buf[];
};

节省内存

之所以这么设计,是因为使用不同的 SDS 类型保存不同大小的字符串可以节省内存。

二进制格式数据安全

SDS 不仅可以存储字符串类型数据,还能存储二进制格式数据。SDS 并不是通过“\0” 来判断字符串结束的,而是采用 len 标志结束,所以可以直接存储二进制格式数据。

编码格式

我还对字符串类型的数据采用了三种编码格式来存储,分别是 int、embstr 和 raw,你可使 用 OBJECT encoding key 来查找对象所使用的编码类型。

空间预分配

当对 SDS 进行缩短操作时,程序并不会回收多余的内存空间,如果后面需要 append 追 加操作,则直接使用 buf 数组 alloc - len 中未使用的空间。

通过惰性空间释放策略,避免了减小字符串所需的内存重新分配操作。

篇幅有限,更多的底层数据结构实现原理,不再一一列举。大家可以看下一些书中的一些图片感受下温度。

ziplist 数据结构。

listpack 数据结构。

Lists 实现消息队列实现原理。

04RDB 与 AOF

Chaya:Redis 数据保存在内存,如果没有持久化,一旦断电或者宕机,保存在内存中的数据将全部丢失,咋办呢?

我有两大撒手锏,可以实现数据持久化,做到宕机快速恢复,“不丢数据稳如山”,无须从数据库中慢慢恢复数据。它们就是 RDB 快照和 AOF(Append Only File)。

MySQL:“在实际生产环境中,程序员通常会给你配置 6GB 的内存,将这么大的内存数据生成 RDB 快照文件落到磁盘的过程会持续比较长的时间。你如何做到在继续处理写命令请求的同时保证 RDB 与内存中的数据一致呢?”

作为唯快不破的 NoSQL 数据库扛把子,我在对内存数据做快照时,并不会暂停写操作(读操作不会造成数据的不一致)。我使用了操作系统的多进程写时复制技术(Copy On Write ,COW)来实现快照持久化。

Chaya:“随着写入操作持续执行,AOF 日志过大怎么办?文件越大,数据恢复就越慢。”

为了解决 AOF 文件体积膨胀的问题,创造我的 Antirez 老哥设计了 AOF 重写机制(AOF Rewrite),对文件进行瘦身。

05主从复制架构

Chaya:“有了 RDB 快照和 AOF 再也不怕宕机丢失数据了,但是 Redis 实例宕机了怎么办?如何实现高可用呢?”

Chaya 愣了一会儿,又赶紧补充道:“依然记得那晚我和我的恋人鸳语轻传,香风急促,走在成都的街头约会。可是这时候 Redis 忽然宕机了,无法对外提供服务,电话连环 call,岂不是折煞人也“。

莫怕,为了你们的幸福。我提供了主从模式,通过主从复制,将一份冗余数据复制到其他 Redis 服务器,实现高可用。你们放心地说温存,说风月。

Chaya:“master 和 slave 的同步是如何完成的呢?master 的数据是一次性传给 slave,还是分批同步?主从正常运行期间又怎么同步呢?要是 master 和 slave 间的网络断连了,重新连接后数据还能保持一致吗?”

你问题怎么这么多?不要急。我知道你想安心地与恋人相会,不受 Redis 宕机导致的服务报警的干扰。主从数据同步分为 4 种情况。

◎ master 和 slave 第一次全量同步。

◎ master 和 slave 正常运行期间的数据同步。

◎ master 和 slave 网络断开重连同步。

主从库第一次复制过程大体可以分为 3 个阶段:建立连接阶段(准备阶段)、同步数据阶段、发送同步期间接收的新写命令到 slave 阶段。

06哨兵集群

主从复制架构面临一个严峻问题:master 宕机,无法执行写操作,无法自动选择一个 slave 切换为 master,也就是无法实现故障自动切换。

Chaya 的恋人:“眼前是橡树的绿叶,白色的竹篱笆。好想告诉我的她,这里像幅画。一起手牵手么么哒(此处省略 10000 字)Redis 忽然宕机,我总不能把 Chaya 推开,停止甜蜜,然后打开电脑手工进行主从切换,再通知其他程序员把地址改成新 master 的信息上线?”。

如此一折腾恐,想必你心里的雨倾盆地下,万万使不得。所以必须有一个高可用的方案,为此,我提供一个高可用方案——哨兵(sentinel)。

哨兵是 Redis 的一种运行模式,它专注于对 Redis 实例(master、slave)运行状态的监控,并能够在 master 发生故障时通过一系列的机制实现选主及主从切换,实现自动故障切换,确保整个 Redis 系统的可用性。

你就可以安心地与你的恋人 Chaya 在欢乐港湾约会,尽情享受甜蜜,哪怕是吵架都那么醉人,不再需要担心 Redis 忽然宕机带来的烦恼。

我们先从全局看哨兵,简要地了解它的整个运作流程,接着针对每个任务详细分析,Redis 哨兵的主要职责如下。

Chaya:“来说下实现原理吧。”

篇幅有限,我就不继续细说实现原理的细节了,各位道友可拿出 50 灵石,购买查看完整版的《Redis 高手心法》。

07IT 大佬们的推荐语

以下来自一些 IT 技术大佬对本书的推荐语。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
38 张图详解 Redis:核心架构、发布订阅机制、9大数据类型底层原理、RDB和AOF 持久化、高可用架构、性能问题排查和调优
今天我们从全局视角开始,带着问题去寻找答案,梳理 Redis 核心知识点与架构设计:核心架构、String(字符串)、Hashes(散列表)、Lists(列表)、Sets(无序集合)、Sorted Sets(可根据范围查询的排序集合)、Bitmap(位图)、HyperLogLog、Geospatial (地理空间)和 Stream(流)等数据类型底层实现原理、发布订阅机制、RDB、AOF 持久化、主从架构、哨兵集群架构、Cluster 架构、性能优化。(ps:文章内容摘选自我的新书《Redis 高手心法》,更多完整内容详见本书籍)
码哥字节
2025/03/27
5150
38 张图详解 Redis:核心架构、发布订阅机制、9大数据类型底层原理、RDB和AOF 持久化、高可用架构、性能问题排查和调优
【Redis我可以讲一个小时】
我进入了张三的主页 查看共同关注的人(李四),取出我关注的人和张三关注的人,二个集合取交集得出结果是李四,就是通过SINTER交集实现的。 查看我可能认识的人(王五),取出我关注的人和张三关注的人,二个集合取并集得出结果是(张三,李四,王五),拿我关注的人(张三,李四)减去并集里的元素,剩下的王五就是我可能认识的人,可以通过并集和差集实现。 查看我关注的人也关注了他(王五),取出我关注的人他们关注的人,(李四,王五)(我,王五)的交集,就是王五。
Java廖志伟
2022/03/14
3860
【Redis我可以讲一个小时】
Redis 架构是如何演进么?为什么?
Redis 现在已经十分流行,互联网几乎所有项目都会用到,在使用 Redis 时,你知道是如何保证稳定和高效的提供服务呢,它的架构演化路程是什么呢?
码哥字节
2024/04/26
1960
Redis 架构是如何演进么?为什么?
《面试八股文》之 Redis 16卷
redis 作为我们最常用的内存数据库,很多地方你都能够发现它的身影,比如说登录信息的存储,分布式锁的使用,其经常被我们当做缓存去使用。
moon聊技术
2021/07/28
8640
《面试八股文》之 Redis 16卷
Redis 面霸篇:从高频问题透视核心原理
「码哥字节」从高频面试问题跟大家一起横扫 Redis 核心知识点,从根本上理解 Redis ,不做八股文的工具人,做扭转乾坤的大神。
码哥字节
2021/07/19
7530
Redis 很屌,不懂使用规范就糟蹋了
谁曾想,凌晨 12 点之后,用户量暴增,出现了一个技术故障,用户无法下单,当时老大火冒三丈!
码哥字节
2021/10/11
4950
妈妈再也不担心我面试被Redis问得脸都绿了
Redis 作为一个开源的,高级的键值存储和一个适用的解决方案,已经越来越在构建 「高性能」、「可扩展」 的 Web 应用上发挥着举足轻重的作用。
我没有三颗心脏
2020/03/27
6670
Redis详解
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。 免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库!
JokerDJ
2023/11/27
4250
Redis详解
这些年背过的面试题:Redis 高可用篇
Chaya 转行做程序员,去大厂面试被面试官问到:“Redis 如何实现持久化?”
码哥字节
2024/05/07
2340
这些年背过的面试题:Redis 高可用篇
面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了!
大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis——不会有人假期玩去了吧?不会吧?
三分恶
2022/05/11
1.3K0
面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了!
2W字!详解20道Redis经典面试题!(珍藏版)
大家好,我是捡田螺的小男孩。金九银十即将到来,整理了20道经典Redis面试题,希望对大家有帮助。
捡田螺的小男孩
2021/09/08
8650
Redis:从应用到底层,一文帮你搞定
底层:C语言中String用char[]数组表示,源码中用SDS(simple dynamic string)封装char[],这是是Redis存储的最小单元,一个SDS最大可以存储512M信息。
麒思妙想
2020/12/22
6740
Redis:从应用到底层,一文帮你搞定
Redis面试题总结(超详细)
针对以上的问题,Redis集群提供了较为完善的方案,解决了存储能力受到单机限制,写操作无法负载均衡的问题。
是阿超
2021/11/10
4.2K0
有关缓存的一些面试知识
底层数据结构一共有 7 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组、快速列表。它们和数据类型的对应关系如下图所示
ma布
2024/10/21
980
有关缓存的一些面试知识
9个知识点带你轻松走进Redis世界!
底层:C语言中String用char[]数组表示,源码中用SDS(simple dynamic string)封装char[],这是是Redis存储的最小单元,一个SDS最大可以存储512M信息。
Java程序猿
2021/01/31
6510
Redis 知识总结
作者:leobhao,腾讯 CSIG 研发工程师。 1. Redis 概览 Redis 和 memcache 的区别,Redis 支持的数据类型应用场景 redis 支持的数据结构更丰富(string,hash,list,set,zset)。memcache 只支持 key-value 的存储; redis 原生支持集群,memcache 没有原生的集群模式。 2. Redis 单线程模型 redis 单线程处理请求流程 redis 采用 IO 多路复用机制来处理请求,采用 reactor IO 模型, 处
腾讯技术工程官方号
2022/06/14
6170
Redis 知识总结
【云原生进阶之PaaS中间件】第一章Redis-2.1架构综述
        Redis 组件的系统架构如图所示,主要包括事件处理、数据存储及管理、用于系统扩展的主从复制/集群管理,以及为插件化功能扩展的 Module System 模块。
江中散人_Jun
2023/10/16
3920
【云原生进阶之PaaS中间件】第一章Redis-2.1架构综述
【Redis 系列】redis 学习十三,Redis 常问简单面试题
http://www.redis.cn/ redis 中文网给了很明确且清晰的定义
阿兵云原生
2023/02/16
2010
(三万字长文)面试不怂之redis与缓存大全
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
3640
面试必备(背)--Redis八股文系列
redis: redis 即 Remote Dictionary Server,用中文翻译过来可以理解为远程数据服务或远程字典服务。其是使用 C 语言的编写的 key-value 存储系统。
微客鸟窝
2022/04/08
1.5K0
面试必备(背)--Redis八股文系列
相关推荐
38 张图详解 Redis:核心架构、发布订阅机制、9大数据类型底层原理、RDB和AOF 持久化、高可用架构、性能问题排查和调优
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验