穿透:查询Redis没有,去查数据库,也没有
常见发生:用户使用postman恶意访问数据库中没有的数据(如-1,超大数)
解决方案:缓存空对象,做判断,布隆过滤器
缓存空对象具体实现:不管有没有,从数据库查出来后都存入Redis,那样除了第一次会查数据库,其他时候都是查空的Redis,记得设置过期。
做判断具体实现:在应用程序中做一个负数,超大数检测过滤。
击穿:查询Redis没有,去查数据库,数据库有
常见发生:某个key持续抗压高并发,过期瞬间多个请求击穿Redis去查询数据库,导致多次存入Redis
解决方案:双重检查锁,永不过期
双重检查锁具体实现:当同时有多个客户端去请求Redis中的数据时,第一个到达的客户端去获得该数据,这时发生击穿,没获取到。那就会去获取lock_key,如果不存在就将lock_key设置为自己的标识,例如client_A。其他客户端到来时也查不到数据,也去获取lock_key,却发现lock_key存在且标识和自己不一样。而client_A发现和自己的一样,那么它就会去拿数据库的数据放进Redis。第一次检查就是去查看lock_key是否存在(不存在就设自己的,存在走开),第二次是验证lock_key和自己是否一致。
永不过期具体实现:字面意思永不过期,但是需要自己选择,一般是将你能预测的热点资源做永不过期,或者设置一个当访问量到达一定数量做永不过期。
雪崩:多个数据一下都过期,相当于多重击穿或者穿透
常见发生:redis中多个数据同时过期,redis嘎了
解决方案:随机过期,做哨兵
随机过期具体实现:给Redis里面设计的key-value加上过期时间,过期时间内加入Duration时间跨度对象,设置随机时间,随机时间自己看着来。
做哨兵具体实现:Redis Sentinel(Redis 哨兵)是一个高可用性解决方案。概括来说就是,设置一个哨兵进程去监控主从Redis的状态,主的嘎了就升级从的顶上去。具体想了解Redis读写主从体系,自己去看看吧!