コンピュータあれこれ、の備忘録です。commentPHPの有名なRedisライブラリPHPRedisのLuaの書き方をいつも忘れるので書き残しておきます。Luaを使えばアトミックになるのでそれなりに使う機会はあると思います。コードを下記に置いておきました、一目瞭然かと思いますが、説明しますと、evalの引数は必須がひとつ、オプションが2つあります。必須はLuaスクリプト、オプションのひとつはarray、オプションのもう一つはarrayの要素数です。Clusterを使わない限りは、RedisのLuaにおけるKEYSとARGVに違いはありません、詳しくはこの記事の前の記事を参照してください)。&quot;key3&quot;}おまけ内部でRedisを呼ぶには次のようにします。int(0)}HMSETについては、以下のようにやればできます。comment結論から言いますと、通常の使い方の場合は違いを意識する必要はないようです。Clusterなどのときのようです。RedisのLua機能で、引数を使えるのですが、KEYSとARGVという2つの変数を渡すことが出来ます。それはそれでいいんですが、KEYSとARGVの違いが分かりません。使い分けなどあるのでしょうか。...).http://redis.io/commands/evalこんな感じです。うーん、違いが分かりませんね。Groupにありました。Clusterやシャーディングのときに使うみたいですね。言えなぜそのときに2つの変数が必要になるのか私にはいまいち分かりませんが。分散一意IDの発行みたいなのは出来ない(emailとかusernameみたいな一意なやつを書きたい)↓Redisでロック・アンロックして、一意性のある書き込みの場合はたくさんのDB鯖に書き込めるプロセスを一個にしようという動機でRedisを使ったlock/unlockメソッドを書いてみました。詳しくはソース内↓に書いてます。苦労しました(ヽ’ω`)。ロック周りは大変ですね。これが正解かは分かりません(というかCAP定理より全部を満たすことは出来ないですね)。ロック用Redisサーバーを専用に用意する必要があるかと思います。いうのも、これはロックを得るための待ち行列ができるからです。monitor」としてみると、アクセスがたくさんあるのが分かるかと思います。PHPとRedisを用いてロックを実現するメソッドと使用例。分散された複数のデータベースサーバーについて、一貫性のある書き込みやupdateを行うために、Redisをロックサーバーとして用いる。lockとunlockメソッドがある。使用する際は、lockメソッドでロックしてから、書き込みやアップデートして、後始末としてアンロックする。具体的な使い方は下記にある。デッドロック回避のためにタイムアウトが指定されている。他のプロセスやスレッドがロックしてアクセスしてきて、一貫性が乱れる可能性がある。設定した時間を超えるとFALSEが返ることがある。今回の場合は、1sec掛かる処理を行っており、DB_LOCK_TIMEOUT_TOO_BUSY_SECは10である。並列プロセス数10程度でロック取得失敗が起きる可能性がある。プロセスがロックがあるかどうかとDB_LOCK_WAIT_MSの周期でRedisに尋ねるので、Redisの負担になる。大きすぎず小さすぎずの値にしておくべきだと思う。0.1secつまり100msあたりが妥当かと。定量的に考えてみる、一般的なマシンでRedisは10万req/sec程度さばくことが出来る。1プロセスあたりの1秒間のrequestは1000/DB_LOCK_WAIT_MS。10並列のプロセスで100req/sec、100並列で1000req/secとなる。しておけば大きな負荷にはならないだろう。DB_LOCK_WAIT_MSの最小値は10と考えられる。これ以下にすると危険であろう。レイテンシが求められるわけでもないのであれば、結局最初に書いた通り100に設定するのが妥当。ロックのためのkeyとvalueを書き込んでいるが、valueが必要かどうか良く分からない。unlockではvalueの値を確認して削除しているが、必要なのかどうか。valueは必要ない気がする。消してみたら何かおかしくなった。valueは残しておく。することで、Redisへの命令とその時間を眺めることが出来る。