缓存穿透
描述:客户端请求数据库/缓存中都不存在的数据,导致每一次请求都要查询数据库,增加数据库压力。
解决: 热点数据预加载并使用布隆过滤器、缓存空对象
缓存击穿
描述: 缓存数据过期的时候,突然产生大量查询请求,导致多次重复查询数据库,增大访问压力
解决: 使用锁来限制请求次数
缓存雪崩
描述:由于宕机或过期导致大量缓存集体失效,导致出现大量的查询数据库请求,可能造成数据库崩溃
解决:
1.热点数据过期时间不要统一,均匀分布
2.做二级缓存,A1、A2,A1过期时间短,A2过期时间长,A1失效查A2
3.使用锁来限制请求次数
4.分布式情况下、均匀分布热点数据
单机锁
setnx、setex
使用jvm提供的Lock
设置过期时间
每个任务开一个守护线程续期/创建UUID存放在ThreadLocal,通过UUID来判断用lua解锁
分布式锁
redisson
存在的问题:如果master加了锁,这时候没来得及同步给slave,master宕机了,就会导致有两个客户端获取锁,可以尝试使用多把锁,有多少个master就申请多少把锁,这些所应该均匀分布到master
Lua解锁模板
if redis.call("get",KEYS[1])==ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end