1. 高性能
1.1. scan
1.1.1. 避免使用keys
1.2. 线程IO模型
1.2.1. NIO
1.2.1.1. 多路复用
1.2.1.1.1. epoll(linux)
1.2.1.1.2. kqueue(freebsd & macosx)
1.2.1.2. 指令队列
1.2.2. 单线程
1.2.2.1. 减少上下文切换
1.2.2.2. 避免并发问题
1.3. 通信协议RESP
1.3.1. 字符串
1.3.2. 换行符分割
1.4. 内存回收
1.4.1. jemalloc(facebook)-默认
1.4.2. tcmalloc(google)
1.5. 懒惰删除
1.5.1. unlink
1.5.2. 异步队列删除
2. 地理位置
2.1. GeoHash
2.1.1. 计算附近的人
3. 分布式锁
3.1. Redlock
3.1.1. 半数节点加锁成功视为成功
3.2. setnx
3.3. 需要设置过期时间,防止死锁
3.4. 可重入锁,计数
4. 数据去重统计
4.1. HyperLogLog
4.1.1. 统计数据
4.2. 布隆过滤器
4.2.1. 数据去重
5. 持久化
5.1. AOF
5.1.1. 记录写指令
5.1.2. 定时压缩
5.1.3. fsync脏数据回刷
5.2. 快照
5.2.1. fork主线程
5.2.2. 使用操作系统的 COW 机制来进行数据段页面的分离
5.3. 4.0混合持久化
5.3.1. 早期数据rdb恢复,最新数据AOF重放
6. 过期策略
6.1. 拥有失效时间的key集合
6.2. 贪心策略定期扫描
6.3. 从库过期通过同步主库del指令
6.4. 近似LRU算法
7. 数据结构
7.1. string
7.1.1. Simple Dynamic String
7.1.2. 最大512M
7.1.3. 44以下emb
7.1.4. 44以上raw
7.1.5. 最大1M冗余空间
7.2. list
7.2.1. quicklist
7.2.1.1. 由多组ziplist组成双向链表
7.2.1.2. 压缩深度
7.2.2. 双向链表
7.3. dict
7.3.1. 数组加链表结构
7.3.2. 渐进式rehash
7.3.3. hash算法siphash
7.3.4. 小于10%会发生缩容
7.4. set
7.4.1. 容纳的元素都是整数并且元素个数较小时采用intset
7.5. zset
7.5.1. 跳跃列表
7.5.1.1. 元素排名通过计算跳跃长度计算
7.5.2. 有序列表
7.6. 位图
7.6.1. 一次操作一个数据setbit、getbit
7.6.2. 一次操作多个数据bitfield
7.7. ziplist
7.7.1. 小对象压缩
7.7.2. 连续内存
7.7.3. 级联更新
7.8. listpack
7.8.1. ziplist结构的改进
7.8.2. 不需要级联更新
7.9. Rax基数树
7.9.1. 依据key值排序
7.9.2. 子节点如果只有一个产生压缩结构
8. 高可用
8.1. 主从同步
8.1.1. 增量同步
8.1.2. 快照同步
8.1.3. 无盘复制
8.2. Sentinel
8.2.1. 路由切换
8.2.2. 主从同步可能丢失消息
8.3. Codis
8.3.1. Go开发
8.3.2. 分片
8.3.3. 后台管理
8.3.4. 非官方分布式方案
8.4. Cluster
8.4.1. 官方分布式方案
8.4.2. 槽位迁移
8.4.3. 容错
8.4.4. 网络抖动
8.4.5. 去中心化
8.4.6. 集群变更感知
9. 消息队列
9.1. PubSub
9.1.1. 消息会丢失
9.1.2. 非持久化
9.2. Stream
9.2.1. 独立消费
9.2.2. 需要ACK
9.2.3. 主从复制高可用
10. 限流
10.1. 漏斗方案
10.1.1. Redis-Cell