我试图从 Redis 获取给定前缀的所有键值对,而不使用 Rust 发出许多网络请求。到目前为止的答案建议使用 bash 或发出多个请求。
我发现的最好的方法是使用 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