不愧是腾讯架构师珍藏的“redis 深度笔记(全彩版)”这细节讲解,神了
前言
说到 Redis 相信对于我们这些程序员来说太熟悉了,Redis 凭借着自己超高的超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持,很快就在国内的互联网市场占据了一席之地,得到了广大用户的一致好评,随着国内外使用 Redis 的大中小型互联网公司越来越多,可以直接了当的说,现在 Redis 的了解和应用实践是后端中高级程序员必掌握的技能。
如果你是一个后端程序员,对 Redis 还是一知半解,不妨花一段时间看完这篇腾讯大佬手码的《redis 深度笔记》,读完说可以说对掌握 Redis 是肯定不可能的,但可以保证的是,对于你来说肯定收获颇丰。这篇《redis 深度笔记》的内容都是从实战中摸索总结的 Redis 最常用最核心知识点,当你所在公司系统的并发量达到一定的量级,你就会发现这份笔记稀有的高级功能能派上大用场
redis 深度笔记(全彩版)
本小册主要讲解笔者从实战中摸索总结的 Redis 最常用最核心知识点,但限于篇幅和精力,并没有涵盖 Redis 全部的内容知识点,比如 Redis 内置的 lua 脚本引擎就完全没有提到。之所以不讲,是因为在平时的工作中确实从来没有使用过,它就好比关系数据库的存储过程,虽然功能很强大,但是确实很少使用,而且也不易维护,所以就不推荐读者使用了。下面我们就从这基础、应用、原理、集群、拓展、源码等六个篇章来贯通这份 redis 深度笔记吧
Ps:由于篇幅限制,笔记无法全部为大家展示出来,就以截图主要内容的形式让大家参考啦,需要完整版的小伙伴可以添加上小助手 vx: bjmsb15 即可获取到了
PART1:Redis 深度笔记开篇
1.Redis 可以用来做什么?
由 Redis 面试想到的
Redis 可以做什么?
2.Redis 基础数据结构
Redis 安装
Redis 基础的数据结构
容器型数据结构的通用规则
关于 Redis 使用的一些思考
PART2:Redis 的应用总结
1.分布式锁
分布式锁
超时问题
可重入性
2.延时队列
异步消息队列?
队列空了怎么办?
队列延迟
空闲连接自动断开
锁冲突处理
延时队列的实现
进一步优化
3.位图
基本使用
统计和查找
魔术指令 bitfield
4.HyperLogLog
使用方法
pfadd 这个 pf 是什么意思?
pfmerge 适合什么场合用?
注意事项
HyperLogLog 实现原理
pf 的内存占用为什么是 12k?
5.布隆过滤器
布隆过滤器是什么?
Redis 中的布隆过滤器
布隆过滤器的基本使用
注意事项
布隆过滤器的原理
空间占用估计
实际元素超出时,误判率会怎样变化?
用不上 Redis4.0 怎么办?
布隆过滤器的其他应用
6.简单限流
如何使用 Redis 来实现简单限流策略?
7.漏斗限流
Redis-Cell
一些思考
8.GeoHash
用数据库来算附近的人
GeoHash 算法
Redis 的 Geo 指令基本使用
9.Scan
scan 基础使用
字典的结构
scan 遍历顺序
字典扩容
对比扩容缩容前后的遍历顺序
渐进式 rehash
更多的 scan 指令
大 Key 扫描
PART3:Redis 的原理
1.线程 IO 模型
非阻塞 IO
事件轮询(多路复用)
指令队列
响应队列
定时任务
2.通信协议
RESP(Redis Serialization Protocol)
客户端->服务端
服务端->客户端
3.持久化
快照原理
fork(多进程)
AOF 原理
AOF 重写
fsync
运维
Redis4.0 混合持久化
4.管道
Redis 的消息交互
管道压力测试
深入理解管道本质
5.事务
Redis 事务的基本使用
原子性
discard(丢弃)
优化
Watch
6.PubSub
消息多播
PubSub
模式订阅
消息结构
PubSub 缺点
7.小对象压缩
32bit vs 64bit
小对象压缩存储(ziplist)
内存回收机制
内存分配算法
8.主从同步
CAP 原理
最终一致
主从同步
增量同步
快照同步
增加从节点
无盘复制
Wait 指令
PART4:Redis 集群
1.Sentinel
消息丢失
Sentinel 基本使用
2.Codis
Codis 分片原理
不同的 Codis 实例之间槽位关系如何同步?
扩容
自动均衡
Codis 的代价
Codis 的优点
MGET 指令的操作过程
架构变迁
Codis 的尴尬
Codis 的后台管理
3.Cluster
槽位定位算法
跳转
迁移
容错
网络抖动
可能下线(PFAIL-Possibly Fail)与确定下线(Fail)
Cluster 基本使用
槽位迁移感知
集群变更感知
PART5:Redis 拓展
1.Stream
消息 ID
消息内容
增删改查
独立消费
创建消费组
消费
Stream 消息太多怎么办?
消息如果忘记 ACK 会怎样?
PEL 如何避免消息丢失?
Stream 的高可用
分区 Partition
Redis 每秒执行多少次指令?
Redis 连接了多少客户端?
Redisn 内存占用多大?
复制积压缓存区多大?
3.再谈分布式锁
Redlock 算法
Redlock 使用场景
4.过期策略
过期的 key 集合
定时扫描策略
从库的过期策略
5.LRU
LRU 算法
近似 LRU 算法
6.懒惰删除
Redis 为什么要懒惰删除(lazy free)?
flush
异步队列
AOF Sync 也很慢
更多异步删除点
7.优雅地使用 Jedis
重试
8.保护 Redis
指令安全
端口安全
Lua 脚本安全
SSL 代理
9.Redis 安全通信
spiped 原理
spiped 使用入门
PART6:源码
1.探索字符串内部结构
embstr vs raw
扩容策略
2.探索字典内部
dict 内部结构
渐进式 rehash
查找过程
hash 函数
hash 攻击
扩容条件
缩容条件
set 的结构
3.探索压缩列表内部
增加元素
级联更新
IntSet 小整数集合
4.探索快速列表内部
每个 ziplist 存多少元素?
压缩深度
5.探索跳跃列表内部结构
基本结构
查找过程
随机层数
插入过程
删除过程
更新过程
如果 score 值都一样呢?
元素排名是怎么算出来的?
6.探索紧凑列表内部
级联更新
取代 ziplist
7.探索基数树内部
应用
结构
增删节点
最后
不管学习任何一门技术,都应该有个系统的学习!为什么一定要系统性学习?不管你是不是做 IT,其实都有系统性学习的必要。系统性的学习一个知识点,可以让我们在遇到问题时考虑得更加全面,这也是一个成熟的工程师应该具备的特征;碎片化的学习则很容易让我们得出一些片面的、甚至错误的结论。
然而,系统性学习需要耗费巨大的时间和精力,有的人可能会觉得不值得,就放弃了系统性学习,转而信仰复制粘贴改一下七字真言,一头扎进 CURD 的苦海。
评论