【发布时间】: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