前言
Redis,是互联网技术架构在存储系统中使用最为广泛的中间件,它也是工程师技术面试中最喜欢问的技能之一,特别是那些优秀的、竞争激烈的大型互联网公司(比如 Twitter、新浪微博、阿里云、腾讯云、淘宝、知乎等),通常要求面试者不仅仅掌握Redis基础使用,更要求深层理解Redis内部实现的细节原理。毫不夸张地说,能把Redis的知识点全部吃透,你的半只脚就已经踏进心仪公司的大门!
所以为了顺应时代的发展,以及自身发展的需要,学习和掌握Redis,势在必得,这份《Redis深度笔记》就可以很好的帮到大家,下面我会展示Redis的大纲,觉得不错的小伙伴- 【dian这里获取完整版!】
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
2.指令
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.探索基数树内部
应用
结构
增删节点
总结
最后,我想说的是,学习并非难事,而贵在坚持,尤其是在我们参与工作之后,要继续坚持学习就更不容易了。但对于程序员来说,学习是立业之根本,如若放弃学习,被市场淘汰是迟早的事情。所以,学习更多新的知识对于自己来说才是一种更大的投资。