Redis:从所有集合中删除特定值
我有一个在Redis中存储数据的程序。命名空间“foo”下的键中存储了任意数量的集合,即Redis:从所有集合中删除特定值,redis,Redis,我有一个在Redis中存储数据的程序。命名空间“foo”下的键中存储了任意数量的集合,即keys foo:将返回集合的键列表。我想从名称空间中包含字符串“bar”的所有集合中删除该字符串。本质上(这是在Ruby中): 由于使用了不用于生产的键,这是低效且不原子的。考虑到我事先没有想要操作的集合的键,有没有更好的方法从所有集合中移除“bar”呢 如果这是处理原子性并使其具有性能的唯一方法,我可以使用Lua脚本。这样做的方法是从字符串到集合进行反向查找 在将字符串插入到集合中的代码中,还需要将集合
keys foo:
将返回集合的键列表。我想从名称空间中包含字符串“bar”的所有集合中删除该字符串。本质上(这是在Ruby中):
由于使用了不用于生产的键
,这是低效且不原子的。考虑到我事先没有想要操作的集合的键,有没有更好的方法从所有集合中移除“bar”呢
如果这是处理原子性并使其具有性能的唯一方法,我可以使用Lua脚本。这样做的方法是从字符串到集合进行反向查找
- 在将字符串插入到集合中的代码中,还需要将集合名称插入到该字符串的集合中。例如,将字符串
插入集合bar
也会导致将值foo:baz
插入集合foo:baz
或类似内容 如果集合数据已经存在,您可以通过迭代每个集合并创建字符串->集合\名称集合来运行一次性回填作业foo:strings:bar
- 现在这些集合已经存在,用于从集合中删除字符串的代码如下所示:
redis.smembers("foo:strings:#{string}").each do |set| redis.srem(set, string) end
您现在不再进行全表扫描键查找。方法是从字符串到集合进行反向查找
- 在将字符串插入到集合中的代码中,还需要将集合名称插入到该字符串的集合中。例如,将字符串
插入集合bar
也会导致将值foo:baz
插入集合foo:baz
或类似内容 如果集合数据已经存在,您可以通过迭代每个集合并创建字符串->集合\名称集合来运行一次性回填作业foo:strings:bar
- 现在这些集合已经存在,用于从集合中删除字符串的代码如下所示:
redis.smembers("foo:strings:#{string}").each do |set| redis.srem(set, string) end