1、收益和成本
a、收益:加速度写、降低后端负载
b、成本:数据不一致、代码维护成本、运维成本
2、缓存的更新策略
a、LRU/LFU/FIFO算法剔除:例如maxmemory-policy
b、超时剔除,定期删除+惰性删除
c、主动更新
3、缓存的粒度控制
a、通用性:全量属性更好
b、占用空间:部分属性更好
c、代码维护:表面上全量属性更好
4、缓存穿透问题
数据在缓存和数据库中根本不存在,流量都会到达数据库
原因可能是:
a、业务代码自身问题
b、恶意攻击、爬虫
解决方法:
a、缓存空对象
b、布隆过滤器拦截
5、无底洞问题
节点数增加,但因为网络开销增加,性能反而下降
优化:
a、命令本身优化
b、减少网络通信次数
c、降低接入成本:例如客户端长连接/连接池、NIO等
6、热点key的重建优化(缓存击穿)
a、若缓存的数据是基本不会发生更新的,则可尝试将该热点数据设置为永不过期。
b、若缓存的数据更新不频繁,且缓存刷新的整个流程耗时较少的情况下,则可以采用基于 redis、zookeeper 等分布式中间件的分布式互斥锁,或者本地互斥锁以保证仅少量的请求能请求数据库并重新构建缓存,其余线程则在锁释放后能访问到新缓存。
c、若缓存的数据更新频繁或者缓存刷新的流程耗时较长的情况下,可以利用定时线程在缓存过期前主动的重新构建缓存或者延后缓存的过期时间,以保证所有的请求能一直访问到对应的缓存。
网友评论