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 d410cd7207..e042b70e4c 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 Long getExpire(K key, final TimeUnit timeUnit) { 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 b35a202d5e..2cdca1155c 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 void testGetExpireSeconds() { 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() {