2012-03-15 23 views
1

私は本当にRedisの新機能で、簡単なタグ機能をキー値ストアとして使用するために、redis gemを使用してRuby on Rails(Rails 2.3およびRuby 1.8.7)アプリケーションと共に使用しています。私は最近、私もそれを使ってユーザーの活動フィードを維持できることに気付きました。Redisの名前空間の基礎

私はタグ付けデータ(キー=>セットとして保存されている)をメモリに保存する必要があります。タグ付け関連の操作の結果を判断することは非常に重要です。最初のアウトベース。すべてのユーザーにX個のアクティビティを保存すると仮定すると、

私はredisデータセットに名前を付けることができ、メモリに永続的に残りの1つをメモリに一時的に残しておくことは可能でしょうか。メモリ内で生存期間が異なる必要のある無関係なデータセットを使用する場合の一般的なアプローチは何ですか?

これについてのご意見は本当にありがたいです。

答えて

5

このために特定の名前空間を定義する必要はありません。 Redisでは、EXPIREコマンドを使用してキーごとにタイムアウトをキーごとに設定できます。キーの有効期限に関する一般的なポリシーを設定ファイルで定義されて

:あなたの目的のために

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory 
# is reached? You can select among five behavior: 
# 
# volatile-lru -> remove the key with an expire set using an LRU algorithm 
# allkeys-lru -> remove any key accordingly to the LRU algorithm 
# volatile-random -> remove a random key with an expire set 
# allkeys->random -> remove a random key, any key 
# volatile-ttl -> remove the key with the nearest expire time (minor TTL) 
# noeviction -> don't expire at all, just return an error on write operations 
# 

、揮発性-LRUポリシーを設定する必要があります。

揮発性にしたいキーでEXPIREを呼び出すだけで、Redisにそれらをエビクトさせる必要があります。ただし、タイムアウトが発生すると、最も古いキーが最初に削除されることを保証することは困難です。詳細な説明here

ただし、特定の使用例については、キーの有効期限は使用しませんが、キャップ付きのコレクションをシミュレートしようとします。指定されたユーザーのアクティビティフィードがオブジェクトのリストとして表されている場合、アクティビティオブジェクトをLPUSHするのは簡単で、LTRIMを使用してリストのサイズを制限します。 FIFOの振る舞いを得て、メモリ消費を無制限に抑えます。

UPDATE:二つの異なるデータベースを使用して

  • :今

    あなたが本当にデータを分離する必要がある場合、あなたはRedisを持つ2つの主要な可能性を持っています。 Redisデータベースは整数で識別され、インスタンスごとに複数のデータベースを持つことができます。データベース間を切り替えるにはselect commandを使用します。データベースを使用してデータを分離することはできますが、異なるプロパティを割り当てることはできません(たとえば、期限切れポリシーなど)。

  • 2つの異なるインスタンスを使用します。空のRedisインスタンスは非常に軽いプロセスです。だから、いくつか問題なく起動することができます。実際には、Redisを使用してデータを分離するための最良かつ拡張性のある方法です。各インスタンスは、独自のポリシー(排除ポリシーを含む)を持つことができます。クライアントはインスタンスと同じ数の接続を開く必要があります。

また、エビクションポリシー要件を実装するためにデータを分離する必要はありません。

+0

ありがとうございましたが、タグ付けに使用されるキーとアクティビティフィードに使用されるキーを分けることができます。これらの鍵が期限切れポリシーによって期限切れにならないようにする方法はありますか?どのように関連していない2つの別々のデータセットを扱う場合、Redisをどのように使用しますか? – Sid

+0

それは私の主張でした:あなたはそれらを分ける必要はありません。期限切れになるコマンドに対してEXPIREコマンドを使用するだけです。実際にデータを分離したい場合、2つのオプションがあります。異なるデータベースまたは異なるインスタンスです。私は自分の答えを更新する。 –