持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
企业级解决方案
下面介绍一些企业中常用的redis解决方案,这也是一些岗位面试的重点。
缓存预热
缓存预热指的是在系统启动前,提前将相关的缓存数据直接加载到缓存系统,避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,这样用户就可以直接查询到事先被预热的缓存数据。
比如日常例行统计数据访问记录,统计出访问频度较高的热点数据,并将统计结果中的数据分类,根据级别,让redis优先加载级别较高的热点数据,一般使用脚本程序来固定触发数据预热过程。
缓存雪崩
缓存在同一时间大面积的失效,导致请求直接落到了数据库上,造成数据库短时间内承受大量请求,很有可能导致数据库直接崩溃。
亦或者一些热点数据在某一时刻大面积失效,导致对应的请求直接落到了数据库上也导致数据库直接崩溃。
解决办法:
- 构建多级缓存的架构
- 优化数据库 耗时的业务
- 监控redis服务性能指标
- 对服务进行限流、降级
对于热点数据在某一时刻大面积失效的情况,我们可以为这些数据设置不同的失效时间,比如给它们随机设置失效时间,那么就不会出现数据大面积失效的情况了。
缓存击穿
缓存击穿与缓存雪崩非常类似,也是因为大量的请求落到了数据库上导致数据库崩溃,但不同的是,缓存雪崩是大量缓存数据同时失效导致大量的请求落到了数据库;而缓存击穿通常指并发访问同一条数据,解决方案也与缓存雪崩大体相同。
缓存穿透
缓存穿透指的是用户查询的数据在缓存中没有,在数据库中也没有,如发起id等于-1或者id等于非常大的值的请求,这些数据肯定是不存在的,这个时候的用户很有可能是网站的攻击者,这样的攻击请求会导致数据库压力过大进而崩溃。
解决方案:
- 增加校验逻辑,如检验id是否合法
- 当数据从缓存和数据库中都未获取到时,将key的value值写为null,这样可以防止攻击者反复使用一个id进行攻击