【问题标题】:Redis: Remove a specific value from all setsRedis:从所有集合中删除特定值
【发布时间】:2013-10-24 13:43:21
【问题描述】:

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

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

由于使用了keys,它不适合生产使用,因此效率低下且不是原子的。考虑到我没有要提前操作的集合的键,有没有更好的方法从所有集合中删除“bar”?

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

【问题讨论】:

    标签: redis


    【解决方案1】:

    这样做的方法是从字符串到集合进行反向查找。

    • 在将字符串插入集合的代码中,您还可以将集合名称插入该字符串的集合中。例如,将字符串bar 插入集合foo:baz 也会导致值foo:baz 插入集合foo:strings:bar 或类似的东西。

      如果集合数据已经存在,您可以通过迭代每个集合并创建 string->set_name 集合来运行一次性回填作业。

    • 现在这些集合已经存在,您从集合中删除字符串的代码类似于:

      redis.smembers("foo:strings:#{string}").each do |set|    
        redis.srem(set, string)
      end
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-29
      • 2016-07-13
      • 2013-05-01
      • 2018-09-17
      • 2017-11-17
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多