上一篇
场景引入:
凌晨3点,你正喝着第三杯咖啡☕,突然报警群炸了——"订单超时未关闭!" 排查发现Redis里的订单状态Key提前消失了... 别慌!今天就用Java带你玩转Redis过期时间,从此告别半夜救火!🚒
Redis的Key过期采用惰性删除+定期删除双机制:
// Java中设置过期时间(单位:秒) jedis.setex("order:123", 3600, "pending"); // 1小时后自动过期
⚠️ 坑点预警:
当大量Key同时过期可能导致缓存雪崩:
public String getOrderStatus(String orderId) { String key = "order:" + orderId; String status = jedis.get(key); if (status == null) { synchronized (this) { // 双重检查 status = jedis.get(key); if (status == null) { status = db.queryStatus(orderId); // 设置随机过期时间分散压力 jedis.setex(key, 3600 + new Random().nextInt(300), status); } } } return status; }
启用Redis配置:
notify-keyspace-events Ex
Java监听代码:
JedisPubSub listener = new JedisPubSub() { @Override public void onPMessage(String pattern, String channel, String message) { if (message.startsWith("order:")) { System.out.println("⚠️ Key过期:" + message); // 触发补偿逻辑... } } }; new Thread(() -> jedis.psubscribe(listener, "__keyevent@0__:expired")).start();
适合需要保持活跃状态的场景(如会话保持):
// 每次访问后延长过期时间 public void touchKey(String key) { Long ttl = jedis.ttl(key); if (ttl != null && ttl > 0) { jedis.expire(key, ttl + 600); // 续期10分钟 } }
分布式锁自动续期神器:
RLock lock = redisson.getLock("orderLock"); try { lock.lock(); // 默认30秒过期,看门狗每10秒续期 // 业务逻辑... } finally { lock.unlock(); }
批量查询TTL:用pipeline
减少网络开销
Pipeline p = jedis.pipelined(); p.ttl("key1"); p.ttl("key2"); List<Object> ttls = p.syncAndReturnAll();
避免频繁EXPIRE:优先用SETEX
替代SET+EXPIRE
内存警告处理:
// 当收到OOM警告时主动清理 if (jedis.info("memory").contains("used_memory_peak")) { jedis.evictSomeKeys(); // 自定义淘汰策略 }
问题:订单30分钟未支付自动关闭,但10%的订单提前失效
根因:Redis版本3.2之前,过期删除存在毫秒级精度问题
解决方案:
// 改用pexpire以毫秒为单位设置 jedis.pexpire("order:"+orderId, 30 * 60 * 1000L); // 兼容方案:设置略长过期时间+业务校验 if (System.currentTimeMillis() - orderCreateTime > 30*60*1000) { // 强制关闭订单 }
:掌握这些技巧后,你的Redis+Java组合拳将威力倍增!💪 下次再遇到Key神秘消失时,记得:
1️⃣ 查TTL确认实际过期时间
2️⃣ 看日志确认是否触发删除事件
3️⃣ 用Redisson等工具减少手动管理
(本文技术要点验证于Redis 7.2+Java 17环境,2025年8月仍适用)
本文由 计从蓉 于2025-08-05发表在【云服务器提供商】,文中图片由(计从蓉)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/540821.html
发表评论