【问题标题】:Redis StackExchange storing 500k classesRedis StackExchange 存储 500k 个类
【发布时间】:2019-04-05 18:41:53
【问题描述】:

我试图用 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();
     }

【问题讨论】:

    标签: caching redis stackexchange.redis


    【解决方案1】:

    现在你正在寻找SCAN 命令。

    由于 StackExchange.Redis 的目标是集群等场景,因此了解哪些命令针对数据库(可以分布在多个节点上的逻辑数据库)以及哪些命令针对服务器非常重要。 SCAN 命令针对单个服务器。

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

    【讨论】:

    • 使用扫描获取密钥使其更快,但除了用于实际对象检索的哈希之外,我没有看到任何关于扫描的信息?
    • @Shawn 它应该与你获得的每个键的 get value 相结合。为了加快速度,您应该手动批处理。如果您需要答案中的示例,请写下。
    • 我在问题中添加了一个我在做什么的例子。
    • @Shawn 在示例中您缺少在循环中使用事务(MULTY/EXEC)。现在,您通过 Keys/Batch 语句获得了一批 1000 个键,然后在 Redis 中逐个迭代并执行每个命令。所以你向服务器发出 50 万个请求。您应该使用交易制作batch.Select(k =&gt; k.ToString())).Values。请看这里例如github.com/StackExchange/StackExchange.Redis/blob/master/docs/…
    • 更新了我的例子。现在稍微快了一点。我还能做其他改进吗?
    猜你喜欢
    • 2017-08-01
    • 2022-01-12
    • 2020-02-15
    • 2019-07-07
    • 2017-05-06
    • 2018-03-22
    • 2022-06-17
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多