Redis:从所有集中删除特定值

时间:2013-10-24 04:11:53

标签: redis

我有一个程序可以在Redis中存储数据。在命名空间“foo”下的密钥中存储了任意数量的集合,即keys foo:*将返回集合的密钥列表。我想从名称空间中包含它的所有集合中删除字符串“bar”。基本上(这是在Ruby中):

redis.keys("foo:*").each do |key|
  redis.srem(key, "bar")
end

由于keys的使用不适合生产使用,因此效率低且不是原子的。有没有更好的方法从所有套件中删除“bar”,因为我没有提前操作的套件的按键?

如果这是使用原子性并使其具有高效性的唯一方法,那么我可以使用Lua脚本。

1 个答案:

答案 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
    

您现在不再进行全表扫描键查找。