【发布时间】:2018-07-20 19:35:12
【问题描述】:
我知道从缓存中获取所有值并不是最好的主意,但我有一个内部工具的特殊用例。
我有以下代码:
public IEnumerable<KeyValuePair<K, V>> GetAllStoreEntries()
{
var keys = RedisStore.Server.Keys(pattern: $"{GetCompletePrefix()}:*", pageSize: pageSize).ToList();
foreach (var subList in Split(keys, pageSize))
{
var subKeys = subList.ToArray();
var values = RedisStore.RedisCache.StringGet(subKeys); <---------
for (var i = 0; i < values.Length; i++)
{
var value = values[i];
if (value.HasValue)
{
var svalue = JsonConvert.DeserializeObject<V>(value);
yield return new KeyValuePair<K, V>(GetKKey(subKeys[i]), svalue);
}
}
}
}
在标记位置我想使用StringGetAsync,但我不知道如何重构我可以使用它的代码。
如何重写 GetAllStoreEntries,使其并行获取拆分后的键列表?
【问题讨论】:
-
你可以从documentation和tutorials开始。
-
true
IEnumerable<...>不太适合并发(也不适合等待);我们在这里谈论什么样的音量? 看起来你在那里使用 SE.Redis,它支持异步的完整流水线,但是......你不能使用带有async的迭代器块 (yield return),所以不一定有帮助。 SE.Redis 也支持MGET,但这会导致一个redis op;再说一遍:这里的数据量是多少? -
嗨,Marc,它是 SE.Redis。我拆分了键列表,因为我得到了超时。有 >250000 个条目。
-
看看这个,但这是一条危险的道路stackoverflow.com/a/50488373/78569也许你可以把它和马克的答案结合起来。
标签: c# redis async-await