redis(5、缓存雪崩、击穿与穿透)

缓存雪崩

什么是缓存雪崩

大量数据在同一时间过期(或者redis崩了),导致这一时间段里,很多数据都在redis中获取不到,所有的查询都走数据库;

如何解决缓存雪崩

不要把大量的数据放到同一时间过期,在原有的过期时间上,再加一个短时间的随机过期时间;

项目中遇到的问题

本人在做账号权限点缓存的时候,会把用户的账号作为key,权限作为value进行存储;过期时间是8小时;这样就会有一个问题,每天早上的时候所有用户的权限点缓存都会失效,这样导致每天早上服务器的压力都会很大;
解决方案: 最后是加了一种缓存方式,每个人都会绑定角色,然后角色绑定的权限点;一个系统人员的角色数量是不会很多的,以角色作为key进行权限点缓存(不会失效,角色变更权限点的时候会更新),这样虽然早上的时候,账号的权限的缓存会失效,但是他在重新生成权限点的时候,还是走的redis;

缓存击穿

什么是缓存击穿

对于被高频访问的key而言,在改key失效的之后到该key的值被重新插入redis之前,如果存在大量的请求,那么所有的访问都会走数据库,这时候就会产生缓存击穿;

如何解决缓存击穿

  1. 对于高频key,我们可以采取不设置过期时间的方式,该key永久在redis中;就不会有缓存击穿的场景;
  2. 使用互斥锁

使用互斥锁解决缓存击穿

  1. 设置redis过期时间的情况
    在这里插入图片描述
    这样会有一个问题,就是线程在获取不到锁的情况下会一直等待,会影响系统性能;
  2. 不设置redis过期时间(永久生效),在业务中冗余过期时间字段,在代码中判断其是否过期
    在这里插入图片描述
    这样做的一个好处是不会阻塞线程,用逻辑判断是否过期,过期了启动子线程去更新redis;

缓存穿透

什么是缓存穿透

大量的请求进入,都没有命中redis中的key(请求的key都是redis中没有的);
什么情况下会出现这种情况呢?

  1. 恶意攻击
  2. 就是没有数据,key对应的数据就是null

怎么处理缓存穿透

  1. 缓存空值或缺省值
  2. 使用布隆过滤器
    使用布隆过滤器要注意的点是:
  • 每次都需要先把所有的key加载到布隆过滤器中,每次新保存rediskey都需要往布隆过滤器中塞值;
  • 布隆过滤器只能添加数据,不能删除数据,时间长了会导致误判率会很高;因此每过一段时间都要重新初始化一次布隆过滤器;

总结

问题原因解决方法
缓存雪崩大量数据过期或Redis服务器宕机1. 随机过期时间 2. 主从+哨兵的集群
缓存击穿热点数据过期1. 不设置过期时间 2. 加互斥锁 3. 冗余逻辑过期时间
缓存穿透请求数据库和Redis都没有的数据1. 缓存空值或缺省值 2. 布隆过滤器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值