我有一个程序可以在Redis中存储数据。在命名空间“foo”下的密钥中存储了任意数量的集合,即keys foo:*
将返回集合的密钥列表。我想从名称空间中包含它的所有集合中删除字符串“bar”。基本上(这是在Ruby中):
redis.keys("foo:*").each do |key|
redis.srem(key, "bar")
end
由于keys
的使用不适合生产使用,因此效率低且不是原子的。有没有更好的方法从所有套件中删除“bar”,因为我没有提前操作的套件的按键?
如果这是使用原子性并使其具有高效性的唯一方法,那么我可以使用Lua脚本。
答案 0 :(得分:5)
执行此操作的方法是从字符串到集合进行反向查找。
在将字符串插入集合的代码中,您还可以将集合名称插入该字符串的集合中。例如,将字符串bar
插入集合foo:baz
也会导致将值foo:baz
插入到集foo:strings:bar
或类似的内容中。
如果设置数据已经存在,您可以通过迭代每个集合并创建string-> set_name集来运行一次性回填作业。
既然存在这些集合,那么从集合中删除字符串的代码就像:
redis.smembers("foo:strings:#{string}").each do |set|
redis.srem(set, string)
end
您现在不再进行全表扫描键查找。