読者です 読者をやめる 読者になる 読者になる

【fuelphp】Redisでロック・排他制御する方法メモ

APIの実装でクライアントからの2重送信対策にRedisを使ってみた。
MySQLでやろうとも思ったのだが負荷のことを考えるとRedisの方がいいのかなという判断。

$token = クライアントから送られるトークン 

$redis = Redis::forge();
if (1 === $redis->setnx($token, 1)) {
  // ロックに成功したら有効期限に1分をセット                                                                                                                                                                 
  $redis->expireAt($token, time() + 60);
} else {
  // ロックに失敗(同じキーが登録済み)なら処理中断                                                                                                                                                                  
}

当初は$redist->get($key)で取得できたら、2重送信と判定していたのだがこれだと全く同タイミングだと正しく判定できない(排他制御できてない)。で、ググてみるとsetnxを使えとのことでした。動作確認したら期待通りの挙動となりました。以上です。