本文目录
如何优化缓存中百万级并发的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之后,项目是不是就不惧怕高并发查询了
1 减少请求数量
2 提升处理能力
3 提升处理性能
4 高可用性
在提升系统能力同时,系统高可用性我们也要重点考虑,因为流量过大可能会造成例如缓存击穿和系统雪崩等严重问题,我们要做好降级,熔断,限流,备份等工作。
敬请关注
请点击关注按钮【IT徐胖子】会持续为大家奉献互联网和技术干货内容,感谢支持