Redis は、高性能かつ軽量という優れた機能により、インターネット企業の標準キャッシュとなっていますが、主に Redis が頻繁に使用されるシナリオでは、カスタム コマンドを追加したい場合があります。 , 駆け込み購入のシナリオのように、複数の Redis コマンドのトランザクション性を保証する必要があるため、適切なアトミック性が保証されていない場合、データの不整合の問題が発生しやすくなります。
正式なトランザクションプランは与えられていますが、次のステップに進む前に特定のコマンドの戻り値に基づいて判断する必要がある場合、トランザクションプランでは対応できません。
今日は、実際的なケースを使用して Redis コマンドを追加する方法を説明します。このコマンドは主にアンチスワイプ シナリオで使用されます:
特定の IP またはこのコマンドを使用しない場合、解決策は次のようになります:
最初に incr を実行し、次にそれが 1 であるかどうかを判断します。1 である場合は、有効期限を設定します。高い同時実行中に incr リクエストを開始した最初のクライアントがハングアップしても、キーは期限切れにならないことがわかります。
今日記述するコマンドは、このトランザクションを保証するために使用されます。サーバー側は、キーの値が 1 の場合に有効期限が設定されていることを確認します。
コマンドの使用法は次のとおりです:
incexpire key expireTime maxNum
key: 処理するキー
expireTime: 有効期限 (秒単位) 10 と書くと、キーの有効期限は 10 秒です。;
maxNum: 増加が止まるまで増加する量を示します。10 に設定すると、返される最大値は 11 になります。11 が返されるということは、それを超えたことを意味します;
2. コマンドの作成
1. Redis コードのダウンロード
この記事で使用されている Redis のバージョンは 3.2.11;
コードをダウンロードコマンドコードの記述と追加
1) src/server.c の redisCommandTable 構造に新しいコマンドを追加します
git clone https://github.com/antirez/redis
redisCommandTable は配列で、各項目は redis コマンドを表し、1 つ目はコマンドを表します 2 つ目は実際の処理関数、3 つ目はパラメータの数です その他については詳しく説明しません。
2) src/server.h に関数宣言を追加します:
struct redisCommand redisCommandTable[] = {
3) 次に、ファイルを ljh.c (自分で名前を付けます) として追加し、次のコードを追加します。
void incrExpireCommand(client *c);4) 新しいファイル ljh.o を src/Makefile に追加します
#include "server.h"実行結果は次のとおりです
実行後に確認できます。 key1 が 11 に増加します。それ以上増加しなくなり、10 秒後に再び 1 になります。
最後に、このシナリオに Redis コマンドを追加する必要があるかどうかを自問する必要があります。必要に応じて、各層間の責任を把握し、Redis に業務処理をさせないようにする必要があります。一般的には、ミドルウェア層は通常、より一般的な機能を処理し、下位層はより安定し、変更が少なくなるのが通常の状況であると氏は述べています。 さらに関連する知識については、redis 入門チュートリアル
columnを参照してください。
以上がredisコマンドを追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。