Redisキーバリュー機能の拡張

負荷の高いプロジェクトで使用するためのRedisリポジトリ( バージョン1.01 )を調べた後、印象は良いままです。 しかし、個人的には、単純なコマンドは1つもありませんでした。パターンごとにキーの数をカウントします。 つまり KEYSがありますが、すべてのキーを含む配列を返します。 それは、数億件のレコードのサイズで、サーバーが長い間考えさせてくれることです。 これに十分なリソースがある場合。



ソースを少し掘り下げると、パターンごとにレコード数を返す新しいCOUNTコマンドが導入されました。



diff 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));

> }

>









diff redis-cli.c



98a99

> {"count",2,REDIS_CMD_INLINE},









diff redis.py



301a302,306

> def count(self, pattern):

> self.connect()

> self._write('COUNT %s\r\n' % pattern)

> return self.get_response()

>








お楽しみください! ;-)



All Articles