diff --git a/src/expire.cpp b/src/expire.cpp index 0518abdca..6b77a0192 100644 --- a/src/expire.cpp +++ b/src/expire.cpp @@ -130,13 +130,43 @@ void activeExpireCycleExpire(redisDb *db, expireEntry &e, long long now) { } } +int parseUnitString(const char *sz) +{ + if (strcasecmp(sz, "s") == 0) + return UNIT_SECONDS; + if (strcasecmp(sz, "ms") == 0) + return UNIT_MILLISECONDS; + return -1; +} + void expireMemberCommand(client *c) { long long when; if (getLongLongFromObjectOrReply(c, c->argv[3], &when, NULL) != C_OK) return; - when *= 1000; + if (c->argc > 5) { + addReplyError(c, "Invalid number of arguments"); + return; + } + + int unit = UNIT_SECONDS; + if (c->argc == 5) { + unit = parseUnitString(szFromObj(c->argv[4])); + } + + switch (unit) + { + case UNIT_SECONDS: + when *= 1000; + case UNIT_MILLISECONDS: + break; + + default: + addReplyError(c, "Invalid unit arg"); + return; + } + when += mstime(); /* No key, return zero. */ diff --git a/src/help.h b/src/help.h index 96635c887..b41f6123b 100644 --- a/src/help.h +++ b/src/help.h @@ -344,8 +344,8 @@ struct commandHelp { 0, "1.2.0" }, { "EXPIREMEMBER", - "key subkey seconds", - "set a subkey's time to live in seconds"}, + "key subkey delay [Unit: s,ms]", + "set a subkey's time to live in seconds (or milliseconds)"}, { "FLUSHALL", "[ASYNC]", "Remove all keys from all databases", diff --git a/src/server.cpp b/src/server.cpp index 4b15ff46f..0e5f1b8b5 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -623,7 +623,7 @@ struct redisCommand redisCommandTable[] = { "write fast @keyspace", 0,NULL,1,1,1,0,0,0}, - {"expiremember", expireMemberCommand, 4, + {"expiremember", expireMemberCommand, -4, "write fast @keyspace", 0,NULL,1,1,1,0,0,0},