缓存更新策略
缓存中的数据可能会和数据源的真实数据有一段时间不一致,需要利用一些策略来进行更新:
- LRU/LFU/FIFO 算法
- 超时剔除
- 主动更新
策略 | 一致性 | 维护成本 |
---|---|---|
LRU/LFU/FIFO | 最差 | 低 |
超时剔除 | 较差 | 较低 |
主动更新 | 强 | 高 |
缓存粒度
如何选择缓存的粒度也比较重要,缓存粒度太大(全部缓存)会导致内存上升。如果缓存粒度太细,反复修改则会降低代码的可维护性
缓存穿透
也就是类似缺页,需要从mysql查询再缓存的情况出现。例如攻击者请求了不存在的ID,然后导致大量穿透,数据库读写较慢,拖垮服务器。
这时候有可以设置空对象,如果设置空对象,意味着缓存中存储了很多key,会消耗很多空间,如果是攻击则问题更加严重,设置一个较短的过期时间可以缓解。
如果这时候,在过期时间内,存储层添加了这个数据,就会导致缓存存储不一致,可能影响业务。
缓存定期删除方式
惰性删除:读写之前判断key是否过期(CPU友好) 定期删除:定期抽样key,判断是否过期(内存友好)