redis缓存问题与其应用场景

在这里插入图片描述
缓存雪崩:
指的是当许多用户发出请求时,这时redis中大量缓存数据同时失效(过期)或者是redis故障宕机了,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩问题
两个原因:
1.大量数据同时过期
2.redis故障宕机

针对大量数据同时过期二引发的缓存雪崩问题,常见的应对方法有下面这几种:

1.预防为主
1.对于服务不可访问来说
想要一个高可用的服务,首先我们就要集群使用,即使有redis挂了,依然有其他的redis可以过来提供服务,当然最好就是使用redis cluster集群,多个redis master,不仅有主备服务可以在故障时进行切换,即使真的主备都挂了,那也只是一部分数据不能提供服务了,还有其他的master可以给其他提供服务,尽量的减少redis宕机所带来的影响	
2.对于大量key同时失效来说
最主要的,就是分散key的失效时间,比如说在插入redis缓存的时候,指定key的失效时间为在一段范围区间内的随机值
2.降低发生时所造成的危害性

预防只是减少其发生的概率,不代表它就不会发生,如果仍然发生了缓存雪崩的情况,那么我们就应该有一套解决方案,来尽量减少缓存雪崩带来的危害:

1.防止mysql承受不住瞬间的高流量而宕机
	对于这种情况来说,那就是限制其流量,防止短时间内mysql的流量暴增,简称就是限流,在SpringCloud中,可以使用Hystrix来进行限流,将调用mysql的接口隔离起来,
	因为Hystrix可以指定调用这个接口所能承受的最大线程数,所以即使有大量的请求过来了,假设设置它的最大线程数为30,而一次数据库操作如果算100ms的话,那么它一秒钟就最多只能处理300的请求数量,这样就达到了限流的目的了。
2.防止耗尽线程资源,导致该服务甚至整个系统崩溃
	由于缓存雪崩,大量的请求在缓存层获取不到数据,就会去调用查询数据库的接口,而由于数据库操作较慢,如果大量线程都在这里等待着不能及时返回,就很容易把线程资源全都用光,然后上游服务也在等这个服务返回,也直接将线程资源用完,所以现在就能体现出Hystrix的重要性了,它可以设置一个fallback降级服务,当请求数量大于最大线程数+等待数量时,就会直接采用fallback机制快速返回。
	或者是在redis宕机的情况下,还能直接启用熔断,请求一过来就直接fallback返回。
这里不仅要在mysql上,在其他服务在调用这个服务的时候也都需要用,这样使用资源隔离+熔断+快速返回的机制就能够完美解				决这个问题了。

事后的解决方案

如果发生缓存雪崩是因为redis宕机了,这样的话

1.我们就需要让redis通过备份的RDB文件或者AOF文件迅速恢复重启,尽快提供服务。
2.或者如果说数据丢失了访问不到了,那么就要进行缓存预热后再提供服务,防止重启后再次发生缓存雪崩。

缓存穿透

描述:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:

1.接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,
如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿

描述:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:
设置热点数据永远不过期。
加互斥锁,互斥锁

redis的应用场景

(1)缓存
毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效; 一些频繁被访问的数据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很大,而放在redis中, 因为redis 是放在内存中的可以很高效的访问。

(2)排行榜
在使用传统的关系型数据库(mysql oracle 等)来做这个事儿,非常的麻烦,而利用Redis的SortSet(有序集合) 数据结构能够简单的搞定;

(3)计算器/限速器
Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读 写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防 止用户疯狂点击带来不必要的压力;

(4)好友关系
利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能。

(5)简单消息队列
除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的 需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;
(6)消息队列
Redis 中list的数据结构实现是双向链表,所以可以非常便捷的应用于消息队列(生产者 / 消费者模型)。消息的生产者只需要通过lpush将消息放入 list,消费者便可以通过rpop取出该消息,并且可以保证消息的有序性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值