Webアプリケーションの(ほぼ)各リクエストにロードするデータの小さなチャンクのSQL依存関係を削除したいと思います。ほとんどのデータはKey-Value/ドキュメント構造ですが、リレーショナルソリューションは除外されていません。データはそれほど大きくないので、可用性を高めるためにメモリに保持したいと思います。
どのような解決策をお勧めしますか?
Webアプリケーションの(ほぼ)各リクエストにロードするデータの小さなチャンクのSQL依存関係を削除したいと思います。ほとんどのデータはKey-Value/ドキュメント構造ですが、リレーショナルソリューションは除外されていません。データはそれほど大きくないので、可用性を高めるためにメモリに保持したいと思います。
どのような解決策をお勧めしますか?
最も単純で最も広く使用されているメモリ内のKey-ValueストレージはMemcacheDです。紹介ページはあなたが求めているものを繰り返します:
Memcachedは、データベース呼び出し、API呼び出し、またはページレンダリングの結果からの任意のデータ(文字列、オブジェクト)の小さなチャンク用のメモリ内のKey-Valueストアです。
クライアントリストは印象的です。久しぶりです。良いドキュメント。ほぼすべてのプログラミング言語用のAPIがあります。水平方向のスケーリングは非常に簡単です。私の経験では、Memcachedは優れています。
MemBaseを調べることもできます。
Redisはこの種のデータに最適です。また、いくつかの基本的なデータ構造をサポートし、それらに対する操作を提供します。
私は最近、Djangoフォーラムアプリをすべてのリアルタイム/トラッキングデータに使用するように変換しました-SET views = views + 1
リレーショナルでこの種のこと(およびすべてのページビューで他の書き込み)を行うときに感じる不快感がなくなるのはとても良いことですデータベース。
次に、Redisを使用して、Pythonで最後に表示されたユーザーの順序セットを最新の状態に保つなど、ユーザーアクティビティの追跡に必要なデータを保存する例を示します。
def seen_user(user, doing, item=None):
"""
Stores what a User was doing when they were last seen and updates
their last seen time in the active users sorted set.
"""
last_seen = int(time.mktime(datetime.datetime.now().timetuple()))
redis.zadd(ACTIVE_USERS, user.pk, last_seen)
redis.setnx(USER_USERNAME % user.pk, user.username)
redis.set(USER_LAST_SEEN % user.pk, last_seen)
if item:
doing = '%s <a href="%s">%s</a>' % (
doing, item.get_absolute_url(), escape(str(item)))
redis.set(USER_DOING % user.pk, doing)
SQLを気にしないが、データベースをメモリに保持したい場合は、sqliteをチェックアウトすることをお勧めします(http://www.sqlite.org/inmemorydb.htmlを参照)。
SQLが不要で、実際にはキーと値のペアしかない場合は、それらをマップ/ハッシュ/連想配列に格納して、それで済ませてみませんか?
インメモリ データベースが必要になった場合、H2は非常に優れたオプションです。
考慮すべきもう 1 つのデータベース: Berkeley DB。Berkeley DB では、データベースをインメモリ、オンディスク、またはその両方に構成できます。キー値 (NoSQL) と SQL API の両方をサポートしています。Berkeley DB は、組み込まれていて、簡単にデプロイでき (アプリケーションと共にデプロイされます)、高度に構成可能で、信頼性が高いため、Web アプリケーションと組み合わせて使用されることがよくあります。Amazon.com など、e コマース アプリケーションを Berkeley DB に依存している e-Retail Web サイトがいくつかあります。
これがあなたが探しているものかどうかはわかりませんが、キャッシングフレームワーク(現在使用しているツールに含まれている可能性のあるもの)を調べる必要があります。データを要求するリポジトリパターンを使用して、キーごとにデータがキャッシュにあるかどうかを確認します。私はしません、あなたはそれをデータベースからフェッチします、もしそうなら、あなたはそれをキャッシュからフェッチします。
処理するデータの種類によって異なるため、データをキャッシュに保持する期間はユーザーが決定します。キーが要求され続ける限りデータを保持するので、おそらくスライディングタイムアウトが最適です。つまり、キャッシュにユーザーのデータがある場合、ユーザーが離れると、データはキャッシュから期限切れになります。