redis中的缓存穿透、缓存雪崩、缓存击穿

最近做了一个电商的平台的项目,在涉及高并发的时候碰到了很多的问题,于是我做了一些总结。
1.缓存雪崩:
(1)大量的缓存在同一时间失效,导致大量的请求去访问数据库,就造成了缓存雪崩
解决方法:
1.尽量的平均分配存入缓存的有效时间,使它不会在同一时间内,出现大面积的缓存失效。
2.我们一般稍微大一点的项目用的都是redis集群部署,我们就可以把一些热点的key平均放到不同的节点上去,就可以分担我们单个节点的压力。
3.最后就是一个比较暴力的方法:就是不设置redis的失效时间,让它永远不失效
4.用一个定时任务去刷缓存,比如说我们设置的缓存的时间为3小时,我们就可以做一个定时任务不断地去刷新这个缓存,就可以一直给它设置3小时的失效时间。

2.缓存穿透:
(1)一般出现缓存穿透都不是正常的用户,都是一些恶意的用户,或者一些网络黑客的攻击,比如说我们数据库中的主键一般都是从1开始的,那么这个黑客,就会发送一个主键为负数的请求,这样我们redis和数据库中都是没有这个数据的,这个黑客就会不断的发送这个请求,给我们的数据库造成巨大的压力,甚至造成缓存雪崩。

解决方法:
1.我们可以使用布隆过滤器,来过滤掉一些非法的请求
2.就算黑客发送了一个没有的参数,无论数据库是否可以查到值,也就是说,无论是null还是有值,我们都会把结果放到redis中,这样这个黑客下次用这个参数来访问的时候,就不会造成缓存穿透了。但是这样会造成一个问题,黑客可能会换一个参数来进行攻击。
3.我们可以检测这个IP,并将这个ip拉黑,但是当我们拉黑的时候,黑客也可能会换个ip来进行攻击。
4.我们可以对访问的参数进行校验,当这个参数不合法的时候,我们就直接return掉,不会执行这个请求。

3.缓存击穿
我们可以举一个例子,比如双十一的时候,我们马爸爸在淘宝上拍卖他的拖鞋,有个程序员把这个拖鞋的数据存到了redis中,设置了有效时间为4个小时,但是4个小时后这个鞋子还没有被拍卖出去,这个时候reids缓存失效了,就会有大量的用户请求访问数据库,当数据库无法承载如此巨大的访问量,就挂了。总结来说缓存击穿一般会出现在高并发的时候。

解决方法:
1.我们可以把redis设置成永久不会失效(不是最优解)
2.使用分布式锁:当大量的请求在redis中找不到数据的时候,就会去访问数据库。我们就可以在这个一步,在数据库中加锁,这样访问数据库的就只有一个线程,对数据库的压力会非常的小,当我们这个线程在数据库中查询到数据的时候,就把数据重新写到redis里面,而其它的线程,我们就可以把它们睡眠,最后让这些线程,重新去访问redis。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值