2

私の特定のイベントが発生したら、Ruby on Rails アプリで Ohm ベースのオブジェクトのコンテンツ全体を期限切れにできるようにしたいと考えています。現在これを行うために Redis + expire を結び付けることは可能ですか? Ohm を使用する場合、オブジェクトには、インデックスなどを含む複数のキーが関連付けられています。すべてが適切にクリーンアップされるようにしたいので、これを行う公式にサポートされている方法があるかどうか疑問に思っていました。

4

3 に答える 3

1

Redis を使用して期限切れにするよりも、Ohm オブジェクトを期限切れにするより信頼性の高い方法は、オブジェクトを直接調べて削除することです。たとえば、別の期限切れスレッドを使用します。これにより、モデル オブジェクトを確認し、期限切れのものを検出し、Ohm を介して削除を要求できます。

Ohm は、 Lua スクリプトを使用してアトミックに削除を実行します。これにより、オブジェクトに関連付けられたすべてのキーが正しくクリーンアップされ、他の Ohm 構造からオブジェクトへの参照が削除されます。Ohm 削除を使用することは、クリーンな期限切れのための最良のオプションです。

このような設計を使用することで、パフォーマンスと信頼性のトレードオフが必要になる場合があります。プログラムは基本的に、すべての既知のオブジェクトに対してガベージ コレクションを実行することになります。これには、大量のメモリ アクセスや Redis クエリが必要になる場合があります。

クリーンアップ スレッドがどのように機能するかの例を次に示します。

def start_expiry_thread expiry_cycle

  Thread.new {

    while (true) do

      MyOhmModel.all.each do |object|
        object.delete if object.expired
      end

      sleep expiry_cycle

    end

  }

end

期限切れの関数は、Ohm::Timestamps モジュールのサポートにより、(継承または mixin を介して) Ohm モデル クラスの次の行に沿って実装できます。

@max_life = 3600

def expired            
    (time_since_update > @max_life)
end

def time_since_update
    updated_secs = self.updated_at.to_i
    (Time.now.to_i - updated_secs)
end

ノート:

  • スレッド化を導入するときは注意してください - ロックを使用して、2 つのスレッドによる同じオブジェクトへの同時アクセスを防ぐか、単純に共有オブジェクトを避けて、期限切れスレッドを直接 Redis に移動させます。

  • アプリケーション プロセスに定期的な再起動がスケジュールされている場合は、他のワーカー スレッドが開始される前に、スタートアップ プロセス中にクリーンアップを実行することもできます。

  • 他のアプリケーション コードが有効期限を適切に処理するようにしてください。基盤となる Redis オブジェクトはなくなります。つまり、アプリケーション コードが保持する同等のオブジェクトはすべて無効になります。

  • 上記は本番システムのコードの簡略化されたバージョンであるため、簡略化中にバグが入り込んだ可能性があります。

  • また、より一般的に言えば、オームが本当に必要かどうかを確認してください。キー値ストアの上にリレーショナル レイヤーに相当するものを追加することを検討している場合は、システムの技術的な設計について十分に検討する必要があります。

于 2014-09-11T22:12:53.107 に答える
0

私はそれを処理するオームのための宝石を開発しました。

見てみましょう:オーム-有効期限

于 2012-05-16T13:07:48.503 に答える