在redis-rb中删除多个键

时间:2011-05-19 16:45:53

标签: ruby-on-rails ruby redis key

在Rails应用程序中使用redis-rb,以下内容不起作用:

irb> keys = $redis.keys("autocomplete*")
=> ["autocomplete_foo", "autocomplete_bar", "autocomplete_bat"]
irb> $redis.del(keys)
=> 0

这很好用:

irb> $redis.del("autocomplete_foo", "autocomplete_bar")
=> 2

我错过了一些明显的东西吗?来源只是:

# Delete a key.
def del(*keys)
  synchronize do
    @client.call [:del, *keys]
  end
end

在我看来它应该可以将它传递给一个数组......?

3 个答案:

答案 0 :(得分:32)

对splat运算符的工作方式进行一些编码探索:

def foo(*keys)
  puts keys.inspect
end

>> foo("hi", "there")
["hi", "there"]

>> foo(["hi", "there"])
[["hi", "there"]]

>> foo(*["hi", "there"])
["hi", "there"]

因此,传入一个常规数组会导致该数组被计算为单个项目,因此您可以在方法中的数组中获取一个数组。如果在调用方法时在数组前加上*:

$redis.del(*keys)

这让方法知道解压缩/不接受任何进一步的参数。所以这应该解决你所遇到的问题!

为了进一步澄清,这有效:

>> foo("hello", *["hi", "there"])

这会导致语法错误:

>> foo("hello", *["hi", "there"], "world")

答案 1 :(得分:12)

对于我正在处理的Rails应用程序,我需要测试加载和卸载redis数据的结果。

命名空间由环境决定,避免与开发交互。这很有效。

def clear_redis_cache
  keys = $redis.keys "#{namespace}*"
  $redis.del(*keys) unless keys.empty?
end

答案 2 :(得分:0)

最好使用scan_each返回的枚举数来实现。

scan_each(match: 'autocomplete_*').each do |key|
  del key
end

这不会将所有匹配的密钥立即加载到内存中,因此不会绑定到内存。