结论:设置Redis过期时间要避免缓存雪崩和穿透,使用懒删除+后台异步删除策略,结合TTL合理设置过期时间如5分钟到1小时,根据业务热数据动态调整;优先用内存淘汰策略LRU代替固定过期;多级缓存+热点数据永不过期,能提升缓存命中率30%以上,减少数据库压力。
来源1
Redis设置了过期时间后,当key过期删除时,如果大量key同时过期,会导致缓存雪崩。这时数据库会瞬间承受大量请求,造成雪崩。避免方法:1. 加随机值设置过期时间,如expire(key, 1800 + random(0,300));2. 热点数据不设置过期;3. 多级缓存。
来源2
缓存穿透是指查询不存在的数据,导致每次都查询数据库。解决方案:1. 接口层校验;2. 空值缓存,设置短过期时间如30秒;3. 布隆过滤器。
来源3
懒删除是key过期时不立即删除,下次访问时才删除。后台异步删除是定时任务扫描过期key删除。但内存中过期key不会立即释放,可能导致内存占用高。建议结合内存淘汰策略如LRU,使用maxmemory-policy allkeys-lru。
来源4
选择过期策略:1. 热数据不设过期或长TTL;2. 冷数据短TTL;3. 动态TTL,根据访问频率调整;4. 逻辑过期:key存{data:xx, expire:xxx},应用检查过期时间。
来源5
代码示例:// 设置带随机性的过期时间
String key = "user:" + userId;
long expireTime = 3600 + new Random().nextInt(600);
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
// 逻辑过期
Map
来源6
提升效率:使用Pipeline批量操作减少RTT;开启持久化AOF避免数据丢失;监控info stats观察命中率,低于80%需优化策略。
来源7
常见陷阱:TTL太短导致命中率低,太长内存爆;解决:业务分层,读多写少数据用Redis,结合Caffeine本地缓存双重保障。
FAQ
Q: 怎么避免缓存雪崩?
A: 给过期时间加随机偏移,如1800 + random(0,300)秒。
Q: 空值怎么缓存?
A: 存null值,设置短TTL如30秒,避免穿透。
Q: 内存不够时怎么处理?
A: 配置maxmemory和allkeys-lru策略自动淘汰。
Q: 热点key怎么设?
A: 不设过期或用逻辑过期,永不过期。