Redis 缓存使用问题
缓存与数据一致性
操作缓存和数据库时有三个问题需要考虑
1.删除缓存还是更新缓存?
更新缓存:每次更新数据库都更新缓存,无效写操作较多
删除缓存:更新数据库时让缓存失效,查询时再更新缓存
2.如何保证缓存与数据库的操作的同时成功或失败?
单体系统,将缓存与数据库操作放在一个事务
分布式系统,利用TCC等分布式事务方案
3.先操作缓存还是先操作数据库?
先删除缓存,再操作数据库
先操作数据库,再删除缓存
由于数据库的操作要比缓存操作慢 , 这种事故概率比较低。延时双删就是在删除缓存后等待一段时间再次删除缓存 ,防止这种情况出现,也可以选择使用缓存超时时间进行兜底。
缓存更新策略的最佳实践方案
1.低一致性需求:使用Redis自带的内存淘汰机制
2.高一致性需求:主动更新,并以超时剔除作为兜底方案
1)读操作
缓存命中则直接返回
缓存未命中则查询数据库,并写入缓存,设定超时时间
2)写操作
先写数据库,然后再删除缓存
要确保数据库与缓存操作的原子性
缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
解决办法:
缓存空对象
额外的内存消耗
布隆过滤
内存占用较少,没有多余key , 但是 实现复杂,存在误判可能
缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案:
1 给不同的Key的TTL添加随机值
2 利用Redis集群提高服务的可用性
3 给缓存业务添加降级限流策略
4 给业务添加多级缓存
缓存击穿
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
解决方案:
互斥锁
如果重建缓存时间过长, 则用户等待时间过长 。 保证一致性
逻辑过期
在缓存数据中添加逻辑过期时间
不保证一致性