一、介绍
当使用缓存系统(如 Redis)作为后端存储来加速应用程序的读取性能时,可能会遇到一些缓存相关的问题,包括缓存击穿、缓存穿透和缓存雪崩。
二、缓存击穿
缓存击穿(Cache Miss and Hot Key Problem):
缓存击穿是指在高并发的情况下,当某个热门数据的缓存失效时,大量请求直接绕过缓存直接访问后端数据库,导致数据库压力激增。这是因为在缓存失效后,当多个请求同时访问某个热门数据,缓存尚未重新生成,这些请求都会落到数据库上,造成数据库压力瞬间增大。
解决办法:
使用互斥锁或分布式锁:在缓存失效的时候,先获取锁,然后再去数据库查询数据,得到数据后,再将数据写入缓存,并释放锁。其他请求在获取到锁之前会等待,避免大量请求同时访问数据库。
设置短期过期时间:缓存数据可以设置短期的过期时间,避免在热门数据失效期间出现缓存击穿。
三、缓存穿透
缓存穿透(Cache Miss and Not Found Problem):
缓存穿透是指查询一个不存在的数据,由于缓存和数据库都没有相应的数据,每次请求都会穿过缓存直接访问数据库,导致数据库压力增大。
解决办法:
使用布隆过滤器(Bloom Filter):布隆过滤器可以在缓存层面对查询的键进行预先判断,如果不存在,则直接返回,避免穿透到数据库。存在误判,因为有hash冲突,即判断存在,其实不存在,但是如果判断不存在那么一定存在。
缓存null:对于查询不存在的数据,也可以在缓存中设置一个空值占位,避免频繁地访问数据库。
四、缓存雪崩
缓存雪崩(Cache Explosion Problem):
缓存雪崩是指在某个时刻,缓存中大量的数据同时过期失效,导致大量的请求都落到数据库上,造成数据库瞬间压力剧增,甚至导致数据库崩溃。
解决办法:
设置随机过期时间:可以在缓存中设置随机的过期时间,避免大量缓存同时失效。
使用多级缓存:可以设置多级缓存,将缓存分为多个层级,当顶层缓存失效时,可以从其他层级的缓存中获取数据,减少对数据库的直接访问。
实时监控:对缓存过期时间和缓存命中率进行实时监控,及时发现问题并采取相应的措施。
五、写在最后
总结:都是高并发的情况下大量请求打到数据库
问题 | 描述 | 解决 |
缓存击穿 | 热点key失效 | 加锁、短期的过期时间 |
缓存穿透 | 查询不存在数据 | 布隆过滤器、缓存null |
缓存雪崩 | 大量缓存同时过期 | 随机过期时间、多级缓存 |
如果你觉得这篇文章对你有帮助,希望能得到你的点赞。这是对作者最好的鼓励哦😍