预热、雪崩、击穿、穿透(Redis)详细版

缓存预热:

宕机服务器启动后迅速宕机

请求数量较高,主从之前数据吞吐量大,数据同步操作频度高并且刚刚启动,缓存中没有任何数据

解决方式:日常例行统计数据访问记录,统计访问频度较高的数据,将统计结果中的数据分类,根据级别,Redis优先加载级别较高的热点数据。

总的来说缓存预热就是系统启动前,提前将相关的数据直接加载在缓存系统,避免用户访问数据时先访问数据库,再将数据缓存的问题,用户就可以直接访问事先预热在缓存中的数据,效率更高、失误更少。

缓存雪崩:

在同一时段内大量的缓存key同时失效或者服务器宕机,导致大量请求到数据库,带来巨大压力,与缓存击穿的区别是:雪崩是很多key,击穿则是某一个key缓存。

解决方式:

           1、给不同的key的TTL添加随机值

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

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

           4、给业务添加多级缓存

缓存击穿:

对于设置了过期时间的key,缓存在某个时间点过期时恰好这时间有大量的请求这个key,就会给数据库带来巨大的冲击。

解决方式:

1、使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去 设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法

        假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人 去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休 眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。

2、可以设置当前key逻辑过期

        ①:在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前key 设置过期时间

        ②:当查询的时候,从redis取出数据后判断时间是否过期

        ③:如果过期则开通另外一个线程进行数据同步,当前线程正常返回数据

缓存穿透:

查询一条数据库和缓存都没有的数据,就会一直查询数据库,缓存永远都不会失效,给数据库造成巨大压力。

解决方式:

1、缓存空对象

查询返回的结果为空,仍把这个空结果进行缓存,过期时间会很短(代码维护简单,效果不好)

2、布隆过滤器

将所有可能存在的数据哈希到一个足够大的Bitmap中,一个一定不存在的数据会被直接拦截掉,从而避免了对数据库的查询。(代码维护复杂,可能会有哈希冲突,效果好)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿究院懒羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值