c# - 为什么从 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 的用途或正确用法?
而且,最重要的是,我能做些什么来更快地检索这些键和哈希值吗?
解决方案
如果您需要所有 KEY*,将它们保持在一个值中会提高速度。您可以将对象保留在 AllKeys 下以显示所有 Key。
设置所有对象
cache.StringSetAsync("AllKeys", JsonConvert.SerializeObject(obj));
获取所有对象
JsonConvert.DeserializeObject<List<TEntity>>(await cache.StringGetAsync("AllKeys")).ToList();
推荐阅读
- scala - Gatling 工具中的 SOAP API 请求格式
- java - 没有“org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder”类型的合格bean
- sql - Postgres获取列名和值作为给定ID的行
- javascript - 在第一次加载 html 页面时播放声音
- python - 我不知道如何修复模块“adoptme.views”没有属性“addfriends”
- php - MagicZoomPlus:未捕获错误:调用成员函数 getShowSwatchTooltip() module-swatches/view/frontend/templates/product/view/renderer.phtml
- python - 是什么导致了这个“TypeError:需要一个类似字节的对象,而不是'str'”错误?
- nginx - 我需要关于设置 Nginx 的建议
- reactjs - react JS属性与属性不同吗?
- node.js - 如何轻松创建参赛表格