今天讲点Redis安全相关,同时也是面试中经常会问到的知识点.
**
缓存穿透
**
产生背景: 缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次查询都会穿透到后端数据库查询,使得数据库的压力非常大。
解决方案:
1.接口实现api的限流、防御ddos攻击、网关实现黑名单
2.在数据库和Redis都查询不到的情况下,将数据库的空值写入到缓存中,加上短时间的有效性(只适合单个key,不适合随机产生不同的key,假如过段时间生成的key就是空的key,会影响正常的使用)
3.布隆过滤器
**
缓存击穿
**
产生背景:
在高并发的情况下,当一个缓存key过期时,因为访问该key请求较大,多个请求同时发现缓存过期,因此对多个请求同时数据库查询、同时向Redis写入缓存数据,这样会导致数据库的压力非常大。
解决方案:
1.使用分布式锁技术:多个请求同时只要谁能够获取到锁,谁就能够去数据库查询将数据查询的结果放入Redis中,没有获取到锁的请求先等待;获取到锁的请求将数据写入成功到redis中, 通知没有获取锁的请求直接从Redis获取数据即可 (服务器集群)
2. 本地锁与分布式锁一样的,使用本地锁与分布式锁机制一样,只不过分布式锁适应于服务集群、本地锁仅限于单个服务使用
3. 软过期 对热点key设置无限有效期或者异步延长时间
缓存雪崩
缓存雪崩指缓存服务器重启或者大量的缓存集中在某个时间段失效,突然给数据库产生了巨大的压力,甚至击垮数据库的情况。
解决思路:对不同的数据使用不同的失效时间。
我们应该知道的就是
穿透 :key 不存在情况下
击穿 :单个热点key失效的在并发的查询的情况下
雪崩 :多个key失效的情况下