Расширение Функциональности Хранилища Ключей-Значений Redis

После некоторого изучения репозитория Редис ( версия 1.01 ) для использования в высоконагруженном проекте впечатления остаются хорошие.

Но лично мне одной простой вещи было недостаточно команды — подсчет количества ключей по шаблону.

Те.

Есть КЛЮЧИ , но возвращает массив со всеми ключами.

Которая, согласитесь, с размерами порядка сотен миллионов записей заставит сервер долго думать.

Если у него хватит на это ресурсов.

Немного покопавшись в исходном коде, была введена новая команда COUNT, которая возвращает количество записей по шаблону.

разница в redis.c

352a353 > static void countCommand(redisClient *c); 441a443 > {"count",countCommand,2,REDIS_CMD_INLINE}, 755c757 < if (!(loops % 5)) { --- > if (!(loops % 30)) { 2502a2505,2528 > static void countCommand(redisClient *c) { > dictIterator *di; > dictEntry *de; > sds pattern = c->argv[1]->ptr; > int plen = sdslen(pattern); > int numkeys = 0; > > di = dictGetIterator(c->db->dict); > if (!di) oom("dictGetIterator"); > while((de = dictNext(di)) != NULL) { > robj *keyobj = dictGetEntryKey(de); > > sds key = keyobj->ptr; > if ((pattern[0] == '*' && pattern[1] == '\0') || > stringmatchlen(pattern,plen,key,sdslen(key),0)) { > if (expireIfNeeded(c->db,keyobj) == 0) { > numkeys++; > } > } > } > dictReleaseIterator(di); > addReplySds(c, sdscatprintf(sdsempty(),":%lu\r\n", numkeys)); > } >

разница в redis-cli.c

98a99 > {"count",2,REDIS_CMD_INLINE},

разница в redis.py

301a302,306 > def count(self, pattern): > self.connect() > self._write('COUNT %s\r\n' % pattern) > return self.get_response() >

Наслаждаться! ;-) Теги: #redis #Чулан

Вместе с данным постом часто просматривают: