From: antirez Date: Wed, 14 Sep 2011 13:10:28 +0000 (+0200) Subject: Optimize LRANGE to scan the list starting from the head or the tail in order to trave... X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/7cfeb8cccf945e5de7210d8bd5a398acfd0959d8 Optimize LRANGE to scan the list starting from the head or the tail in order to traverse the minimal number of elements. Thanks to Didier Spezia for noticing the problem and providing a patch. --- diff --git a/src/t_list.c b/src/t_list.c index 0690fd2f..71436198 100644 --- a/src/t_list.c +++ b/src/t_list.c @@ -519,7 +519,12 @@ void lrangeCommand(redisClient *c) { p = ziplistNext(o->ptr,p); } } else if (o->encoding == REDIS_ENCODING_LINKEDLIST) { - listNode *ln = listIndex(o->ptr,start); + listNode *ln; + + /* If we are nearest to the end of the list, reach the element + * starting from tail and going backward, as it is faster. */ + if (start > llen/2) start -= llen; + ln = listIndex(o->ptr,start); while(rangelen--) { addReplyBulk(c,ln->value);