缓存穿透
产生原因:大量请求来获取redis中不存在的值,因为redis中不存在所以请求直接打到db上,导致db压力过大宕机
解决方法:
一、采用布隆过滤器
编辑
优点:1、利用哈希映射以bitmap存储数据,时间复杂度O(1)和空间复杂度O(n),假设每个key可以映射1个比特,1MB可以存储800万个key
缺点:1、难以适用于分布式场景,如果需要适用分布式可以把bitmap存储在redis上,但是会增大IO开销
2、不能删除,对于频繁增删改查的场景无法适用
二、实时监控
对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务(拒绝黑客攻击)
- 接口校验
类似于用户权限的拦截,对于id=-3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。
缓存击穿
产生原因:大量请求同时访问一个热点key,此时key过期,请求打到db上
编辑
因为会出现缓存击穿的情况是都是并发量很大,如果给进程上锁,一把锁肯定锁不住,这种情况对性能消耗太大了,所以选择采用分布式锁,但是这时候有可能出现一种情况就是锁上了但是还没执行完成就宕机了,那其他进程就会一直在等待锁的释放,造成资源消耗,这时候需要对锁设置过期时间,但是设置过期时间也会产生问题,因为过期时间是在上锁之后设置的,所以有可能出现一种情况,在Redis上锁之后,还没来得及设置过期时间就宕机了,那其他线程还是在等待。这就考察我们对Redis的熟练性了,客户端在使用 MULTI 开启了一个事务之后,却因为断线而没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。另一方面,如果客户端成功在开启事务之后执行 EXEC ,那么事务中的所有命令都会被执行。
缓存雪崩
缓存雪崩是在平常开发中比较常见的问题,少量并发积少成多最后对数据库造成很大的压力。一般我们的解决方法是在service层设置一个随机的延迟时间,让一部分请求先去db里把数据读出来写入缓存,,其他比较慢的请求可以去Redis里面读数据,与此同时也分散了请求,避免在相同时间打到db上