【问题标题】:Maximum arity of ruby function?红宝石函数的最大数量?
【发布时间】:2013-08-15 18:50:07
【问题描述】:

我正在寻找一个高效的函数来清除基于 redis 的缓存。

我有一个方法调用,它从 redis 返回多个键:

$redis.keys("foo:*")

返回所有以“foo:”开头的键。接下来,我想删除这些键的所有值。

执行此操作的一种(内存密集型)方法是:

$redis.keys("foo:*").each do |key|
  $redis.del(key)
end

我想避免将所有键加载到内存中,然后向 redis 服务器发出大量请求。

我喜欢的另一种方式是使用 splat 运算符:

keys = $redis.keys("foo:*")
$redis.del(*keys)

问题是我不知道$redis.del方法的最大arity是多少,也不知道任何ruby方法,我好像在网上找不到。

最大数量是多少?

【问题讨论】:

  • 我的机器上有超过 130_000 个参数的SystemStackError: stack level too deep
  • 对我来说也一样。有时 ruby​​ 会严重崩溃:gist.github.com/DNNX/6243859
  • 实现中可能还有改进的余地...具体来说,当只提供一个 splat 参数时,它可以只分配给args 变量,而不是在引擎盖。
  • redis 驱动是否知道如何处理数组参数? *keysdel 看到它时将是一个数组,所以也许 del 足够聪明,可以自动展平它(如果不是,也许你可以用猴子修补它)。
  • 还有一个有趣的事实。当我不使用 splat 运算符时,当我定义和调用具有 6892 个参数的函数时,ruby 工作正常,但如果参数数量为 6893,则失败并出现 SO 错误。请参阅更新的要点。

标签: ruby function arity


【解决方案1】:

cmets 中的@muistooshort 有一个很好的建议,结果证明是正确的,redis 驱动程序知道如何处理数组参数:

 # there are 1,000,000 keys of the form "foo:#{number}"
 keys = $redis.keys("foo:*")
 $redis.del(keys) # => 1000000

只需将一组键传递给$redis.del

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2012-07-07
    • 2017-04-01
    • 2012-09-13
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多