diff --git a/src/db.c b/src/db.c index dfec71942..eed9f55b6 100644 --- a/src/db.c +++ b/src/db.c @@ -700,7 +700,7 @@ void moveCommand(redisClient *c) { robj *o; redisDb *src, *dst; int srcid; - long long dbid; + long long dbid, expire; /* Obtain source and target DB pointers */ src = c->db; @@ -729,6 +729,7 @@ void moveCommand(redisClient *c) { addReply(c,shared.czero); return; } + expire = getExpire(c->db,c->argv[1]); /* Return zero if the key already exists in the target DB */ if (lookupKeyWrite(dst,c->argv[1]) != NULL) { @@ -736,6 +737,7 @@ void moveCommand(redisClient *c) { return; } dbAdd(dst,c->argv[1],o); + if (expire) setExpire(dst,c->argv[1],expire); incrRefCount(o); /* OK! key moved, free the entry in the source DB */ diff --git a/tests/unit/basic.tcl b/tests/unit/basic.tcl index 6f725d299..489272f5d 100644 --- a/tests/unit/basic.tcl +++ b/tests/unit/basic.tcl @@ -410,6 +410,19 @@ start_server {tags {"basic"}} { set e } {*ERR*index out of range} + test {MOVE can move key expire metadata as well} { + r select 10 + r flushdb + r select 9 + r set mykey foo ex 100 + r move mykey 10 + assert {[r ttl mykey] == -2} + r select 10 + assert {[r ttl mykey] > 0 && [r ttl mykey] <= 100} + assert {[r get mykey] eq "foo"} + r select 9 + } + test {SET/GET keys in different DBs} { r set a hello r set b world