击穿
描述:
发生击穿的前提一定是产生了大量的并发,并且Redis中数据过期,导致所有请求去数据库查,引起数据库压力瞬间增大
解决方案
1.阻止所有请求都去请求数据库
2.Redis是单进程,单实例,所以可以使用setnx()当做互斥锁
3.避免出现死锁,对锁加个过期时间
4.避免时间过了,但拿到锁的线程还没执行完任务,其他线程又拿到锁也去执行任务,需要再加个线程去监控拿到锁的线程有没有执行完任务,时间过了但没执行完任务就刷新过期时间
穿透
描述
客户端发送的查询请求都是数据库没有的请求,导致服务器浪费大量的资源去处理那些无效的请求
解决方案
可以加一个过滤器过滤掉无效的请求,例如使用布隆过滤器,但布隆过滤器的不能删除已经记录的值,可以使用布谷鸟过滤器
雪崩
描述
击穿是一个数据出现过期,雪崩是大量的数据过期,导致大量的请求到达数据库
解决方案
1.对于时点性不强的数据,让key分散过期时间
2.对于时点性强的数据,例如统一零点过期,在业务逻辑中加延时判断