应对高并发流量的三把利器:缓存、限流与降级。所以合理使用缓存很重要。
缓存,空间换时间一种解决方案。
不谈缓存的实现框架,只结合在开发中遇到的问题,当然这些问题前人大佬已经填坑了,让我们能够更好的使用缓存。正所谓前人栽树后人乘凉。
缓存的更新策略对比:
策略 | 一致性 | 维护成本 |
---|---|---|
FIFO、LRU等算法 | 最差 | 低 |
超时去除 | 较差 | 一般 |
主动更新 | 强 | 高 |
缓存穿透:
查询一个必然不存在的数据,这样每次都会访问DB,如果有人恶意破坏,就有可能直接对DB造成影响
解决方案:缓存空对象, 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
缓存并发/热点key问题:
一个热点key失效,可能出现多个进程同时查询DB,同时设置缓存。
解决方案:使用互斥锁(mutex key) 比如redis的setnx 分布式锁
雪崩问题:
当缓存服务器重启或者设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方案:1、保证cache的高可用。2、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
- 本文标题: 缓存二三事
- 文章作者: sherryriver(木木三可)
- 发布时间: 2018.02.01
- 本文链接: https://sherryriver.github.io/2018/02/01/缓存二三事/
- 许可协议: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。