缓存击穿是指在高并发的情况下,某个热点key突然失效或者未被缓存,导致大量请求直接穿透到后端数据库,从而使得数据库负载过高,甚至崩溃的问题。这种情况通常发生在缓存中的热点数据过期或失效时,由于并发用户特别多,同时读缓存没读到数据,又同时去数据库中取数据,引起数据库压力瞬间增大。
缓存击穿与缓存雪崩不同,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。缓存击穿的解决方案可以考虑以下两种:
设置热点数据永远不过期。从缓存层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。但是这种方式需要谨慎使用,因为对于一些需要定期更新的数据来说,如果不设置过期时间,就可能导致数据的实时性受到影响。
加互斥锁或使用分布式锁。当缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某个机制,比如Redis的SETNX或者Redlock分布式锁去set一个mutex key,当操作返回成功时,再去load db并放入缓存;否则,就重试整个get缓存的方法。这种方式虽然可以避免大量请求直接打到数据库,但是会带来一定的性能损耗,并且需要处理好锁的粒度和过期时间等问题。
除了以上两种解决方案外,还可以考虑使用逻辑过期的方式来处理缓存击穿问题。逻辑过期是指将过期时间字段与数据一起存入缓存,在查询数据时根据过期时间判断数据是否过期。如果数据已经过期,则开启另一个异步线程更新缓存数据,当前线程正常返回过期数据。这种方式适用于对强一致性要求不高的场景。
另外,针对缓存击穿问题还可以从预防的角度进行考虑。例如可以定期更新缓存中的数据以避免数据过期;可以监控缓存和数据库的性能指标以及时发现并处理问题;还可以对请求进行限流和降级等操作以保证系统的稳定性和可用性。
总之,缓存击穿是分布式系统中常见的问题之一,需要采取合适的措施进行预防和处理以保证系统的正常运行。
以下是几个解决缓存击穿的案例:
案例一:使用互斥锁
在一个电商平台中,假设商品信息是被频繁请求的数据。当某个热门商品的缓存过期或被意外删除时,如果恰好遇到高并发的情况,大量的用户请求会同时穿透到数据库,导致数据库负载急剧增加。
解决方案:
平台可以在缓存失效的时候采用互斥锁的策略。具体来说,当第一个请求发现缓存失效时,它会获取一个互斥锁,然后独自去数据库查询数据。在这个过程中,其他并发的请求会由于无法获取互斥锁而被阻塞或者进入等待状态。当第一个请求成功从数据库查询到数据并更新到缓存后,它会释放互斥锁。此时,其他等待的请求可以重新查询缓存,由于缓存已经被更新,所以它们可以直接从缓存中获取数据,而不需要再次查询数据库。
案例二:设置热点数据永不过期
在一个新闻应用中,某些热门新闻可能会在短时间内被大量用户访问。如果这些热门新闻的缓存设置了过期时间,并且在过期时间点上恰好遇到高并发访问,那么就可能发生缓存击穿。
解决方案:
为了避免这种情况,应用可以将这些热门新闻设置为永不过期。这样即使在高并发的情况下,用户请求也可以直接从缓存中获取数据,而不需要穿透到数据库。当然,这种策略需要谨慎使用,因为对于需要实时更新的数据来说,设置为永不过期可能会导致数据的实时性受到影响。
案例三:使用布隆过滤器
在某些场景中,攻击者可能会通过频繁请求不存在的数据来导致缓存击穿,从而给数据库带来巨大压力。为了避免这种情况,可以使用布隆过滤器来预先判断请求的数据是否存在。
解决方案:
布隆过滤器是一种空间效率极高的概率型数据结构,它利用位数组和哈希函数来判断一个元素是否在集合中。在缓存之前设置布隆过滤器,将所有已存在的数据ID存储在布隆过滤器中。当请求到来时,先通过布隆过滤器判断请求的数据是否存在。如果布隆过滤器判断数据不存在,则直接返回空结果,避免无效的数据库查询;如果布隆过滤器判断数据可能存在,则进一步查询缓存或数据库。需要注意的是,由于布隆过滤器的特性,它可能会存在误判的情况,即判断某些实际不存在的数据为存在。因此,在使用布隆过滤器时需要权衡误判率和空间效率之间的关系。
这些案例展示了如何通过不同的策略和技术来解决缓存击穿问题。在实际应用中,需要根据具体的业务场景和需求来选择合适的解决方案。
缓存击穿问题解释 .zip
需积分: 5 153 浏览量
2024-03-07
09:38:47
上传
评论
收藏 2KB ZIP 举报
琛哥的程序
- 粉丝: 1116
- 资源: 2642
最新资源
- 适用于tensorflow-2.11.0 CUDA版本11.2的cuDNN8.1版本
- 5Y study学习平台2016计算机基础-综合测试(8)_哔哩哔哩_bilibili_2580252704.mp4
- (大赛作品)STM32实现的F072RB NUCLEO智能家居控制.zip
- STM32实现的数字示波器源码+数字信号处理教程、配套实例.zip
- 【cookie续续】【cookie续续】【cookie续续】
- 低功耗STM32实现的F411开发板(原理图+PCB源文件+官方例程+驱动等).zip
- 基于stm32实现的 nucleo-L476的智能灯(操作说明+源码).zip
- 基于STM32实现的 NUCLEO板设计彩色LED照明灯(纯cubeMX开发).zip
- 基于STM32实现的 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).zip
- 基于STM32实现的 人群定位、调速智能风扇设计(程序、设计报告、视频演示).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈