×

redis缓存雪崩 缓存

redis缓存雪崩(如何优化缓存中百万级并发的KEY)

admin admin 发表于2023-07-07 08:12:51 浏览37 评论0

抢沙发发表评论

本文目录

如何优化缓存中百万级并发的KEY

如何优化缓存中百万级并发的KEY,其实就是如何应对缓存中的热key问题,也是面试中大家经常被问到的一道面试题。大家在网上可以搜索“redis热key问题”便可以看到很多关于这方面的解答。

下面我个人对这个问题的解答方案,大家可以参考一下,也欢迎大家给与批评指正。

问题背景

我们正常使用redis,最简单的方案就是先从redis查询某个key,key不在的时候就去数据库查询,数据库查询到数据后,返回的同时将数据加载到redis中,下次同样的访问请求直接从redis获取就可以了,请求流程图如下:

这样的方式在量不大的时候都没有问题,但是如果量大了就有问题了,潜在的问题有:

  • 缓存穿透:redis不存在,数据库也没有,每次请求都走数据库了,数据库承载所有请求压力,严重导致数据库宕机。

  • 缓存雪崩:同一个时间段内,大量缓存过期,导致所有请求同时怼到db上,db无法承载,导致宕机。

  • redis热key问题:大量请求都只请求一个特定的key,导致单台redis流量承载超过带宽上限和I/O负载极限,最终导致redis无法响应,redis无法响应会直接导致所有请求失败或者请求到数据库服务器,最终数据库宕机。

如何发现热点key

这个其实还是比较简单的,大家都能想到一些方案,比如有的业务天生就带有高并发属性,那么你在做方案设计的时候就要考虑热点key的问题,比如商品的秒杀业务。

研发资源比较充足的公司通常都会做一套健全的机制去发现热key,发现之后再根据热key的等级做相应的处理方案。大家也可以自己想想,如果让你来设计这个热key发现机制你会用什么方案?

aop统计、nginx网关统计、实时计算统计--》告警--》处理方案

解决方案

了解到了问题产生的原因和背景之后,相信大家或多或少都有一些自己的解决方案,我主推:

JVM缓存:直接将redis的热key加载的jvm内存中,多台集群服务器下,每台服务器都会有这个内存缓存,只要服务器能承载住所有请求,这个热key就没问题。这种方案最简单!最直接!最有效!

当然这会有一些问题,比如缓存的一致性无法保证,需要看具体的业务场景考虑是否适合使用,或者自己开发一套满足缓存数据一致性的机制。

如果jvm缓存都不能满足你的业务量请求,那么这是不存在的!

现成的方案:《有赞透明多级缓存解决方案(TMC)》

链接:https://segmentfault.com/a/1190000017142556#articleHeader4

用了Redis之后,项目是不是就不惧怕高并发查询了

Redis是高并发系统常用工具,但并不是高并发系统的全部,只能说Redis是高并发系统的重要一个环节。我们从高并发系统设计思想出发,设计高并发系统。

1 减少请求数量

每次请求都涉及到网络传输需要耗时,将多次请求合并为一次可以减少网络传输。例如网站一般都使用了JS代码,尤其分模块开发时会有很多不同的JS文件,打开首页时需要请求很多次,所以将JS文件合并减少请求发送是一种好办法。

2 提升处理能力

将应用横向拆分或者纵向拆分再分别部署,可以增加处理能力,原来一台服务器做的事情,分给多台服务器来做,应用也可能从原来单体应用变为分布式应用。

3 提升处理性能

提升性能的手段有很多,例如异步化处理,并行化处理,使用更好的存储介质,使用缓存。Redis能力就是在这个环节得到体现。

4 高可用性

在提升系统能力同时,系统高可用性我们也要重点考虑,因为流量过大可能会造成例如缓存击穿和系统雪崩等严重问题,我们要做好降级,熔断,限流,备份等工作。

敬请关注

请点击关注按钮【IT徐胖子】会持续为大家奉献互联网和技术干货内容,感谢支持