caching - Redis StackExchange 存储 500k 个类
问题描述
我试图用 redis 代替现有的缓存系统,该系统基本上由Dictionary<id, class>
. 我有大约 500k 个对象,并且正在使用 MsgPackObjectSerializer。我在尝试检索整个数据集时遇到了性能问题。
获取所有密钥需要几秒钟。
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();
}
解决方案
推荐阅读
- api-gateway - 大使边缘堆栈:使用示例项目,但不使用我的项目
- java - Struts 从属性文件中读取值
- wordpress - 如何在本地激活 Elementor PRO?
- amazon-web-services - 使用 AWS SAM 和 DynamoDB 限制 Lambda 权限
- javascript - 拖动/重新定位元素在 touchmove 上不起作用
- r - 如何按特定条件删除 data.frame 中的行?
- css - 从 div 背景背景中排除多个矩形
- javascript - Req.body 是空对象,TypeError:
- azure - 是否可以将文件从 blob 存储/文件共享复制到 ADF 内的 FTP 中?
- javascript - 如何从文件输入显示图片到画布