]> git.saurik.com Git - redis.git/commitdiff
TTL API change: TTL returns -2 for non existing keys.
authorantirez <antirez@gmail.com>
Mon, 12 Nov 2012 22:04:36 +0000 (23:04 +0100)
committerantirez <antirez@gmail.com>
Mon, 12 Nov 2012 22:04:36 +0000 (23:04 +0100)
The previous behavior was to return -1 if:

1) Existing key but without an expire set.
2) Non existing key.

Now the second case is handled in a different, and TTL will return -2
if the key does not exist at all.

PTTL follows the same behavior as well.

src/db.c
tests/unit/expire.tcl

index 9fe9a003ce57e7b316ac69e20c5b4b00e3b4e894..a73d1fbf5e0dc75c5d38379f33ce6f7bffd2d642 100644 (file)
--- a/src/db.c
+++ b/src/db.c
@@ -614,6 +614,13 @@ void ttlGenericCommand(redisClient *c, int output_ms) {
     long long expire, ttl = -1;
 
     expire = getExpire(c->db,c->argv[1]);
     long long expire, ttl = -1;
 
     expire = getExpire(c->db,c->argv[1]);
+    /* If the key does not exist at all, return -2 */
+    if (expire == -1 && lookupKeyRead(c->db,c->argv[1]) == NULL) {
+        addReplyLongLong(c,-2);
+        return;
+    }
+    /* The key exists. Return -1 if it has no expire, or the actual
+     * TTL value otherwise. */
     if (expire != -1) {
         ttl = expire-mstime();
         if (ttl < 0) ttl = -1;
     if (expire != -1) {
         ttl = expire-mstime();
         if (ttl < 0) ttl = -1;
index 56a59f7680dffb3314ab785054b9db0d404c4add..57497fe5e0991c4bc0a785f605b205d9adffaa56 100644 (file)
@@ -121,13 +121,31 @@ start_server {tags {"expire"}} {
         list $a $b
     } {somevalue {}}
 
         list $a $b
     } {somevalue {}}
 
-    test {PTTL returns millisecond time to live} {
+    test {TTL returns tiem to live in seconds} {
+        r del x
+        r setex x 10 somevalue
+        set ttl [r ttl x]
+        assert {$ttl > 8 && $ttl <= 10}
+    }
+
+    test {PTTL returns time to live in milliseconds} {
         r del x
         r setex x 1 somevalue
         set ttl [r pttl x]
         assert {$ttl > 900 && $ttl <= 1000}
     }
 
         r del x
         r setex x 1 somevalue
         set ttl [r pttl x]
         assert {$ttl > 900 && $ttl <= 1000}
     }
 
+    test {TTL / PTTL return -1 if key has no expire} {
+        r del x
+        r set x hello
+        list [r ttl x] [r pttl x]
+    } {-1 -1}
+
+    test {TTL / PTTL return -2 if key does not exit} {
+        r del x
+        list [r ttl x] [r pttl x]
+    } {-2 -2}
+
     test {Redis should actively expire keys incrementally} {
         r flushdb
         r psetex key1 500 a
     test {Redis should actively expire keys incrementally} {
         r flushdb
         r psetex key1 500 a