From 650085d61a1e4737ef30c96a9420170da9e02c2c Mon Sep 17 00:00:00 2001 From: John Sully Date: Sun, 13 Oct 2019 12:57:50 -0400 Subject: [PATCH] Add millisecond support for EXPIREMEMBER command Former-commit-id: 6e6cd84ad7dc9e5763ab36668cbbf8ca6743f8d9 --- src/expire.cpp | 32 +++++++++++++++++++++++++++++++- src/help.h | 4 ++-- src/server.cpp | 2 +- 3 files changed, 34 insertions(+), 4 deletions(-) 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},