首页 > 解决方案 > 为什么从 Redis 中提取键和哈希值这么慢?

问题描述

我正在使用该StackExchange.Redis库与 Azure Redis 服务器交互,以提取一些哈希值以通过 Web api 访问。这是我的做法:

        IDatabase cache = lazyConnection.Value.GetDatabase();
        var server = lazyConnection.Value.GetServer(lazyConnection.Value.GetEndPoints().First());
        var starterKeys = server.Keys(pattern: "Monitor:*");
        var count = 0;
        foreach (var starterKey in starterKeys)
        {
            var hashEntries = cache.HashGetAll(starterKey);
            foreach (var hashEntry in hashEntries)
            {
                //put values into my model here...
            }
            count++;
        }

恰好有 22 个键与模式匹配"Monitor:*"(通过调试和观察最后的count值找到)。然而,这段代码,检索这 22 个键和散列需要 55 秒。哈希值也不是很大。每个散列中大约有 19 个键值对(名称、公司、电子邮件、电话等。没什么大不了的)。

为什么这需要这么长时间?我认为使用 Redis 的原因之一是速度快,并通过存储聚合数据来减少数据库的负载。我可以在我的数据库中设置它并查询它(即使使用连接来获取聚合数据),我的过程将大大快于 55 秒。

我在这里做错了吗?还是我不了解 Redis 的用途或正确用法?

而且,最重要的是,我能做些什么来更快地检索这些键和哈希值吗?

标签: c#redisstackexchange.redis

解决方案


如果您需要所有 KEY*,将它们保持在一个值中会提高速度。您可以将对象保留在 AllKeys 下以显示所有 Key。

设置所有对象

 cache.StringSetAsync("AllKeys", JsonConvert.SerializeObject(obj));

获取所有对象

JsonConvert.DeserializeObject<List<TEntity>>(await cache.StringGetAsync("AllKeys")).ToList();

推荐阅读