【问题标题】:Redis Modules API - Implementing LRANGERedis 模块 API - 实现 LRANGE
【发布时间】:2019-07-13 20:46:05
【问题描述】:

我正在尝试使用模块 API 快速检索存储在列表中的所有值以进行聚合(约 10M 值)。 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 秒内返回约 10M 值。

还有其他方法可以使用低级 Redis 模块 API 从列表中提取值吗?

【问题讨论】:

    标签: redis


    【解决方案1】:

    目前 (v5.0.5) 没有用于迭代或获取列表范围的 API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 2018-06-20
      • 2012-03-09
      • 2017-02-24
      • 2017-03-02
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      相关资源
      最近更新 更多