Redis知识点整理
2024/8/1
Redis面试题
Redis为什么速度快
- Redis是纯内存操作,执行速度非常快
- 采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题
- 使用I/O多路复用模型,非阻塞IO
Redis的应用场景
重要
结合自己的项目来进行表述
缓存、分布式锁、计数器、保存token、消息队列、延迟队列
Redis缓存三兄弟
重要
穿透无中生有key,布隆过滤null隔离。
缓存击穿过期key, 锁与非期解难题。
雪崩大量过期key,过期时间要随机。
面试必考三兄弟,可用限流来保底。
缓存穿透
定义
查询一个不存在的数据,MySQL查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
解决方案
方案一: 缓存空值
定义
缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存
优缺点
- 操作比较简单
- 消耗内存,可能会发生不一致的问题
方案二: 布隆过滤器
定义
bitmap(位图):相当于是一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1
作用
布隆过滤器可以用于检索一个元素是否在一个集合中。
优缺点
- 优点:内存占用较少,没有多余key
- 缺点:实现复杂,存在误判
缓存击穿
定义
给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮
解决方案
方案一: 互斥锁
定义
当缓存失效时,不立即去load db,先使用如 Redis 的 SETNX 去设置一个互斥锁。
当操作成功返回时,再进行 load db的操作并回设缓存,否则重试get缓存的方法
优缺点
- 数据强一致性
- 性能上可能没那么高,且有可能产生死锁的问题
方案二: 逻辑过期
定义
- 在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前key设置过期时间;
- 当查询的时候,从redis取出数据后判断时间是否过期;
- 如果过期,则开通另外一个线程进行数据同步,当前线程正常返回数据,这个数据可能不是最新的。
优缺点
- 高可用性,性能比较高
- 数据可能不是最新的,无法保证强一致性。
缓存雪崩
定义
是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案
- 给不同的Key的TTL添加随机值
- 利用Redis集群提高服务的可用性 (哨兵模式、集群模式)
- 给缓存业务添加降级限流策略 (ngxin或spring cloud gateway)
- 给业务添加多级缓存(Guava或Caffeine)
双写一致性
定义
当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致
