数据过期删除策略
Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用
定期删除
每隔一段时间,对部分key进行检查,删除过期的key
惰性删除
key到过期时间后,不做任何操作,下次用到key时,再检查是否过期;过期则删除;没过期则返回
优点 :使用的时候再去检查是否过期,可以减少key过期检查的次数,节约CPU资源
缺点 :如果key已经过期,但是一直没使用,key会一直占用内存中;随着数量越来越多,会耗费内存资源
布隆过滤器
防止缓存穿透的方案
大量请求中key不存在时(如:恶意攻击)
方案1.到redis没找到,去数据找也没找到,将null作为key的值存入redis中,防止相同的key再请求时,redis就能返回(当无效key非常多时,会占用大量内存)
方案2.使用布隆过滤器,将数据库中的key的哈希值放入二进制向量表(1表示存在),当数据请求时,先用布隆过滤判断数据库中是否存在key,不存在则直接返回
防止缓存雪崩的方案
当缓存中的大量key在同时过期/redis服务器宕机,会有大量请求到达数据库,会压垮数据库。
缓存雪崩的解决方案:
key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的过期时间均匀分布
用队列或者锁的方式去数据库查询,控制去数据库查询的线程数量,降低并发
热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景。
双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。
构建缓存高可用集群(针对缓存服务故障情况)。
当缓存雪崩发生时,服务熔断、限流、降级等措施保障。