简单聊下缓存穿透和缓存雪崩

缓存的引入能够大大的减少存储系统的压力,并且使得系统的响应更快,简直是优化系统性能神器。但是,缓存的引入也加大了系统的复杂度,让原本简单的查询变得更加复杂了。并且对于大流量系统,设计缓存机制的时候,需要特别注意缓存穿透和缓存雪崩问题。如果这两个问题没有解决,很容易给系统造成灾难性的伤害。

什么是缓存穿透?

缓存穿透是指查询缓存后没有查到数据,再次到数据系统去查询数据。正常情况下,访问到不存在的数据可能性不太大,但是比如异常情况下,有人恶意访问不存在的数据id,导致每次都先访问了缓存再去访问数据库,如果不对这种情况做处理,可能会给系统造成压力。

2)数据存在,但是缓存失效或者刚好访问的时候在生成缓存

是很容易把业务系统搞崩溃的。所以对于这种情况也需要引起足够的重视。

什么是缓存雪崩?

缓存雪崩是指缓存失效后引起系统性能急剧下降的情况。如果只是缓存失效,但是查询业务系统能够快速生成新的缓存那么造成的危害相对而言还是比较小的,但是如果某些情况下,如果刚好这个缓存的生成会很耗时,结果缓存失效了,那么大量客户端同时请求这个数据的时候,请求降直接落在了业务数据库上,给业务数据库造成了很大的压力。

解决方案

缓存的设计其实是一个比较复杂的方案,现在说下我在项目过程中使用的一些设计思路。

1)二级缓存

Cache1设计为过期缓存,Cache2设计为不过期或过期时间较长的缓存,当cache1无法命中的时候,请求cache2,只有cache2没有的情况下,再去访问业务数据库(或者直接返回空,这个根据实际场景来定义)。

2)数据预热

主动预热更新缓存,先刷一级缓存,再去更新二级缓存。特别是对于一些热点数据,一定要有机制去主动更新,否则很容易发生缓存雪崩。

3)更新缓存加锁

当更新缓存时做加锁处理,比如redis的setnx(2.6.12已经在set命令中加入了nx功能,并且有过期时间,建议使用,setnx已经成为过去式了),只有获取到锁才去业务数据库拿数据,否则等待,超过时间则返回空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值