redis原子間読み書き操作のLUAスクリプトとwatchメカニズム
1932 ワード
最近、電子商取引プラットフォームのサブシステムであるメモリカードシステムを開発し、システムの核心業務は金額消費と在庫制御に関連しているため、メモリ上で高い同時状況に構築された事務制御を解決するためにspringパッケージのRedisTemplateを使用してluaスクリプトを実行し、金額消費を確保し、在庫を順番に処理し、資源争いを解決した.
1.luaスクリプトの使用
Redisは、単一のLuaインタプリタを使用してすべてのスクリプトを実行します.また、Redisは、スクリプトが実行中の場合、他のスクリプトまたはRedisコマンドが実行されないことを保証します.これはMULTI/EXECで囲まれたトランザクションと似ています.他のクライアントから見れば、スクリプトの効果(effect)は非表示(not visible)か、完了(already completed)かのいずれかです.
一方、これは、実行が遅いスクリプトを実行するのは良いアイデアではないことを意味します.スクリプトの実行コスト(overhead)が非常に少ないため、走るのが速いスクリプトを書くのは難しくありませんが、走るのが遅いスクリプトを使用しなければならない場合は、これらのカタツムリスクリプトがゆっくりと実行されている間に、他のクライアントがサーバが忙しいためコマンドを実行できないので注意してください.
2.watchメカニズムの実現
WATCH key [key ...]
1つ(または複数)のkeyを監視し、トランザクションが実行される前に他のコマンドで変更された場合、トランザクションは中断されます.
MULTI
トランザクション・ブロックの開始をマークします.
トランザクションブロック内の複数のコマンドは、前後順に1つのキューに格納され、最後にEXECコマンドによって原子的に実行されます.
EXEC
すべてのトランザクションブロック内のコマンドを実行します.
ある(またはある)keyがWATCHコマンドの監視下にあり、トランザクションブロックにこの(またはこれらの)keyに関連するコマンドがある場合、EXECコマンドは、この(またはこれらの)keyが他のコマンドによって変更されていない場合にのみ実行され、有効になります.いいえ、トランザクションは中断されます.
例:
転載先:https://www.cnblogs.com/cl2Blogs/p/6097206.html
1.luaスクリプトの使用
Redisは、単一のLuaインタプリタを使用してすべてのスクリプトを実行します.また、Redisは、スクリプトが実行中の場合、他のスクリプトまたはRedisコマンドが実行されないことを保証します.これはMULTI/EXECで囲まれたトランザクションと似ています.他のクライアントから見れば、スクリプトの効果(effect)は非表示(not visible)か、完了(already completed)かのいずれかです.
一方、これは、実行が遅いスクリプトを実行するのは良いアイデアではないことを意味します.スクリプトの実行コスト(overhead)が非常に少ないため、走るのが速いスクリプトを書くのは難しくありませんが、走るのが遅いスクリプトを使用しなければならない場合は、これらのカタツムリスクリプトがゆっくりと実行されている間に、他のクライアントがサーバが忙しいためコマンドを実行できないので注意してください.
2.watchメカニズムの実現
WATCH key [key ...]
1つ(または複数)のkeyを監視し、トランザクションが実行される前に他のコマンドで変更された場合、トランザクションは中断されます.
MULTI
トランザクション・ブロックの開始をマークします.
トランザクションブロック内の複数のコマンドは、前後順に1つのキューに格納され、最後にEXECコマンドによって原子的に実行されます.
EXEC
すべてのトランザクションブロック内のコマンドを実行します.
ある(またはある)keyがWATCHコマンドの監視下にあり、トランザクションブロックにこの(またはこれらの)keyに関連するコマンドがある場合、EXECコマンドは、この(またはこれらの)keyが他のコマンドによって変更されていない場合にのみ実行され、有効になります.いいえ、トランザクションは中断されます.
例:
#
redis> MULTI
OK
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
# key ,
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "huangz"
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC
1) OK
2) (integer) 1
# key ,
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "joe" # , lock_times
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC # lock_times , joe
(nil)
転載先:https://www.cnblogs.com/cl2Blogs/p/6097206.html