2012-01-18 11 views
4

どのユーザーがどのページを何回訪問したかを把握する必要があります。Redis/Memcached/MongoDB(または任意のNoSQLシステム)は、MySQLの重複したキー更新をサポートしていますか?

は、MySQLでは、私はこのような何かをしたい:

INSERT INTO stats (user_id, url, hits) 
VALUES (1234, "/page/1234567890", 1) 
ON DUPLICATE KEY UPDATE hits = hits + 1; 

を表でstats(user_id, url)は、私は、この目的のために最速のシステムを見つけるために探していますUNIQUE

です。これは統計のためのものなので、耐久性を維持することは重要ではありません。

RedisやMongoDB、MemcachedなどのNoSQLシステムは、このような機能をサポートしていますか?どのように最高のパフォーマンスを得るためにこれを実装しますか? MongoDBので

答えて

9

同等の概念はupsert(詳細情報here。)と呼ばれている

これは、基本的意味:「、それが存在する場合、このキー - との文書を探して行くこの更新プログラムを適用することがない場合。それを作成し、このアップデートを適用してください。

だから例えば、あなたのケースであなたはMongoの中でこのような何かを行うことができます:

db.stats.update({user_id:1234, url:"/page/1234567890"}, {$inc:{hits:1}}, true)

(空のDBに)呼び出される。この最初の時間を、それがこの文書を挿入します:

{user_id:1234, url:"/page/1234567890", hits:1}

その後の呼び出しでは、単にhitsの値が増えます。

Redisでは、Redis INCRコマンドを使用するだけで、これを達成できます。ここでは、キーは固有のものとして修飾するために必要な値に基づいています。 INCRへの最初の呼び出しは、まだ存在しない場合は値を1に設定するだけです。たとえば、次のように

INCR "uid:1234:url:/page/1234567890" 
> 1 
INCR "uid:1234:url:/page/1234567890" 
> 2 

など

最高のパフォーマンスのためにこれを実装する方法については、これはあなたが「パフォーマンス」とどのようなユースケースがあることで何を意味するかに依存します。たとえば、Redis INCRコマンドを使用すると、MongoDBよりもコマンドが高速になる可能性がありますが、データモデルの柔軟性だけでなく、インデックスやクエリの機能を犠牲にします。これらは、あなたの特定の状況に基づいて決定する必要があるトレードオフです。

+0

ありがとうございました! Mongoはquadcoreコモディティサーバ上で何秒間に何アップ秒を稼ぐことができますか?あなたの経験は何ですか? – Continuation

+0

スキーマ設計、RAMの量、データセットのサイズ、およびその他の要因によって大きく異なるため、意味のある答えはありません。あなたの最善の策は、あなたのアプリケーションがパフォーマンスを評価するために行うことを真似る簡単なベンチマークテストを書くことです。 – mpobrien

+0

@Continuationでは、間違いなくベンチマークを行う必要があります。また、MongoDBは異なるレベルの「書き込み懸念」または「書き込み安全」を持っていることにも注意してください。デフォルトでは、ほとんどのドライバーは本当に高速ですが、重複したキー*のようなエラーをスローしません。ベンチマーク時に適切なレベルのデータ安全性をテストしていることを確認してください。 –

関連する問題