缓存击穿
key 存在,但正好在过期的时候高并发,使得大量访问压到数据库
使用 setnx() -> 会有锁,第一个获取锁的人会去更新 key,以至于后面的都会 get 到新的 value
-
setnx()
get key
-
setnx
ok, 去 DB 获取
false, sleep
-
问题:
如果第一个挂了怎么办?-> 可以设置锁的过期时间
没挂,但是,锁超时了 -> 多线程:一个线程取 DB,一个线程监控是否取回来,更新锁时间
缓存雪崩
key 存在,在同一时点大量 key 同时失效,使得大量访问压到数据库
如果没有时点性的限制(时点性无关),可以随机过期时间
-
如果时点性有要求
业务层加判断零点延时
强制依赖击穿方案
缓存穿透
key 不存在,在数据库也不存在,使得大量访问压到数据库
-
布隆过滤器
client 实现
算法 bitmap -> redis (无状态)
redis 集成布隆
布隆过滤器只能增加不能删除 key,可以使用布谷鸟过滤器等支持删除的过滤器代替,或做一个空 key
分布式锁
-
步骤
setnx
过期时间
多线程(守护线程)延长过期
redisson
zookeeper 做分布式锁
API
Spring Boot
Spring Data Redis