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

标签 redis

我有一个在 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/

相关文章:

c# - StackExchange.Redis 支持 ZPOP?

tomcat - Groovy Redis 插件超时问题

docker - docker compose up 后后端到 redis 连接被拒绝

amazon-web-services - Redis——它是如何提高性能的?

c# - 未找到 ConnectionMultiplexer.cs

redis - 为什么Redis不接受slaveof命令?

redis - redis 集群中的哈希槽是什么意思?

spring-boot - RedisMessageListenerContainer : Connection failure occurred. 5000 毫秒后重新启动订阅任务

performance - Redis Twitter Clone 有N+1 Get?

node.js - 配置Express网关以使用Redis