在StackExchange.Redis中按键模式获取值

12

我正在尝试使用一个模式来通过Stackexchange.Redis检索所有匹配该模式的键。

代码

KEYS *o*

2
你是否知道在实际应用中通常不应该使用KEYS语句?原因是O(n)时间复杂度。请查看文档,这也是为什么要实现SCAN的原因。 - Tw Bert
@TwBert 谢谢。Redis在Sort语句中使用SCAN吗? - Amir Movahedi
1个回答

10
在项目主页上,有一个链接“Where are KEYS, SCAN, FLUSHDB etc?” ,其中详细介绍了如何访问此功能以及为什么它不在IDatabase中。需要指出的是,在生产服务器上应避免使用KEYS。如果可用,库将自动尝试使用SCAN,这样会更安全一些,但仍应该小心对待。最好将相关键明确地存储在集合或哈希表中。

1
@MarkGravell,您能否澄清一下为什么在使用2.8+版本的Redis时不应该使用server.Keys(pattern:“foo”)?我阅读了您提到的链接/页面,但它似乎与https://redis.io/commands/scan中给出的建议相矛盾,其中说:“由于这些命令允许增量迭代,每次调用只返回少量元素,因此它们可以在生产中使用,而不会像KEYS命令那样有缺点。” - Jeff Zickgraf
@Jeff 我说它仍应该“谨慎对待”,而不是不使用。坦白地说,对于这种情况(在繁忙的服务器上),Redis速度非常慢 - 它是O(N),其中N为服务器上键的数量。我建议在您的情况下使用包含活动键的set,这样您就可以使用SMEMBERS / SSCAN。 - Marc Gravell
@MarkGravel - 谢谢。 - Jeff Zickgraf
@MarcGravell 如果您这样做,那么您如何处理过期的项目?如果我存储一个TTL为N分钟的项目,那么在那个时间之后,键名仍将存在于我的列表中,但是我的保存的项目将消失,我的键列表将过时。 - howcheng
@howcheng 确实,如果您选择使用键集,您的代码需要适当地处理缺失记录;您也可以使用 SORT 指令,该指令允许使用 GET 修饰符执行“收集”操作(在 SQL 术语中基本上是执行“内连接”)。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接