gpt4 book ai didi

c# - StackExchange.Redis 扫描 x 个键

转载 作者:IT王子 更新时间:2023-10-29 06:04:59 29 4
gpt4 key购买 nike

我有一个包含数千个键的 redis 数据库,我目前正在运行以下行来获取所有键:

string[] keysArr = keys.Select(key => (string)key).ToArray();

但是因为我有很多 key ,这需要很长时间。我想限制正在读取的键数。所以我试图运行一个执行命令,一次获得 100 个键:

var keys = Redis.Connection.GetDatabase(dbNum).Execute("scan", 0, "count", 100);

此命令成功运行命令,但是无法访问该值,因为它是私有(private)的,并且即使 RedisResult 类为其提供显式转换也无法对其进行转换:

public static explicit operator string[] (RedisResult result);

有什么想法可以从 redis 中一次获取 x 数量的键吗?

谢谢

最佳答案

SE.Redis 在IServer API 上有一个.Keys() 方法,它完全封装了SCAN 的语义。如果可能,就用这个方法,一次消费100条数据。编写批处理函数通常很容易,即

ExecuteInBatches(server.Keys(), 100, batch => DoSomething(batch));

与:

public void ExecuteInBatches<T>(IEnumerable<T> source, int batchSize,
Action<List<T>> action)
{
List<T> batch = new List<T>();
foreach(var item in source) {
batch.Add(item);
if(batch.Count == batchSize) {
action(batch);
batch = new List<T>(); // in case the callback stores it
}
}
if (batch.Count != 0) {
action(batch); // any leftovers
}
}

枚举器会担心光标的前进。


可以使用Execute,但是:工作量很大!此外,SCAN 不保证每页返回多少;它可以是零——它可以是你要求的 3 倍。这只是……指导。

顺便说一句,转换失败的原因是因为 SCAN 不返回 string[] - 它返回一个包含两个的数组项目,其中第一个是“下一个”光标,第二个是键。所以也许:

var arr = (RedisResult[])server.Execute("scan", 0);
var nextCursor = (int)arr[0];
var keys = (RedisKey[])arr[1];

但所有这一切都在重新实现 IServer.Keys,这是一种困难的方式(而且效率明显较低 - ServerResult 不是存储数据的理想方式,在 ExecuteScriptEvaluate 的情况下,它只是必需的

关于c# - StackExchange.Redis 扫描 x 个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51522162/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com