スピードリミッターを達成するための方法をいくつかのRedis。
GET + INCR + EXPIRE
上限を超えていない場合まず、キーの現在の値を取得し、キーは、Redisのトランザクションの使用存在し、鍵の有効期限を初期化しない場合INCRを1だけ増加実行します。
擬似コード:
= redis.GET(キー)をカウント する場合Redisのリターンゼロ{ redis.MULTI redis.INCR(キー) redis.EXPIRE(キー、expire_time) redis.EXECの カウント= 1 } カウント>限界{場合 リターン超出限制 } {他 のRedis。 INCR(キー) }
高並行性の問題の下で:
両方の10の同時プログラム実行のGETはnilを返す場合、このプログラムは、10同時実行Redisのトランザクションがキーを追加しますになりますが、限界値のセットは、その後、実際の実行10未満である場合には、各プログラムのカウント値は、1ですプログラムは、制限を超えました。あなたは、各プログラムは、すべての戻り10は、そう何のプログラムを継続することはできませんすることができるように、、カウントするために割り当てられたのRedis一度調査した後、トランザクションを完了した場合は。
最初のGET INCRロジックはまた、より多くのプログラム限度が表示されますが、実際の実装の数よりもケースかもしれ後ケースキーがすでに存在します。
INCR + EXPIRE
1の値が設定されているだけのキーを示している場合INCRまず、この時間が期限切れに実行します
擬似コード:
カウント= redis.INCR(キー) カウント== 1 {場合 redis.EXPIRE(キー、expire_time) } カウント>限界{場合 リターン超出限制 }
注意
INCRプログラムハング、無実行後に失効した場合、そのキーには有効期限が、需要に応じて特定の効果はありません。
LUAスクリプト
局所電流 電流= redis.call( "INCR"、KEYS [1]) ==(電流)TONUMBERが1次に場合 redis.call( "期限切れ"、KEYS [1]、1) 端
より多くの情報を学び、ご覧ください。
Yaezakura:テンセントT3-T4標準ブティックDaquanのPHPアーキテクトチュートリアルディレクトリには、限り、あなたは保証賃金を読むと、より高いレベル(継続的に更新)に上昇します