redis client.ttl(key)
对应 Redis 的 TTL 命令:
bash
复制
下载
TTL key
使用示例
1. 基本用法
java
复制
下载
try (Jedis jedis = jedisPool.getResource()) {long ttl = jedis.ttl("user:1001:session");if (ttl > 0) {System.out.println("键将在 " + ttl + " 秒后过期");} else if (ttl == -1) {System.out.println("键存在,但未设置过期时间");} else if (ttl == -2) {System.out.println("键不存在或已过期");} } catch (JedisException e) {System.err.println("Redis 操作失败: " + e.getMessage()); }
2. 结合 expire
使用
java
复制
下载
// 设置键并添加过期时间 jedis.setex("temp:data", 300, "value"); // 5分钟后过期// 检查剩余时间 long remainingTime = jedis.ttl("temp:data"); System.out.println("剩余时间: " + remainingTime + " 秒");
常见问题
Q1: 为什么返回 -2
?
-
键可能从未存在,或已过期被 Redis 自动删除。
-
注意:Redis 不区分“键不存在”和“键已过期”,统一返回
-2
。
Q2: 如何获取毫秒级精度的 TTL?
使用 pttl
方法:
java
复制
下载
long pttl = jedis.pttl("mykey"); // 返回毫秒
Q3: ttl
和 exists
的区别?
-
ttl
返回具体时间信息,能区分“永久键”和“不存在键”。 -
exists
只返回键是否存在(1
或0
),不关心过期时间。
关键注意事项
-
精度问题:
-
ttl
返回秒级整数(向下取整)。 -
例如,剩余时间 1.9 秒时返回
1
。
-
-
键过期时机:
Redis 的过期删除是惰性 + 定期的,ttl
返回值可能不是实时精确的。 -
性能:
ttl
是 O(1) 操作,对性能无显著影响。
最佳实践
java
复制
下载
// 安全获取 TTL(带异常处理) try (Jedis jedis = jedisPool.getResource()) {long ttl = jedis.ttl(key);switch ((int) ttl) {case -2:// 键不存在逻辑break;case -1:// 键永久有效逻辑break;default:// 键即将过期逻辑if (ttl < 30) {jedis.expire(key, 60); // 自动续期}} } catch (JedisException e) {// 处理网络或服务端错误 }
总结
场景 | 返回值 | 处理建议 |
---|---|---|
键存在且有 TTL | > 0 | 根据业务判断是否续期。 |
键存在但无 TTL | -1 | 无需处理,或主动设置过期时间。 |
键不存在/已过期 | -2 | 可能需要重新创建键。 |
Redis 服务异常 | 抛异常 | 捕获 JedisException 并重试。 |