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;
关键是Redis没有这样做。你可以使用KEYS或SCAN命令获取模式的所有键。然后你可以GET返回的键。你可以编写Lua script或使用JavaScript到write a function来为你做这件事。 然而,这既不方便也不是特别快,特别是当你有很多数据的时候。而且,KEYS命令是有问题的,因为它会在主线程运行时阻塞主线程。此外,如果你运行的是一个集群,这会变得更加复杂,因为你想要找到的键将在多个服务器上。
2条答案
按热度按时间nwlqm0z11#
我发现的最好的方法是使用lua脚本来构造响应。下面的例子不是最快的,因为我们可以使用
EVALSHA
来减少请求大小。代码:
字符串
电子邮件:https://docs.rs/redis/latest/redis/struct.Cmd.html#method.arg
yhxst69z2#
关键是Redis没有这样做。你可以使用KEYS或SCAN命令获取模式的所有键。然后你可以GET返回的键。你可以编写Lua script或使用JavaScript到write a function来为你做这件事。
然而,这既不方便也不是特别快,特别是当你有很多数据的时候。而且,KEYS命令是有问题的,因为它会在主线程运行时阻塞主线程。此外,如果你运行的是一个集群,这会变得更加复杂,因为你想要找到的键将在多个服务器上。