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が他のコマンドによって変更されていない場合にのみ実行され、有効になります.いいえ、トランザクションは中断されます.
例:
  
  #        

  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