在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
在我看来它应该可以将它传递给一个数组......?
答案 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
这不会将所有匹配的密钥立即加载到内存中,因此不会绑定到内存。