怎么定位Redis缓存失效问题(缓存坏了)
问题
怎么定位 Redis 缓存失效问题(缓存坏了)?
答案解析
什么是缓存失效
简单来说就是由于各种原因导致的缓存不可用,而让原本应该打在redis的请求,直接打到了数据库上。
为什么会产生缓存失效
缓存失效对应的一般是以下这四个原因:
- 缓存过期
如果缓存不设计过期时间,那么就永久的占据一块内存,所以通常都会为缓存设计过期时间,一旦缓存过期,缓存数据则完全失效。
- 缓存更新
缓存的更新通常采用“淘汰策略”,一般更新完数据库之后,会直接把缓存淘汰掉,这样在下次用户请求中,如果没有在缓存中拿到信息就会去数据库读取,在向数据库读取成功之后,数据库则会反写到 redis。
但是在这个过程中,有一个极短的时间是没有缓存数据的,如果在这个极短的时间内,正好有大量的请求打进来,那么就会直接打到数据库上面。
- Redis 异常
Redis 异常的话,自然请求也是直接全部打到了数据库,而导致数据库崩溃。
- 网络异常
网络异常和 Redis 异常逻辑相同。
如何解决缓存失效问题
针对于由于各种情况可能产生的缓存失效问题,研发是如何解决的?通常有两种方式:
- 降级: 禁用部分接口,开放核心接口。
- 熔断: 禁用部分服务,开放核心服务。
很多同学看到这两种方式可能很难理解,如果禁用部分接口或服务的话,直接导致的问题就是应用的某些功能是不可用的,依然会影响到用户体验。但是其实这个过程,好比一个人被烧伤,他的手臂已经坏死,医生常常也会抛出这样两难的选择,如果不选择切除手臂,那么48小时之后,人就会因为感染而死亡。所以在这种情况下,大部分人都会选择“自断一臂”。
熔断和降级根本目的也是这个,有的用比完全瘫痪强,核心服务可用更比完全瘫痪强。
缓存失效相关的测试点
对于测试来说,除了考虑有哪些原因可能导致缓存失效,我们尽量规避外。还要检查了解到如果真的发生缓存失效的问题,研发是否有对应的解决方案,而不是缓存一失效,系统就瘫痪完全无法使用了。
比如在缓存失效下,可以使用如下的测试步骤,验证降级或者熔断功能的能力:
- 梳理系统中的核心服务列表(通常直接让研发给出对应列表)
- 梳理服务中核心接口列表(通常直接让研发给出对应列表)
- 模拟Redis失效,查看redis失效之后,这些核心服务和核心接口是否还能正常运行
模拟 redis 缓存失效其实比较简单。其中,直接使用命令切断 redis 和服务的网络连接是最简单的方式。比如使用IPTABLES
和 TC
命令。以及阿里云的ChaosBlade
命令工具也可以非常容易的实现。
总结
面试碰到这个问题,可以从以下3个角度进行回答
- Redis 失效是什么?
- Redis 失效的原因是什么?
- Redis 失效研发应该在哪些方面做什么处理,以及测试是如何去测试的进行回答。