首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackExchange.Redis server.Keys(pattern:"IsVerySlow*")

StackExchange.Redis server.Keys(pattern:"IsVerySlow*")
EN

Stack Overflow用户
提问于 2014-10-18 18:26:30
回答 2查看 14K关注 0票数 16

我刚接触redis,所以我肯定做错了什么:

我已经在Azure Redis中存储了大约16,000个键/值。

我使用以下代码编写键/值

代码语言:javascript
复制
      foreach (var worksheet in wksList)
      {
        var wksYYMM = string.Format("{0}{1:00}", worksheet.ReviewDt.Year, worksheet.ReviewDt.Month);
        var wksKey = string.Format("{0}:{1}:{2}", provCode, wksYYMM, worksheet.AcctNbr);
        string jsonStr = JsonConvert.SerializeObject( MakeWsListDto(worksheet, provCoderList, rvrList));
        cache.StringSet(wksKey, jsonStr);
      }

所以我的密钥是这样的:"AP:201401:AZ5798BK“

当我尝试这样的查找时:

代码语言:javascript
复制
    var keys = server.Keys(pattern: "AP:201401:*"); // returns in milliseconds
    var keyAry = keys.ToArray(); // returns in over one minute
    (note: this returns 12 keys)

返回密钥需要1分12秒。一旦我有了密钥,就需要几毫秒来检索这些密钥的值。如果我迭代键的值并返回这些值,我会得到类似的结果。我做了一个ToArray()来隔离这个问题。

如果我在redis-cli.exe中尝试同样的查询,它会在毫秒内返回。

我是否错误地使用了此命令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-18 21:17:04

server.Keys根据服务器版本自动在KEYS和首选SCAN之间进行选择。我怀疑所发生的情况是,您使用的SCAN页面大小太小。页面大小有一个可选参数。尝试指定比缺省值大得多的值-数百、数千等。如果未指定,页面大小将使用Redis SCAN的缺省值10,这可能会导致需要进行大量往返。

票数 30
EN

Stack Overflow用户

发布于 2014-10-18 19:50:07

不要使用KEYS -这是一个阻塞命令,它会使您的Redis服务器在运行时无法供其他请求使用。引用自command's documentation

Warning:将KEYS视为仅应在生产环境中极其小心地使用的命令。在对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用键。如果您正在寻找一种在键空间的子集中查找键的方法,请考虑使用SCAN或sets。

如果你仔细阅读了警告,你会注意到段落末尾的推荐方法,即使用SCAN或Redis的集合。扫描是非阻塞的,但由于您的问题表明您对性能感兴趣,因此我建议使用sets。

我们的想法是维护一个Redis集合,其中包含与该“模式”相关联的所有键名,因此在您的示例中,您必须在调用cache.SetString之后执行StackExchange.Redis-等同于SADD AP:201401 AP:201401:AZ5798BK,例如:

代码语言:javascript
复制
cache.SetAdd(wksYYMM, wksKey);

免责声明:我不是C#程序员,也不太熟悉StackExchange.Redis (对不起,Marc;)

现在,不使用密钥或扫描来获取密钥,只需执行SMEMBERS AP:201401或可能:

代码语言:javascript
复制
var keys = cache.Members(wksYYMM);

Bonus:由于您实际上对这些键的值感兴趣,因此可以使用Redis的Lua脚本根据集合的成员来获取键值,或者直接使用SORT

纯Redis:

代码语言:javascript
复制
SORT AP:201401 BY nosort GET *`

C#和StackExchange.Redis:

代码语言:javascript
复制
vals = cache.Sort(wksYYMM, by = "nosort", get = "*");
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26438736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档