Redis模块API-实施LRANGE

时间:2019-07-13 10:06:23

标签: redis

我正在尝试使用模块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从列表中提取值的方法吗?

1 个答案:

答案 0 :(得分:0)

当前(v5.0.5)尚无用于迭代或获取列表范围的API。