导航
导航

缓存二三事

应对高并发流量的三把利器:缓存、限流与降级。所以合理使用缓存很重要。
缓存,空间换时间一种解决方案。
不谈缓存的实现框架,只结合在开发中遇到的问题,当然这些问题前人大佬已经填坑了,让我们能够更好的使用缓存。正所谓前人栽树后人乘凉。

缓存的更新策略对比:

策略 一致性 维护成本
FIFO、LRU等算法 最差
超时去除 较差 一般
主动更新

缓存穿透:
查询一个必然不存在的数据,这样每次都会访问DB,如果有人恶意破坏,就有可能直接对DB造成影响
解决方案:缓存空对象, 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

缓存并发/热点key问题:
一个热点key失效,可能出现多个进程同时查询DB,同时设置缓存。
解决方案:使用互斥锁(mutex key) 比如redis的setnx 分布式锁

雪崩问题:
当缓存服务器重启或者设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方案:1、保证cache的高可用。2、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀