我有一个在 Redis 中存储数据的程序。在命名空间“foo”下的键中存储了任意数量的集合,即 keys foo:*
将返回集合的键列表。我想从命名空间中包含它的所有集合中删除字符串“bar”。本质上(这是在 Ruby 中):
redis.keys("foo:*").each do |key|
redis.srem(key, "bar")
end
由于使用了 keys
,它不是为生产使用而设计的,这是低效的并且不是原子的。鉴于我事先没有要操作的集合的 key ,是否有更好的方法从所有集合中删除“bar”?
如果 Lua 脚本是处理原子性并使其高效的唯一方法,我会接受它。
最佳答案
执行此操作的方法是从字符串到集合进行反向查找。
在将字符串插入集合的代码中,您还将把集合名称插入到该字符串的集合中。例如,将字符串
bar
插入集合foo:baz
也会导致将值foo:baz
插入集合foo:strings :bar
或类似的东西。如果集合数据已经存在,您可以通过迭代每个集合并创建 string->set_name 集合来运行一次性回填作业。
现在这些集合已经存在,从集合中删除字符串的代码类似于:
redis.smembers("foo:strings:#{string}").each do |set| redis.srem(set, string) end
您现在不再进行全表扫描键查找。
关于Redis:从所有集合中删除特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19556779/