Reids 缓存面试常问:击穿、穿透、雪崩、分布式锁、API
2020-12-16 本文已影响0人
云莉6

缓存击穿
-
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
