穿透
请求一个不存在的数据,也就是缓存和数据库都查不到这个数据,每次都会去数据库查询,这种查询不存在的数据就是穿透.
- 问题
- 如果每次都拿一个不存在的id去查询数据库,可能会导致你的数据库压力增大
- 解决
- 缓存空值,一定时间后过期,比如5分钟
- 布隆过滤器:把所有有数据的key都放入布隆中,每次查询都去布隆判断,没有则直接返回null
- 注意BloomFilter没有删除操作(删除很困难),对于删除的key,查询就会经过BloomFilter然后查询缓存再查询数据库,所以BloomFilter可以结合缓存空值用,对于删除的key,可以在缓存中缓存null
击穿
高并发时候,大量请求请求同一个key,这个时候正好key过期,则同一时间,这些请求都去查询数据库
- 问题
- 造成某个时刻数据库请求过大
- 解决
- 对于一个key,只有第一个线程去请求数据库,然后插入缓存
雪崩
某个时刻大规模的缓存失效,比如缓存服务器宕机
- 解决:
- 设置不同的失效时间
- 永不失效