gpt4 book ai didi

caching - Redis StackExchange 存储 500k 类

转载 作者:可可西里 更新时间:2023-11-01 11:14:54 28 4
gpt4 key购买 nike

我试图用 Redis 代替现有的缓存系统,该系统主要由 Dictionary<id, class> 组成.我有大约 500k 个对象并且正在使用 MsgPackObjectSerializer。我在尝试检索整个数据集时遇到了性能问题。

获取所有 key 需要几秒钟。

var keys = cacheClient.SearchKeys("ID:*").ToList();

并以这种方式使用 GetAll 方法:

cacheClient.GetAll<class>(keys).Values;

即使配置如下也会导致超时:

     var configOptions = new ConfigurationOptions();
configOptions.EndPoints.Add("localhost:6379");
configOptions.ClientName = "RedisClient";
configOptions.ConnectTimeout = (int) TimeSpan.FromSeconds(5).TotalMilliseconds;
configOptions.SyncTimeout = (int) TimeSpan.FromSeconds(5).TotalMilliseconds;
configOptions.AbortOnConnectFail = false;
configOptions.ResponseTimeout = (int) TimeSpan.FromSeconds(5).TotalMilliseconds;

我能够获得结果的唯一方法是采用这种方式:

var fromRedis = new ConcurrentDictionary<id, class>();
keys.AsParallel().ForAll(k =>
{
var div = cacheClient.Get<class>(k);
if (div != null)
{
fromRedis.TryAdd(k, div)
}
});

这对我来说似乎不对,而且速度很慢。

一定有更好的方法来做到这一点,但我没有看到。

更新:这比 keys.AsParallel 调用稍快。还需要 6 秒...

     var insListScan = new List<Task<RedisValue[]>>();

foreach (var batch in server.Keys(0, "InstrumentSK:*").Batch(1000))
{
var tran = cacheClient.Database.CreateTransaction();
insListScan.Add(tran.StringGetAsync(batch.ToArray()));
tran.Execute();
}

最佳答案

现在您正在寻找SCAN命令。

由于StackExchange.Redis针对的是集群等场景,所以需要明确哪些命令是针对数据库(可以分布在多个节点的逻辑数据库),哪些命令是针对服务器的。 SCAN 命令针对单个服务器。

Here is您可以从 StackExchange.Redis 文档和使用 SCAN 的解决方法中找到详细说明。

关于caching - Redis StackExchange 存储 500k 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53103001/

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