跳到主要内容

Redis

Redis 专题

1. 应用场景

  • 5大 value 类型
  • 缓存
  • 为的是服务无状态,延伸思考,数据结构、分布式锁
  • 无锁化

2. Redis 是单线程还是多线程

  • 无论什么版本,只有一个工作线程
  • 6.x 高版本出现了 IO多线程
    Redis IO 多线程
  • 需要学习系统IO课,理解面向 IO 模型编程
  • 单线程满足 Redis 的串行原子性,只不过 IO 多线程后,把输入、输出放到更多的线程里并行
    好处:
    1. 执行时间缩短,更快
    2. 更好的压榨系统以及硬件资源(网卡能够高效使用)
  • 客户端被读取的顺序不能被保障,但在同一个连接(socket)里时顺序是可以保障的
  • Redis 组成结构
    Redis 组成结构

3. Redis 是否存在线程安全问题

  • Redis 可以保障内部串行,但是在外界使用的时候要自行保障,即业务上要自行保障顺序

4. 缓存穿透、缓存击穿、缓存雪崩

  • 这些问题的核心就是避免 DB 无效/重复请求
    缓存穿透、缓存击穿、缓存雪崩

5. Redis 如何删除过期 key/缓存如何回收

  1. 后台在轮询,分段分批的删除过期 key
  2. 请求的时候判断是否已经过期了
  • 尽量的回收内存无用空间

6. 缓存是如何淘汰的

  • 内存空间不足的情况下:
    1. 淘汰机制里有不允许淘汰
    2. lru、lfu、random
    3. 全空间
    4. 设置过过期的 key 的集合中

7. 如何进行缓存的预热

  1. 提前把数据塞入 Redis(热数据: 肯定不知道哪些是热数据,会造成线上很多数据没有缓存命中)
  2. 开发逻辑上规避差集(没有缓存的数据),会造成击穿、穿透、雪崩,实施锁方案
  • 结合4、5、6

Redis 主从、缓存不一致等问题

Redis 主从、缓存不一致等问题

8. 数据库与缓存不一致

  1. 分布式事务解决(意义不大,引入新问题,降低性能),仅适用于读多写稀有的场景
  2. Redis 是缓存,更倾向于稍微有时差
  3. 尽量减少 DB 操作
  4. 真的要落地,推荐 canal

9. 主从不一致

  1. Redis 默认弱一致性,主从的同步是异步的
  2. 使用 Redis 实现分布式锁不能使用主从(单实例、分片集群、redlock)==> redisson
  3. 在配置中提供了必须有多少个 client 连接能同步的配置,配置同步因子,趋向于强一致性
  4. wait 2 5000,小心使用
  5. 第 3、4 点稍微违背 Redis 的初衷

10. Redis 持久化原理

  • 当前线程阻塞服务(略)
  • 异步后台线程完成持久化:fork + cow

11. Redis 持久化方式

  1. RDB、AOF,主从同步也算持久化
  2. 高版本:开启 AOF,AOF 可以通过执行日志得到全部内存数据,但是追求性能:
    1. 体积变大,重复无效指令,会发生重写,后台用线程把内存的 kv 生成指令写个新的 AOF 文件
    2. 4.x 新增性能更高的方式,把重写方式换成直接 RDB 放到 AOF 文件头部,比原有的方法更快,再追加日志

12. Redis 扛不住万级流量

  • 参考 4、5、6

13. Redis 中的事务三条指令指什么,第三条指令到达后执行失败如何处理

  • 见前图

14. 为什么使用 setnx

  1. 原子性操作(不存在的情况下完成创建)
  2. 如果要做分布式锁,就要用 set k v nx ex(不存在,过期时间,避免死锁)