如何在Redis中查询一个模式的所有键值对,而无需多次请求

t9aqgxwy  于 5个月前  发布在  Redis
关注(0)|答案(2)|浏览(70)

我试图从Redis中获取给定前缀的所有键值对,而不使用Rust进行许多网络请求。到目前为止,答案建议使用bash或进行多个请求。

nwlqm0z1

nwlqm0z11#

我发现的最好的方法是使用lua脚本来构造响应。下面的例子不是最快的,因为我们可以使用EVALSHA来减少请求大小。
代码:

let raw_kv: Vec<Option<(String, Vec<u8>)>> = tokio::time::timeout(
    timeout,
    redis::cmd("EVAL")
        .arg(
            // use KEYS instead of SCAN since EVAL is already blocking
            "
    local keys = redis.call('KEYS', ARGV[1]);
    if next(keys) == nil then return keys end;
    local out = {};
    for i=1,#keys do out[i] = {keys[i], redis.call('GET', keys[i])} end
    return out;
    ",
        )
        .arg(0) // no manually passed in keys
        .arg(pattern) // custom pattern to search for
        .query_async(&mut self.conn),
)
.await;

字符串
电子邮件:https://docs.rs/redis/latest/redis/struct.Cmd.html#method.arg

yhxst69z

yhxst69z2#

关键是Redis没有这样做。你可以使用KEYSSCAN命令获取模式的所有键。然后你可以GET返回的键。你可以编写Lua script或使用JavaScript到write a function来为你做这件事。
然而,这既不方便也不是特别快,特别是当你有很多数据的时候。而且,KEYS命令是有问题的,因为它会在主线程运行时阻塞主线程。此外,如果你运行的是一个集群,这会变得更加复杂,因为你想要找到的键将在多个服务器上。

相关问题