redis作缓存可能会出现的问题

本文探讨了缓存穿透、缓存雪崩及缓存击穿等问题,并提供了实用的解决策略,如设置多级缓存、使用mutex锁以及采用CAP模式等,确保缓存与数据库的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存穿透:要访问的数据在数据库中不存在,因此也不会被加到缓存中,因此每次访问都要去数据库中查找数据;

       解决:将不存在的数据也加到缓存中,设置一个较短的过期时间;

                  将一些不可能存在的数据提前过滤掉;

 

缓存雪崩 :缓存中的数据在同一时间段集体过期:可能是缓存服务器宕机,大量请求直接访问数据库

        解决:设置多级缓存,缓存和缓存的拷贝;设置mutex锁,控制访问数据库写缓存为单线程;

     根据不同点设置不同的缓存过期时间,热点数据缓存时间长,冷门数据缓存时间短;

     缓存预热;

 

缓存击穿:过于热点的数据,在缓存过期的瞬间,数据库会被过量访问,导致不可用。

        解决:可以设置缓存永不过期;


 

如何保证缓存和数据库中一致:

  现在流行解决方法:CAP (cache aside pattern)

           1.  请求先查缓存,缓存没有去数据库查,查到之后添加到缓存;

           2.  数据更新,先更新数据库,然后删除相应的缓存;

 

问题:第二步设置缓存失效,不是直接添加到缓存中?

如果线程A和线程B同时更新数据库,B后更新覆盖A,A后添加到缓存覆盖B,这样数据库保存B,缓存保存的是A导致不一致问题出现;

 

问题:为什么不先删缓存再更新数据?

如果采用这种方式:线程AB同时更新数据,AB都删除缓存,然后A先更新B后更新,A更新完数据后,C查询相关数据,缓存没有,去数据库查到A的更新,然后添加到缓存中;之后B对数据进行更新,导致数据库存B,缓存是A;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值