Redis的缓存过期策略主要包括惰性删除和定期删除两种机制。惰性删除是指在访问键时检查其是否过期,如果过期则删除;定期删除则是Redis每隔一段时间扫描部分键并删除过期的键。关键字段有EXPIRE、SETEX、EX、PX等,用于设置过期时间。时间管理技巧:使用随机过期时间避免缓存雪崩,结合内存淘汰策略如LRU、LFU;对于热点数据延长TTL,对于冷数据缩短TTL;通过脚本批量管理过期时间,避免集中过期。
惰性删除与定期删除
Redis的过期策略分为惰性删除和定期删除两种。惰性删除是指访问一个key时,才会去判断该key是否过期,过期了就删除,返回null。定期删除是指redis默认每隔100ms就随机抽取20个key进行过期检查,如果key过期就删除。Redis不止一次定期删除任务,会有多个redis进程参与定期删除任务。
关键字段详解
EXPIRE key seconds:为key设置秒级过期时间。SETEX key seconds value:设置key的同时设置秒级过期时间。EXPIREAT key timestamp:为key设置过期时间(时间戳)。PX key milliseconds:为key设置毫秒级过期时间。PEXPIREAT key milliseconds-timestamp:为key设置毫秒级过期时间(时间戳)。
时间管理技巧
1. 随机化TTL:为相同类型的key设置略有不同的过期时间,避免雪崩。2. 懒加载+缓存预热:热点数据提前加载。3. 分层缓存:多级缓存,L1快速失效,L2持久。4. 监控与告警:实时监控命中率、过期删除率。5. 使用Redis Cluster分片,分散过期压力。
避免缓存雪崩
缓存雪崩是指大量key同时过期,导致请求全部打到DB。为避免,使用TTL加随机值,如TTL = base_ttl + random(0, 300)。同时设置never expire的mutex key,用于互斥更新。
过期策略配置
redis.conf中hz参数控制定期删除频率,默认10,表示每秒10次采样。activerehashing yes开启主动重哈希,提升删除效率。maxmemory-policy allkeys-lru作为补充策略。
实际案例
在电商场景,商品详情缓存TTL设为1小时,但加随机30分钟。用户session TTL 24小时。结合pipeline批量设置EXPIRE,减少RTT。使用SCAN命令安全遍历键空间管理过期。
FAQ
Q: Redis惰性删除和定期删除哪个更省资源?
A: 惰性删除只在访问时检查,更省CPU,但可能内存占用高;定期删除定时扫描,平衡内存和CPU。
Q: 如何避免缓存穿透?
A: 设置空值缓存,并用短TTL如5秒;使用布隆过滤器过滤无效key。
Q: TTL时间怎么选?
A: 根据数据更新频率和访问热度,冷数据短热数据长,避免频繁DB压力。
Q: 过期key删除失败怎么办?
A: 内存不足时触发eviction,结合lazyfree-lazy-evict yes异步删除。