🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 缓存穿透 >缓存穿透,是指查询一个数据库一定不存在的数据。 解决办法 (1)采用布隆过滤器BloomFilter 将所有可能存在的数据哈 希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力 (2)缓存空值 如果一个查询返回的数据为空(不管是数据不 存在,还是系统故障)我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库 (3)接口限流与熔断、降级 重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。 ## 缓存雪崩 >缓存雪崩,是指在某一个时间段,缓存集中过期失效。 (1)加锁排队 key: whiltList value:1000w个uid 指定setNx whiltList value nullValue mutex互斥锁解决,Redis的SETNX去set一个mutex key, 当操作返回成功时,再进行load db的操作并回设缓存; 否则,就重试整个get缓存的方法 (2) 数据预热 缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key (3) 双层缓存策略 C1为原始缓存,C2为拷贝缓存,C1失效时,可以访问C2,C1缓存失效时间设置为短期,C2设置为长期。 (4) 定时更新缓存策略 失效性要求不高的缓存,容器启动初始化加载,采用定时任务更新或移除缓存, (5)不同过期时间 设置不同的过期时间,让缓存失效的时间点尽量均匀 (6)热点数据永不过期 部分用户访问特别频繁的热点数据,设置永不过期 ## 缓存击穿 缓存击穿是指一个 Key 非常热点,在不停地扛着大量的请求,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发直接落到了数据库上,就在这个 Key 的点上击穿了缓存。 解决办法 1. 互斥锁,并行请求改为串行 2. 热点数据永不过期