Redis中的缓存雪崩、击穿、穿透的原因以及解决办法

redis的缓存 雪崩 击穿

Redis中的缓存雪崩、击穿、穿透的原因以及解决办法_第1张图片

1.缓存雪崩

	双11访问很大,比如说redis设置缓存时间为3小时,当购物超过3小时之后  首页redis 在一瞬间全部失效,导致所有请求都打在db上.造成db在响应不及时直接就挂掉了
这个时候首页就不能立马对外响应服务了
    redis的key大面积失效 导致前端直接请求db,吧请求都打在了数据库
这种现象就是缓存雪崩,大量的redis缓存在同一时间全部失效
	解决方案 设置缓存失效时间 不要让缓存在同一时刻失效
			在设计缓存的时候 随机初始化失效时间,这样的话就不会让所有的缓存在同一时间失效
			还有就是redis 一般都是集群部署
我们吧这些热点的key,放在不同的节点上,让热点的缓存都平均分配在不同的节点上
3.还有就是 让他永远不失效
4.还有就是跑定时任务,让他永远不失效,比如说我redis 缓存3小时失效,让他在失效之前跑一次定时任务.吧这个redis缓存重新跑进去.然后再设置3小时 不断的用这个定时任务去刷新这个缓存 这个缓存就不会失效
缓存穿透  数据库的主键是从0开始递增的redis 没有数据,查不到这个结果就回去数据库中查询,就会造成请求不断地 打到db中, 因为中间redis这层不能拦截这样的数据
Redis直接让这种数据给穿透了。直接压到db中

Redis中的缓存雪崩、击穿、穿透的原因以及解决办法_第2张图片

redis缓存和数据库都没有这样的数据,比如说恶意数据
缓存穿透的解决方案 请求穿透到redis到达这个db,我db无论查出来什么结果 空
还是非空都放到redis中,这样下次再用同一个参数发请求的时候就会从redis中获取了


第二就是吧这个ip拉黑  但是他会换不同的ip
第三就是对这个参数的合法性进行校验  如果不合法直接就return
第四就是可以采取布隆过滤器
缓存击穿
 大量请求在redis中查询不到数据   这些请求就会全部打在这个db上造成这个db响应不及时 然后挂掉了,这个击穿是针对于某一个热点的key
 当某一热点key突然失效,吧请求打在这个db上  这个就叫做缓存击穿

缓存击穿的解决方案
 让缓存永远不过期
 2. 使用分布式锁 如果是单体项目的时候可以使用互斥锁

大量用户访问redis 请求数据 ,如果有的话就返回给用户 如果redis中数据为空的话
他就会先请求数据库去请求数据
我们就在请求数据库这一步给他加上锁

这个时候只有一个线程 能强到锁  所以有一个线程能操作db
这个时候对db的压力就很小
当他查询到这个数据之后在吧这个缓存重新写道redis中

其他没有抢到锁子的线程让他先sleep几毫秒 然后再重新去redis中去拿数据
因为我们已经有一个线程抢到这个锁了,把这个数据库里面 的数据放到redis中了
呢么其他线程 再访问redis的时候就可以获取到锁了
这个是解决缓存击穿最好的实现

Redis中的缓存雪崩、击穿、穿透的原因以及解决办法_第3张图片

缓存雪崩是指 大量的缓存key 在同一时间大量的失效
缓存穿透 是指redis中没有你要的数据 他直接穿过你这个redis 到这个数据库了
缓存击穿 是指热点key 大量用户去请求这个热点key 当这个热点key突然失效的时候
我们一个项目可以分为3个阶段
 上线前准备  我们可以搭建集群来保证我们系统的健壮性 比如说mysql 集群 redis集群 还有我们项目本身的分布式集群  
项目运行中的一些准备  我们可以采用限流降级措施 防止大量请求打在数据库上	 造成数据不可用
项目宕机之后的一些 处理措施
1.我们可以采用普罗米修斯报警系统 第一时间发邮件告知开发人员
2.第一时间重启我们的项目
3.利用redisde rdb以及aof持久化机制  去快速回复redis的数据
最大限度的来减少我们的	系统不可用的时间

你可能感兴趣的:(缓存,redis,数据库)