穿透,击穿,雪崩

1. 缓存穿透

定义:当查询一个数据库中不存在的数据时,由于该数据在Redis缓存中也不存在(即第一次查询),导致每次这样的请求都会直接访问到底层数据库。这不仅浪费了宝贵的数据库资源,还可能给数据库带来不必要的压力。 解决方法:

  • 布隆过滤器:利用布隆过滤器预先判断某个key是否有可能存在于数据库中,如果布隆过滤器表明该key肯定不存在,则直接返回空结果,避免进一步的数据库查询。

  • 设置无效值:对于确实不存在于数据库中的查询,可以在Redis中存储一个特殊值(如”null”或自定义的字符串)来标记这个情况,并设置一个较短的有效期,这样即使短时间内多次请求相同的非存在键,也不会每次都穿透到后端数据库。

2. 缓存击穿

定义:指某一个热点数据被高并发请求同时访问,在缓存刚好失效的一瞬间,大量请求同时到达数据库,造成数据库瞬时压力激增的情况。 解决方法:

  • 互斥锁/分布式锁:通过加锁机制确保同一时刻只有一个线程能够去加载数据并更新缓存,其他线程则等待锁释放后直接从缓存获取数据。

  • 永不过期策略:对非常重要的热点数据采用永久有效的缓存策略,只有当数据发生变更时才更新缓存内容,从而避免因缓存失效而引发的问题。

3. 缓存雪崩

定义:指在特定时间点内大量的缓存项几乎同时失效或者服务器重启等情况导致所有缓存数据丢失,使得所有请求都直接落到数据库上,造成数据库过载甚至崩溃的现象。 解决方法:

  • 随机化超时时间:为每个缓存项设置不同的过期时间,可以通过添加一定的随机因子来实现,以此分散缓存失效的时间点。

  • 预热缓存:系统启动时主动加载一些预期会成为热点的数据到缓存中,以减少上线初期由于冷启动造成的冲击。

  • 限流与降级:在应用层面实施流量控制措施,比如使用熔断器模式限制单位时间内可处理的最大请求数量;另外还可以考虑在极端情况下执行服务降级策略,优先保证核心功能的可用性。 通过上述措施可以有效缓解Redis缓存穿透、击穿及雪崩带来的负面影响,提高系统的稳定性和响应速度。