小鱼儿博客

缓存雪崩如何解决?

1、缓存雪崩

指在某一个时间段,缓存集中过期失效。产生雪崩的原因之一,比如马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
解决办法:
1)缓存失效时间加入随机因子,尽量让失效时间点均匀分布,设置不同的过期时间
2)可以加锁,保证一个时刻只有一个线程执行写操作。

2、缓存穿透

程序在处理缓存时,一般是先从缓存查询,如果缓存没有这个key获取为null,则会从DB中查询,并设置到缓存中去。按这种做法,那查询一个一定不存在的数据值,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决办法:
如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的失效时间,当然这个key的时效比正常的时效要小的多。

3、缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决办法:
1)设置热点数据永远不过期。
2)加互斥锁

0

用户头像
  
博客所属
博主:liuzz | 小鱼儿
个人: 属鼠 水瓶座
故乡:河北 秦皇岛
现居:中国 北京
职业:IT码农
主页:http://www.liuzz.com
喜欢: 看海、台球
我的简历:My Resume
联系博主
369264776
jun-yuhong#163.com
说点什么 ×