Client side caching: CLIENT TRACKING subcommand.
This commit is contained in:
parent
c29f3bcf2e
commit
db16a861a1
@ -1966,6 +1966,7 @@ void clientCommand(client *c) {
|
|||||||
"reply (on|off|skip) -- Control the replies sent to the current connection.",
|
"reply (on|off|skip) -- Control the replies sent to the current connection.",
|
||||||
"setname <name> -- Assign the name <name> to the current connection.",
|
"setname <name> -- Assign the name <name> to the current connection.",
|
||||||
"unblock <clientid> [TIMEOUT|ERROR] -- Unblock the specified blocked client.",
|
"unblock <clientid> [TIMEOUT|ERROR] -- Unblock the specified blocked client.",
|
||||||
|
"tracking (on|off) [REDIRECT <id>] -- Enable client keys tracking for client side caching.",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
addReplyHelp(c, help);
|
addReplyHelp(c, help);
|
||||||
@ -2122,20 +2123,56 @@ NULL
|
|||||||
addReply(c,shared.czero);
|
addReply(c,shared.czero);
|
||||||
}
|
}
|
||||||
} else if (!strcasecmp(c->argv[1]->ptr,"setname") && c->argc == 3) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"setname") && c->argc == 3) {
|
||||||
|
/* CLIENT SETNAME */
|
||||||
if (clientSetNameOrReply(c,c->argv[2]) == C_OK)
|
if (clientSetNameOrReply(c,c->argv[2]) == C_OK)
|
||||||
addReply(c,shared.ok);
|
addReply(c,shared.ok);
|
||||||
} else if (!strcasecmp(c->argv[1]->ptr,"getname") && c->argc == 2) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"getname") && c->argc == 2) {
|
||||||
|
/* CLIENT GETNAME */
|
||||||
if (c->name)
|
if (c->name)
|
||||||
addReplyBulk(c,c->name);
|
addReplyBulk(c,c->name);
|
||||||
else
|
else
|
||||||
addReplyNull(c);
|
addReplyNull(c);
|
||||||
} else if (!strcasecmp(c->argv[1]->ptr,"pause") && c->argc == 3) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"pause") && c->argc == 3) {
|
||||||
|
/* CLIENT PAUSE */
|
||||||
long long duration;
|
long long duration;
|
||||||
|
|
||||||
if (getTimeoutFromObjectOrReply(c,c->argv[2],&duration,UNIT_MILLISECONDS)
|
if (getTimeoutFromObjectOrReply(c,c->argv[2],&duration,
|
||||||
!= C_OK) return;
|
UNIT_MILLISECONDS) != C_OK) return;
|
||||||
pauseClients(duration);
|
pauseClients(duration);
|
||||||
addReply(c,shared.ok);
|
addReply(c,shared.ok);
|
||||||
|
} else if (!strcasecmp(c->argv[1]->ptr,"tracking") &&
|
||||||
|
(c->argc == 3 || c->argc == 5))
|
||||||
|
{
|
||||||
|
/* CLIENT TRACKING (on|off) [REDIRECT <id>] */
|
||||||
|
long long redir = 0;
|
||||||
|
|
||||||
|
/* Parse the redirection option: we'll require the client with
|
||||||
|
* the specified ID to exist right now, even if it is possible
|
||||||
|
* it will get disconnected later. */
|
||||||
|
if (c->argc == 5) {
|
||||||
|
if (strcasecmp(c->argv[3]->ptr,"redirect") != 0) {
|
||||||
|
addReply(c,shared.syntaxerr);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (getLongLongFromObjectOrReply(c,c->argv[4],&redir,NULL) !=
|
||||||
|
C_OK) return;
|
||||||
|
if (lookupClientByID(redir) == NULL) {
|
||||||
|
addReplyError(c,"The client ID you want redirect to "
|
||||||
|
"does not exist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcasecmp(c->argv[2]->ptr,"on")) {
|
||||||
|
enableTracking(c,redir);
|
||||||
|
} else if (!strcasecmp(c->argv[2]->ptr,"off")) {
|
||||||
|
disableTracking(c);
|
||||||
|
} else {
|
||||||
|
addReply(c,shared.syntaxerr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
addReply(c,shared.ok);
|
||||||
} else {
|
} else {
|
||||||
addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try CLIENT HELP", (char*)c->argv[1]->ptr);
|
addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try CLIENT HELP", (char*)c->argv[1]->ptr);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user