缓存击穿:某个数据,数据库有,但是缓存中没有,因而大量并发请求打到数据库上,就像被击穿了一样
通过事务获取锁在Redis事务(multi)中,通过setIfAbsent获取锁和设置锁过期时间, 然后exec
获取锁的线程,查询数据库并将数据存入缓存。
在此过程中,通过多线程监控锁过期时间,以及时更新锁过期时间,确保在数据写入Redis缓存之前锁不被释放
缓存雪崩:大量的key在缓存中不存在
两种解决方法:一般情况下,让key的失效时间错开。或者在服务端随机的延迟响应
缓存穿透: 访问的数据在数据库中不存在
可以使用bloomfilter+bitmap将key映射为一个bit,用bitmap存储所有的key值,然后使用bloomfilter过滤掉bitmap中不存在的key的访问请求
引入guava依赖以使用布隆算法
com.google.guava
guava
29.0-jre
//bloomfilter,用于处理缓存穿透问题
BloomFilter filter=BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8),10000000,0.00001);