TTL, EXPIRE and EXPIREAT now support the milliseconds input/output form

This commit is contained in:
antirez 2011-11-09 18:05:35 +01:00
parent b0b74486e1
commit 52d46855d9
2 changed files with 31 additions and 7 deletions

View File

@ -514,6 +514,14 @@ int expireIfNeeded(redisDb *db, robj *key) {
* Expires Commands * Expires Commands
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
/* Given an string object return true if it contains exactly the "ms"
* or "MS" string. This is used in order to check if the last argument
* of EXPIRE, EXPIREAT or TTL is "ms" to switch into millisecond input/output */
int stringObjectEqualsMs(robj *a) {
char *arg = a->ptr;
return tolower(arg[0]) == 'm' && tolower(arg[1]) == 's' && arg[2] == '\0';
}
void expireGenericCommand(redisClient *c, long long offset) { void expireGenericCommand(redisClient *c, long long offset) {
dictEntry *de; dictEntry *de;
robj *key = c->argv[1], *param = c->argv[2]; robj *key = c->argv[1], *param = c->argv[2];
@ -526,9 +534,7 @@ void expireGenericCommand(redisClient *c, long long offset) {
/* If no "ms" argument was passed the time is in second, so we need /* If no "ms" argument was passed the time is in second, so we need
* to multilpy it by 1000 */ * to multilpy it by 1000 */
if (c->argc == 4) { if (c->argc == 4) {
char *arg = c->argv[3]->ptr; if (!stringObjectEqualsMs(c->argv[3])) {
if (tolower(arg[0]) != 'm' || tolower(arg[1]) != 's' || arg[2]) {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
return; return;
} }
@ -572,15 +578,33 @@ void expireGenericCommand(redisClient *c, long long offset) {
} }
void expireCommand(redisClient *c) { void expireCommand(redisClient *c) {
if (c->argc > 4) {
addReply(c,shared.syntaxerr);
return;
}
expireGenericCommand(c,0); expireGenericCommand(c,0);
} }
void expireatCommand(redisClient *c) { void expireatCommand(redisClient *c) {
if (c->argc > 4) {
addReply(c,shared.syntaxerr);
return;
}
expireGenericCommand(c,mstime()); expireGenericCommand(c,mstime());
} }
void ttlCommand(redisClient *c) { void ttlCommand(redisClient *c) {
long long expire, ttl = -1; long long expire, ttl = -1;
int output_ms = 0;
if (c->argc == 3) {
if (stringObjectEqualsMs(c->argv[2])) {
output_ms = 1;
} else {
addReply(c,shared.syntaxerr);
return;
}
}
expire = getExpire(c->db,c->argv[1]); expire = getExpire(c->db,c->argv[1]);
if (expire != -1) { if (expire != -1) {
@ -590,7 +614,7 @@ void ttlCommand(redisClient *c) {
if (ttl == -1) { if (ttl == -1) {
addReplyLongLong(c,-1); addReplyLongLong(c,-1);
} else { } else {
addReplyLongLong(c,(ttl+500)/1000); addReplyLongLong(c,output_ms ? ttl : ((ttl+500)/1000));
} }
} }

View File

@ -172,8 +172,8 @@ struct redisCommand redisCommandTable[] = {
{"move",moveCommand,3,"w",0,NULL,1,1,1,0,0}, {"move",moveCommand,3,"w",0,NULL,1,1,1,0,0},
{"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0}, {"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0},
{"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0}, {"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0},
{"expire",expireCommand,3,"w",0,NULL,1,1,1,0,0}, {"expire",expireCommand,-3,"w",0,NULL,1,1,1,0,0},
{"expireat",expireatCommand,3,"w",0,NULL,1,1,1,0,0}, {"expireat",expireatCommand,-3,"w",0,NULL,1,1,1,0,0},
{"keys",keysCommand,2,"r",0,NULL,0,0,0,0,0}, {"keys",keysCommand,2,"r",0,NULL,0,0,0,0,0},
{"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0}, {"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0},
{"auth",authCommand,2,"r",0,NULL,0,0,0,0,0}, {"auth",authCommand,2,"r",0,NULL,0,0,0,0,0},
@ -194,7 +194,7 @@ struct redisCommand redisCommandTable[] = {
{"sort",sortCommand,-2,"wm",0,NULL,1,1,1,0,0}, {"sort",sortCommand,-2,"wm",0,NULL,1,1,1,0,0},
{"info",infoCommand,-1,"r",0,NULL,0,0,0,0,0}, {"info",infoCommand,-1,"r",0,NULL,0,0,0,0,0},
{"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0}, {"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0},
{"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0}, {"ttl",ttlCommand,-2,"r",0,NULL,1,1,1,0,0},
{"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0}, {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0},
{"slaveof",slaveofCommand,3,"aws",0,NULL,0,0,0,0,0}, {"slaveof",slaveofCommand,3,"aws",0,NULL,0,0,0,0,0},
{"debug",debugCommand,-2,"aw",0,NULL,0,0,0,0,0}, {"debug",debugCommand,-2,"aw",0,NULL,0,0,0,0,0},