2013-10-24 67 views
1

我有一個將數據存儲在Redis中的程序。在命名空間「foo」下的密鑰中存儲有任意數量的組,即,keys foo:*將返回組的密鑰列表。我想從名稱空間中包含它的所有集合中刪除字符串「bar」。本質上(這是紅寶石):Redis:從所有集合中刪除特定值

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

由於使用的keys,這不適用於生產使用,這是低效的,而不是原子。鑑於我沒有提前想要操作的套件的鑰匙,是否有更好的方法去除所有套件中的「bar」?

如果這是處理原子性並使其具有高性能的唯一方法,那麼可以使用Lua腳本。

回答

5

這樣做的方法是從字符串進行反向查找。

  • 在將字符串插入到集合的代碼中,還需要將集合名稱插入到該字符串的集合中。例如,將字符串bar插入到集合foo:baz中也會導致將值foo:baz插入到集合foo:strings:bar或類似內容中。

    如果設置的數據已經存在,您可以通過遍歷每個集合並創建字符串 - > set_name集來運行一次性回填作業。

  • 現在,那些套在那裏,你從集合移除的字符串編碼是一樣的東西:

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

您現在已經不再做全表掃描鍵查找。