缓存雪崩、穿透、预热、更新和降级汇总

3 篇文章 0 订阅
1 篇文章 0 订阅

一、缓存雪崩


1、现象描述
        缓存雪崩可以理解为:由于原有缓存失效(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询后端数据库了,而对数据库CPU和内存造成了巨大压力,严重者会导致数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。


 2、解决办法

  • 设置不同的过期时间:在保存缓存时,给每个缓存设置一个随机时间权重,设置成不同的有效时间,从而保证缓存不会在同一时刻出现大面积失效的情况。
  •  设置查询加锁:即在缓存过期后,在查询后台数据库时进行加锁处理,只有第一个获取锁的请求调用后端数据库,而其他请求继续等待,等第一个请求查询数据库,更新缓存后再从缓存中获取数据。           

二、缓存穿透

 1、现象描述

         缓存穿透是指用户查询的数据,在数据库中根本不存在,从而缓存中也不会存在。这样就导致用户查询的时候,在缓存中查找不到,每次都是去到数据库中查找一遍,然后返回空。这样每次请求都是直接绕缓存查询数据库。这个可以使用不存在的key请求数据库造成数据库的压力增加,甚至导致宕机。

 2、解决办法

  • 布隆过滤:将所有可能存在的数据哈希到一个足够打的bitmap中,一个一定不存在的数据就会被bitmap拦截掉,从而避免对数据库造成压力。

  • 存储默认值或null:这是一种简单粗暴的方法,当查询的数据不存在时,也在缓存中缓存一份,只不过缓存的值为默认值或者null,设置一个合理的过期时间,当下次查询时,就可以直接从缓存中获取。

三、缓存预热

1、描述

缓存预热是指在系统上线后,将相关数据直接加载到缓存系统中。这样可以避免在用户请求时,先去查询数据库,然后在存入缓存所造成的问题。

2、解决办法

  • 开发一个缓存刷新页面,在服务上线启动完成后,有运维人员手动刷新一次缓存。
  • 启动时直接加载,如果缓存的数据量不是太大,开始在服务启动时就查询数据库把数据存入缓存中。
  • 定时刷新,即开发一个定时任务,有系统定时查询数据库更新缓存。

四、缓存更新

1、描述

缓存更新是在当前端请求为更新数据库时,如何更新缓存中的数据。

2、解决办法

参考:https://www.cnblogs.com/cjsblog/p/10752245.html

五、缓存降级

1、描述

缓存降级是当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务可用,即使是有损服务。降级的目的是保证核心服务的可用,即使是有损的。

2、解决办法

可用参考日志级别的设置方案,根不同的级别设置不同的降级策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值