返回
微观视角浅谈Redis缓存三把斧——缓存穿透、缓存击穿、缓存雪崩
见解分享
2023-10-13 21:38:48
当高并发高需求的业务场景相遇,缓存场景下常见的“穿、击、崩”问题就尤为值得关注。面对这些问题,正确的技术选型和优化方案则成了关键。
剖析“穿、击、崩”
缓存穿透
缓存穿透指的是查询一个根本不存在于缓存和数据库中的数据。由于多数缓存策略属于被动加载类型,且考虑到容错问题,当数据库中找不到目标数据时,缓存层不会做任何存储操作。这就会导致不存在的数据每次查询都要访问数据库,浪费了缓存的存在意义。在大流量场景下,很可能会对数据库造成巨大压力,若未采取有效的保护措施则可能出现问题。
缓存击穿
缓存击穿是指某条数据在缓存中的失效时间点恰好与大量请求同时到来时,都会穿透缓存,直接请求数据库,对数据库造成巨大压力。在高并发场景下,这意味着数据库有极大的可能被瞬时击穿。
缓存雪崩
缓存雪崩是指在某一时刻,大量缓存的key同时失效时,大量请求会同时到达数据库,从而形成所谓的“雪崩”效应,造成数据库不堪重负。当数据库不堪重负时,整个系统便会受到影响。
逐个击破
缓存穿透的应对策略
- 增加缓存层检查 :在缓存中增加一个不存在的标志位,当读取到该标志位时,不再查询数据库,而是直接返回一个默认值。
- 使用布隆过滤器 :布隆过滤器是一种空间高效的概率数据结构,可以用来判断某个元素是否在一个集合中。将所有的key都放入布隆过滤器中,当查询时先查询布隆过滤器,若不存在则直接返回,不再查询数据库。
- 使用键过期策略 :当缓存击穿时,可以设置一个很短的过期时间,这样就可以避免大量的请求同时到达数据库。
缓存击穿的应对策略
- 设置热key永不过期 :对于热门数据,可以设置其永不过期,这样可以避免缓存击穿的发生。
- 使用互斥锁 :当缓存击穿时,可以使用互斥锁来控制对数据库的访问,这样可以避免大量的请求同时到达数据库。
- 使用异步加载 :当缓存击穿时,可以异步加载数据到缓存中,这样可以减少对数据库的压力。
缓存雪崩的应对策略
- 设置缓存失效时间随机值 :不同key的失效时间设置不同,这样可以避免大量的缓存同时失效。
- 预热缓存 :在系统启动时,可以预热缓存,将常用的数据加载到缓存中,这样可以减少缓存雪崩的发生。
- 限流 :在高并发场景下,可以对请求进行限流,这样可以减少对数据库的压力,避免缓存雪崩的发生。
总结
缓存穿透、缓存击穿和缓存雪崩都是高并发场景下常见的缓存问题,若不加以处理,则会对系统稳定性造成极大的威胁。针对这些问题,本文提出了行之有效的应对策略。通过采用这些策略,可以有效地降低这些问题发生的概率,从而保障业务系统的稳定性。