【发布时间】: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 驱动是否知道如何处理数组参数?
*keys在del看到它时将是一个数组,所以也许del足够聪明,可以自动展平它(如果不是,也许你可以用猴子修补它)。 -
还有一个有趣的事实。当我不使用 splat 运算符时,当我定义和调用具有 6892 个参数的函数时,ruby 工作正常,但如果参数数量为 6893,则失败并出现 SO 错误。请参阅更新的要点。