我正在尝试使用模块API来快速检索列表中存储的所有值以进行汇总(约1000万个值)。 LPUSH和LPOP已在低级API中实现,但是LRANGE却没有。
我可以使用高级API调用LRANGE,但性能仅略高于RcppRedis / hiredis。我还可以使用ListPop和ListPush通过存储ListPop的RedisModuleString输出来重新创建LRANGE,但是这也很慢。
带有RedisModule_Call的高级API:
int LRange(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
if (argc < 2) return RedisModule_WrongArity(ctx);
RedisModule_AutoMemory(ctx);
RedisModuleCallReply *highAPI;
highAPI = RedisModule_Call(ctx, "LRANGE", "scc", argv[1], "0", "-1");
...
具有ListPop和ListPush的低级API:
int LRange(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
if (argc < 2) return RedisModule_WrongArity(ctx);
RedisModule_AutoMemory(ctx);
RedisModuleKey *key;
key = RedisModule_OpenKey(ctx,argv[1],REDISMODULE_READ|REDISMODULE_WRITE);
size_t *len;
len = RedisModule_ValueLength(key);
for(int i = 0; i < len; i++) {
RedisModuleString *ele;
ele = RedisModule_ListPop(key,REDISMODULE_LIST_HEAD);
RedisModule_ListPush(key,REDISMODULE_LIST_TAIL,ele);
}
return RedisModule_ReplyWithSimpleString(ctx, "OK");
}
RedisModule_Call在约1.3秒内返回,而ListPop-> ListPish在约3.9秒内返回约1000万个值。
还有另一种使用低级Redis模块API从列表中提取值的方法吗?
答案 0 :(得分:0)
当前(v5.0.5)尚无用于迭代或获取列表范围的API。