1

如果我做类似的事情

number_of_keys = redis_instance.keys('foo*').size

但是这个请求有 10,000 个密钥,有没有办法加快这个过程,因为我只想计算它们,而不是先返回一整批它们,然后.size对它们运行 ruby​​ 方法来计算它们?

问题是,考虑到我实际上并不需要它们,返回 10,000 个密钥有点慢和浪费——我只需要看看有多少。

编辑:我应该指定 redis_instance 是redis class的一个实例。

4

2 回答 2

3

所以,在说别的之前,根据文档

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

因此,如果您可以将所需的任何内容放入哈希中并对其进行 HLEN 处理而不会变得过于混乱,那将是更可取的方式。

除了警告之外,您应该 100% 以 Lua 脚本的形式执行此操作。毫无疑问,您的瓶颈将是网络吞吐量,Lua 完全为您解决了这个问题。Lua 将运行您的整个脚本服务器端,因此您将获取所有密钥并在您的 Redis 机器上对它们进行计数,而无需任何网络传输,然后您只会将计数发回。脚本很简单:

local all_keys = redis.call('KEYS', ARGV[1])
return #all_keys

然后您只需使用 'foo*' 作为参数来调用它。在纯 Redis 中,它将是(未经测试的):

EVAL "your_script.lua" 0 'foo*'

我以前没有在 Ruby 中使用过 Redis,所以你需要将它翻译成 Ruby。

于 2013-07-01T22:56:07.227 回答
1

在这种情况下,最好使用计数器来存储起始计数,然后在添加匹配键时递增计数器。无论您发现哪种计数技巧很快,它仍然依赖于扫描您的密钥空间并寻找匹配项。INCR在键(例如)上使用INCR starts_with_foo会更快,并且最终更具可扩展性。

于 2013-06-30T15:54:17.847 回答