1

Redis にデータを保存するプログラムがあります。名前空間「foo」の下のキーには、任意の数のセットが格納されます。つまりkeys foo:*、セットのキーのリストが返されます。名前空間内に含まれるすべてのセットから文字列「bar」を削除したいと考えています。基本的に(これはRubyにあります):

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

を使用しているkeysため、本番環境での使用が意図されていないため、これは非効率的で原子的ではありません。事前に操作したいセットのキーを持っていない場合、すべてのセットから「バー」を削除するより良い方法はありますか?

それが原子性を処理し、パフォーマンスを向上させる唯一の方法である場合は、Lua スクリプトを使用しても問題ありません。

4

1 に答える 1

5

これを行う方法は、文字列からセットへの逆ルックアップを行うことです。

  • 文字列をセットに挿入するコードでは、セット名もその文字列のセットに挿入します。たとえば、文字列barをセットに挿入すると、セットなどfoo:bazに値が挿入されます。 foo:bazfoo:strings:bar

    セット データが既に存在する場合は、各セットを反復処理して string->set_name セットを作成するだけで、1 回限りのバックフィル ジョブを実行できます。

  • これらのセットがあるので、セットから文字列を削除するコードは次のようになります。

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

現在、完全なテーブル スキャン キー ルックアップを行っていません。

于 2013-10-24T05:36:53.013 に答える