mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
Better implementation for BRPOP/BLPOP in the non blocking case.
This commit is contained in:
parent
cd8bdea31b
commit
c1db214eeb
@ -852,6 +852,8 @@ void createSharedObjects(void) {
|
||||
shared.psubscribebulk = createStringObject("$10\r\npsubscribe\r\n",17);
|
||||
shared.punsubscribebulk = createStringObject("$12\r\npunsubscribe\r\n",19);
|
||||
shared.del = createStringObject("DEL",3);
|
||||
shared.rpop = createStringObject("RPOP",4);
|
||||
shared.lpop = createStringObject("LPOP",4);
|
||||
for (j = 0; j < REDIS_SHARED_INTEGERS; j++) {
|
||||
shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j);
|
||||
shared.integers[j]->encoding = REDIS_ENCODING_INT;
|
||||
|
@ -365,7 +365,7 @@ struct sharedObjectsStruct {
|
||||
*select0, *select1, *select2, *select3, *select4,
|
||||
*select5, *select6, *select7, *select8, *select9,
|
||||
*messagebulk, *pmessagebulk, *subscribebulk, *unsubscribebulk,
|
||||
*psubscribebulk, *punsubscribebulk, *del,
|
||||
*psubscribebulk, *punsubscribebulk, *del, *rpop, *lpop,
|
||||
*integers[REDIS_SHARED_INTEGERS],
|
||||
*mbulkhdr[REDIS_SHARED_BULKHDR_LEN], /* "*<value>\r\n" */
|
||||
*bulkhdr[REDIS_SHARED_BULKHDR_LEN]; /* "$<value>\r\n" */
|
||||
|
40
src/t_list.c
40
src/t_list.c
@ -933,36 +933,22 @@ void blockingPopGenericCommand(redisClient *c, int where) {
|
||||
return;
|
||||
} else {
|
||||
if (listTypeLength(o) != 0) {
|
||||
/* If the list contains elements fall back to the usual
|
||||
* non-blocking POP operation */
|
||||
struct redisCommand *orig_cmd;
|
||||
robj *argv[2], **orig_argv;
|
||||
int orig_argc;
|
||||
/* Non empty list, this is like a non normal [LR]POP. */
|
||||
robj *value = listTypePop(o,where);
|
||||
redisAssert(value != NULL);
|
||||
|
||||
/* We need to alter the command arguments before to call
|
||||
* popGenericCommand() as the command takes a single key. */
|
||||
orig_argv = c->argv;
|
||||
orig_argc = c->argc;
|
||||
orig_cmd = c->cmd;
|
||||
argv[1] = c->argv[j];
|
||||
c->argv = argv;
|
||||
c->argc = 2;
|
||||
|
||||
/* Also the return value is different, we need to output
|
||||
* the multi bulk reply header and the key name. The
|
||||
* "real" command will add the last element (the value)
|
||||
* for us. If this souds like an hack to you it's just
|
||||
* because it is... */
|
||||
addReplyMultiBulkLen(c,2);
|
||||
addReplyBulk(c,argv[1]);
|
||||
|
||||
popGenericCommand(c,where);
|
||||
|
||||
/* Fix the client structure with the original stuff */
|
||||
c->argv = orig_argv;
|
||||
c->argc = orig_argc;
|
||||
c->cmd = orig_cmd;
|
||||
addReplyBulk(c,c->argv[j]);
|
||||
addReplyBulk(c,value);
|
||||
decrRefCount(value);
|
||||
if (listTypeLength(o) == 0) dbDelete(c->db,c->argv[j]);
|
||||
signalModifiedKey(c->db,c->argv[j]);
|
||||
server.dirty++;
|
||||
|
||||
/* Replicate it as an [LR]POP instead of B[LR]POP. */
|
||||
rewriteClientCommandVector(c,2,
|
||||
(where == REDIS_HEAD) ? shared.lpop : shared.rpop,
|
||||
c->argv[j]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user