Skip to content

Commit

Permalink
Reduce rewriteClientCommandVector usage on EXPIRE command (redis#11602)
Browse files Browse the repository at this point in the history
There is overhead on Redis 7.0 EXPIRE command that is not present on 6.2.7.

We could see that on the unstable profile there are around 7% of CPU cycles
spent on rewriteClientCommandVector that are not present on 6.2.7.
This was introduced in redis#8474.
This PR reduces the overhead by using 2X rewriteClientCommandArgument instead of
rewriteClientCommandVector. In this scenario rewriteClientCommandVector creates 4 arguments.
the above usage of rewriteClientCommandArgument reduces the overhead in half.

This PR should also improve PEXPIREAT performance by avoiding at all
rewriteClientCommandArgument usage.

Co-authored-by: Oran Agra <oran@redislabs.com>
(cherry picked from commit c3fb48d)
  • Loading branch information
filipecosta90 authored and oranagra committed Dec 9, 2022
1 parent b74d78c commit 9c1a8d2
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions src/expire.c
Original file line number Diff line number Diff line change
Expand Up @@ -651,10 +651,19 @@ void expireGenericCommand(client *c, long long basetime, int unit) {
} else {
setExpire(c,c->db,key,when);
addReply(c,shared.cone);
/* Propagate as PEXPIREAT millisecond-timestamp */
robj *when_obj = createStringObjectFromLongLong(when);
rewriteClientCommandVector(c, 3, shared.pexpireat, key, when_obj);
decrRefCount(when_obj);
/* Propagate as PEXPIREAT millisecond-timestamp
* Only rewrite the command arg if not already PEXPIREAT */
if (c->cmd->proc != pexpireatCommand) {
rewriteClientCommandArgument(c,0,shared.pexpireat);
}

/* Avoid creating a string object when it's the same as argv[2] parameter */
if (basetime != 0 || unit == UNIT_SECONDS) {
robj *when_obj = createStringObjectFromLongLong(when);
rewriteClientCommandArgument(c,2,when_obj);
decrRefCount(when_obj);
}

signalModifiedKey(c,c->db,key);
notifyKeyspaceEvent(NOTIFY_GENERIC,"expire",key,c->db->id);
server.dirty++;
Expand Down

0 comments on commit 9c1a8d2

Please sign in to comment.