2012-04-23 7 views
1

私はRedisでいくつかの書き込み制約を設定したいので、これらの制約をハッシュに格納することを考えていました。Redisでローカルクライアントとリモートクライアントを持っている

私の最初のアイデアは、Redisで書き込む前にルールをチェックするようにsetコマンドを変更することでした。私はこの方法でチェックが超高速になると考えていました。もちろん、そのようなアプローチでは、レディスが変更されるたびに多くの修正が必要になります。レディスは、学校の割り当てに関するものだと思えば、ちょっとハードコアになります。

2番目の考えは、2種類のRedisクライアントがあることです。 1つはWebアプリケーション側(Webアプリケーションの複数のインスタンス)で、もう1つはRedisマシン上です。この考えに基づいて私の質問が来る。

  1. (ローカルおよびリモート)2つのクライアントが最初にチェックすることを1つのクライアントに制約をcomparissonでのパフォーマンスが増加し、その後のRedisに書いていますか?または、私はそれをすべて行う1つのクライアントに固執すべきですか(phpredisまたはpredis、アプリケーションはPHP上にあり、制約チェックのためにいくつかの変更が加えられています)。

  2. 2人のクライアントを試してみると、どのプログラミング言語でローカルクライアント(C、Luaなど)を実装する方が良いでしょうか?

答えて

2

よりもむしろRedisの行動そのものを変更しようと、私は、サーバー側のLuaスクリプト(Redisの2.6分岐が必要)に制約を実装するために最初にしようとするだろう。

実際の書き込み操作を行う前に、Lua EVALスクリプトはRedisに既に格納されているデータを使って簡単にいくつかのチェックを実行できます。

ここは例です。銀行口座を表す2つの鍵があり、アカウント間で安全な取引を実装する必要があるとします。たとえば、両方のアカウントが存在し、ソースアカウントに必要な資金が含まれていることを確認する必要があります。 http://redis.io/commands#scripting(最初EVALコマンドを参照してください):

# set 2 accounts for John and Bob 
set account:john 100 
set account:bob 20 

# transfer $10 from John to Bob, checking all constraints 
eval "if redis.call('exists',KEYS[2])==1 and redis.call('get',KEYS[1])>=ARGV[1] then 
     redis.call('incrby', KEYS[2], ARGV[1]) 
     redis.call('incrby', KEYS[1], - ARGV[1]) 
     return 1 
     else 
     error('invalid transaction') 
     end" 2 account:john account:bob 10 

あなたは、Redisのスクリプト機能に関するドキュメントを検索します。

Redis 2.6を使用できない場合、最初の質問に答えるために、ローカルクライアントは、(TCPオーバーヘッドを迂回して)Unixドメインソケットを使用してRedisに接続し、いくつかのネットワークラウンドトリップを保存できるため、しかし、これは余分な複雑さの代償です。

+0

私は2.6ブランチをダウンロードしました。私は簡単な例で評価を試みましたが、うまくいくようです。今私は自分の制約チェックの実装をしなければならない。迅速な回答と理解しやすい例をありがとう!!! –

関連する問題