Redis
Redis 专题
1. 应用场景
- 5大 value 类型
- 缓存
- 为的是服务无状态,延伸思考,数据结构、分布式锁
- 无锁化
2. Redis 是单线程还是多线程
- 无论什么版本,只有一个工作线程
- 6.x 高版本出现了 IO多线程
- 需要学习系统IO课,理解面向 IO 模型编程
- 单线程满足 Redis 的串行原子性,只不过 IO 多线程后,把输入、输出放到更多的线程里并行
好处:- 执行时间缩短,更快
- 更好的压榨系统以及硬件资源(网卡能够高效使用)
- 客户端被读取的顺序不能被保障,但在同一个连接(socket)里时顺序是可以保障的
- Redis 组成结构
3. Redis 是否存在线程安全问题
- Redis 可以保障内部串行,但是在外界使用的时候要自行保障,即业务上要自行保障顺序
4. 缓存穿透、缓存击穿、缓存雪崩
- 这些问题的核心就是避免 DB 无效/重复请求
5. Redis 如何删除过期 key/缓存如何回收
- 后台在轮询,分段分批的删除过期 key
- 请求的时候判断是否已经过期了
- 尽量的回收内存无用空间
6. 缓存是如何淘汰的
- 内存空间不足的情况下:
- 淘汰机制里有不允许淘汰
- lru、lfu、random
- 全空间
- 设置过过期的 key 的集合中
7. 如何进行缓存的预热
- 提前把数据塞入 Redis(热数据: 肯定不知道哪些是热数据,会造成线上很多数据没有缓存命中)
- 开发逻辑上规避差集(没有缓存的数据),会造成击穿、穿透、雪崩,实施锁方案
- 结合4、5、6
Redis 主从、缓存不一致等问题
8. 数据库与缓存不一致
- 分布式事务解决(意义不大,引入新问题,降低性能),仅适用于读多写稀有的场景
- Redis 是缓存,更倾向于稍微有时差
- 尽量减少 DB 操作
- 真的要落地,推荐 canal
9. 主从不一致
- Redis 默认弱一致性,主从的同步是异步的
- 使用 Redis 实现分布式锁不能使用主从(单实例、分片集群、redlock)==> redisson
- 在配置中提供了必须有多少个 client 连接能同步的配置,配置同步因子,趋向于强一致性
wait 2 5000
,小心使用- 第 3、4 点稍微违背 Redis 的初衷
10. Redis 持久化原理
- 当前线程阻塞服务(略)
- 异步后台线程完成持久化:fork + cow
11. Redis 持久化方式
- RDB、AOF,主从同步也算持久化
- 高版本:开启 AOF,AOF 可以通过执行日志得到全部内存数据,但是追求性能:
- 体积变大,重复无效指令,会发生重写,后台用线程把内存的 kv 生成指令写个新的 AOF 文件
- 4.x 新增性能更高的方式,把重写方式换成直接 RDB 放到 AOF 文件头部,比原有的方法更快,再追加日志
12. Redis 扛不住万级流量
- 参考 4、5、6
13. Redis 中的事务三条指令指什么,第三条指令到达后执行失败如何处理
- 见前图
14. 为什么使用 setnx
- 原子性操作(不存在的情况下完成创建)
- 如果要做分布式锁,就要用 set k v nx ex(不存在,过期时间,避免死锁)