常见问题(面试重点)
缓存穿透
问题
数据查询时未在redis缓存中命中时将会访问sql数据库,如果存在恶意用户高频访问数据库中也不存在的数据,将会造成数据库的压力持续存在,这就是缓存穿透
本质是缓存未命中
方案
1.不存在的数据也在redis缓存中设置对应的缓存,值设置为空字符串并设置过期时间(依然存在两个问题:1.仍然会消耗redis缓存存储这些无用的键,2.即使有过期时间,也会造成一定的时间窗口,不适合需要强一致性的业务)
2.使用布隆过滤器,对所有可能的查询参数以hash形式存储,在控制层进行校验,不符合要求的参数直接拒绝
缓存击穿
问题
存在一些键非常热门,持续接受着高并发,这些键在过期的瞬间,高并发的请求会集中访问数据库,造成数据库瞬时压力暴增,这就是缓存击穿
例如:各平台的热搜榜
本质是并发量过高和缓存过期
方案
1.设置热点数据永不过期
2.限制并发,使用分布式锁确保同一时刻只能有一个请求访问数据库,对于没获得锁的线程将进行阻塞(分布式锁实现较麻烦,且分布式锁将承受这部分高并发压力),也可以借助消息队列进行控制
缓存雪崩
问题
集中设置的热点键缓存具有接近的过期时间,当达到过期时间时,大批热点键在接近的时刻过期,相关请求将全部访问数据库,造成数据库压力周期性暴增,或者缓存服务器宕机造成缓存数据丢失,这就是缓存雪崩
例如:电商平台的秒杀活动,个别缓存服务器宕机断网
本质是缓存批量过期或缓存服务器宕机
方案
1.设置备用节点
2.加分布式锁或消息队列控制对数据库的并发访问量
3.数据预热,提前把热点数据访问一遍以加载到redis缓存中 或 在高并发访问时手动触发设置不同的过期时间使失效时间尽可能分散
分布式锁
看门狗机制、红锁
#redis#此专栏由于更新观看不便,不会保持及时更新,最新更新见计算机合集专栏https://www.nowcoder.com/creation/manager/columnDetail/04yp33