1

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

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

由于使用keys不打算用于生产用途,因此效率低下且不是原子的。鉴于我没有要提前操作的集合的键,有没有更好的方法从所有集合中删除“条”?

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

4

1 回答 1

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
    

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

于 2013-10-24T05:36:53.013 回答