一 缓存穿透
缓存与数据库中都没有的数据,同一时间大量请求涌入造成DB压力
- 缓存空对象
redisTemplate.opsForValue().set(key, null, 30, TimeUnit.SECONDS);
缺点:如果大量key穿透,占用内存空间; 缓存null期间如果数据库有了key数据,会造成数据不一致
- 布隆过滤器 - 位数组+k个哈希函数的数据结构,数据通过k个哈希函数定位到位数组的k个点,如果这k个点都为1,那么数据存在,如果有一个是0,那么数据不存在
优点:节约空间; 时间复杂度低;
缺点:准确率有误; 不能删除元素;
二 缓存击穿
某个热点key在失效瞬间大量请求涌入造成DB压力
- 不失效 - 如果需要更新起线程异步更新
缺点:无法保证数据一致性
- 互斥锁/分布式锁 - 如果需要更新一个线程做更新其它线程等待
缺点:吞吐量降低
三 缓存雪崩
类缓存击穿,大量热点key失效
- 不失效
- 互斥锁/分布式锁
- 设置不同失效时间
redisTemplate.opsForValue().set(Key, value, time + Math.random() * 1000, TimeUnit.SECONDS);
四 缓存预热
- 数据量小,不需要预热
- 数据量不大,系统启动加载缓存
- 数据量大,定时任务加载缓存
- 数据量超大,优先热点key加载缓存
五 缓存降级
可以将部分热点数据缓存到服务内存,类似HashMap、Guava这样的;