From e64f84b45a441d2194a64540346b7923909d8cd7 Mon Sep 17 00:00:00 2001 From: oudb Date: Thu, 23 Jun 2016 17:13:28 +0800 Subject: [PATCH] DATAREDIS-526 - Fix getExpire return value. getExpire returns now negative values without time unit conversion in case of absent values or values without a TTL set. CLA: 143520151016081625 (Duobiao Ou) Original pull request: #205. --- .../data/redis/core/RedisTemplate.java | 7 ++-- .../data/redis/core/RedisTemplateTests.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/core/RedisTemplate.java b/src/main/java/org/springframework/data/redis/core/RedisTemplate.java index d410cd720..e042b70e4 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisTemplate.java +++ b/src/main/java/org/springframework/data/redis/core/RedisTemplate.java @@ -715,11 +715,14 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return execute(new RedisCallback() { public Long doInRedis(RedisConnection connection) { + Long expire; try { - return timeUnit.convert(connection.pTtl(rawKey), TimeUnit.MILLISECONDS); + expire = connection.pTtl(rawKey); + return expire < 0 ? expire : timeUnit.convert(expire, TimeUnit.MILLISECONDS); } catch (Exception e) { // Driver may not support pTtl or we may be running on Redis 2.4 - return timeUnit.convert(connection.ttl(rawKey), TimeUnit.SECONDS); + expire = connection.ttl(rawKey); + return expire < 0 ? expire : timeUnit.convert(expire, TimeUnit.SECONDS); } } }, true); diff --git a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java index b35a202d5..2cdca1155 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java @@ -530,6 +530,39 @@ public class RedisTemplateTests { assertEquals(Long.valueOf(1), redisTemplate.getExpire(key1, TimeUnit.SECONDS)); } + @Test + public void testGetExpireSecondsForKeyDoesNotExist() { + final K key1 = keyFactory.instance(); + Long expire = redisTemplate.getExpire(key1, TimeUnit.SECONDS); + assertTrue(expire < 0l); + } + + @Test + public void testGetExpireSecondsForKeyExistButHasNoAssociatedExpire() { + final K key1 = keyFactory.instance(); + V value1 = valueFactory.instance(); + redisTemplate.boundValueOps(key1).set(value1); + Long expire = redisTemplate.getExpire(key1, TimeUnit.SECONDS); + assertTrue(expire < 0l); + } + + + @Test + public void testGetExpireMillisForKeyDoesNotExist() { + final K key1 = keyFactory.instance(); + Long expire = redisTemplate.getExpire(key1, TimeUnit.MILLISECONDS); + assertTrue(expire < 0l); + } + + @Test + public void testGetExpireMillisForKeyExistButHasNoAssociatedExpire() { + final K key1 = keyFactory.instance(); + V value1 = valueFactory.instance(); + redisTemplate.boundValueOps(key1).set(value1); + Long expire = redisTemplate.getExpire(key1, TimeUnit.MILLISECONDS); + assertTrue(expire < 0l); + } + @Test public void testGetExpireMillisNotSupported() {