Redis 缓存使用问题

缓存与数据一致性

操作缓存和数据库时有三个问题需要考虑

1.删除缓存还是更新缓存?

更新缓存:每次更新数据库都更新缓存,无效写操作较多

删除缓存:更新数据库时让缓存失效,查询时再更新缓存

2.如何保证缓存与数据库的操作的同时成功或失败?

单体系统,将缓存与数据库操作放在一个事务

分布式系统,利用TCC等分布式事务方案

3.先操作缓存还是先操作数据库?

先删除缓存,再操作数据库

image

先操作数据库,再删除缓存

image

由于数据库的操作要比缓存操作慢 , 这种事故概率比较低。延时双删就是在删除缓存后等待一段时间再次删除缓存 ,防止这种情况出现,也可以选择使用缓存超时时间进行兜底。

缓存更新策略的最佳实践方案

1.低一致性需求:使用Redis自带的内存淘汰机制

2.高一致性需求:主动更新,并以超时剔除作为兜底方案

1)读操作

缓存命中则直接返回
缓存未命中则查询数据库,并写入缓存,设定超时时间
2)写操作

先写数据库,然后再删除缓存
要确保数据库与缓存操作的原子性

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

解决办法:

缓存空对象

额外的内存消耗

布隆过滤

内存占用较少,没有多余key , 但是 实现复杂,存在误判可能

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:

1 给不同的Key的TTL添加随机值

2 利用Redis集群提高服务的可用性

3 给缓存业务添加降级限流策略

4 给业务添加多级缓存

缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案:

互斥锁

image

如果重建缓存时间过长, 则用户等待时间过长 。 保证一致性

逻辑过期

在缓存数据中添加逻辑过期时间

image

不保证一致性

posted @ 2022-12-07 11:55  原来是晴天啊  阅读(49)  评论(0编辑  收藏  举报