栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

Redis缓存击穿、穿透、雪崩以及分布式锁

Java 更新时间:发布时间: 百科书网 趣学号

Redis缓存击穿、穿透、雪崩以及分布式锁

文章目录
  • 缓存击穿
  • 缓存穿透
  • 雪崩
  • 分布式锁


缓存击穿

首先明确一点,redis作为缓存时,key会过期。访问redis的时候,刚刚redis的key过期了,这个时候redis作为缓存没有该数据,那么会请求数据库了(曾经有,但现在没有key了)。这种情况前置式肯定发生了高并发,且过期了。同时有很大流量压过去了,会造成大量并发访问数据库。

解决方案:
并发有了,需要阻止并发到达DB,但是redis又没有key,又因为redis是单进程单实例的(所有并发请求都是排队进来的)。第一个发现没有key的时候,用setnx(只有不存在的才能设置,约等于一把锁),增加一个逻辑,所有的请求发现key不存在,都需要抢setnx这把锁。只有第一个人抢到,那么设置锁成功,第一个请求访问数据库。

但是这样的解决方案有个问题,如果第一个请求挂了,怎么办?设置setnx锁的过期时间。但是此时如果时间过期了,没挂,但是锁超时了,怎么办?用多线程,一个线程取DB,一个线程监控。

缓存穿透


穿透是从业务接受查询的是系统根本不存在的数据。

解决方案:
布隆过滤器。
布隆过滤器有三种方案,
第一种:客户端包含bitmap与算法
第二种:客户端包含算法,bitmap放在redis中。使服务是无状态的,只有算法。
第三种:redis集成布隆模块。(客户端简单一些)
但是布隆过滤器有问题:只能增加不能删除。
可以换一个过滤器,布谷鸟,或者做一个空key
有关布隆过滤器,这里布隆过滤器

雪崩


大量的key同时失效(要么一些key同时到期,自己设置0点,会造成大量的访问到达数据库),并不是特别极端某一个key压过去了(击穿)。
解决方案:
到某一个时间就过期 2…还有一个就是时点性无关。
如果时点性有关,那么用强依赖击穿方案,如果知道某一点所有都会变,那么可以在业务层的设置0点延时。
如果时点性无关,随即过期时间。

分布式锁

如果用redis做分布式锁,用setnx + 过期时间 + 多线程(延长过期时间)
也可以用redisson工具,当然不常用,一般用zookeeper,最常用了。用分布式锁了,则代表不要求效率特别高,要求准确度和一致性特别强。(参照击穿)

面试时,可以从这里抛出zookeeper。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/956895.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号