一、缓存穿透
什么是缓冲穿透?
- 当访问的数据,缓存和数据库都不存在,每次请求都直达数据库,一般为恶意攻击
缓冲穿透解决方法
- 增加参数校验,如请求的id都为负数,可以校验参数大于0
- 对没有的请求,在redis中存储null字符串
- 使用布隆过滤器来筛选请求
二、缓存雪崩
什么是缓冲雪崩?
某一时间大量的key过期,导致请求全部直达数据库
缓冲雪崩解决方法
- key的过期时间增加随机数,使得同一时刻不会有大量key失效
- 增加本地缓存
- 加互斥锁,redis锁或者JVM锁,以key的维度加锁
- 设置缓存不过期,使用定时任务异步更新缓存
三、缓存击穿
什么是缓冲击穿?
- 缓存击穿和缓存雪崩类似,某一时刻,热点key失效,有大量的请求访问该热点数据
缓冲击穿解决方法
- 增加本地缓存
- 加锁:加redis分布式锁或者JVM锁,减小请求,加锁时只对失效的key加锁,避免所有请求都加锁。JVM字符串加锁使用String.intern()
- 设置该热点key永不过期,由定时任务异步更新缓存内容