非同期キューを実装するための Redis メソッドとアプリケーション例

WBOY
リリース: 2023-05-11 15:27:06
オリジナル
1684 人が閲覧しました

Redis は、高性能のメモリベースのキーと値のストレージ データベースです。キーと値のペアの保存をサポートするだけでなく、リスト、セット、ソートされたセット、ハッシュなどの複雑なデータ構造もサポートします。 List データ構造は、両端で要素の挿入と削除をサポートしているため、非同期キューのデータ構造として非常に適しています。この記事では、Redis を使用して非同期キューを実装する方法とアプリケーション例を紹介します。

1. Redis が非同期キューを実装する方法

Redis の List は両端での要素の挿入と削除をサポートしていますが、その特殊な実装により、すべての操作が O( 1) 複雑さ。たとえば、List に多数の要素がある場合、要素を削除する場合、List 全体を走査して検索する必要があり、時間計算量は O(N) になります。したがって、非同期キューを実装するときは、次の点に注意する必要があります。

  1. LPUSH および BRPOP コマンドを使用する

非同期キューを実装するときは、次の点に注意する必要があります。 LPOP および RPUSH コマンドの使用を避け、代わりに LPUSH および BRPOP コマンドを使用してください。 LPOP および RPUSH コマンドはリストの両端で要素を挿入および削除するため、リスト内に多数の要素がある場合、各操作はリスト全体を走査する必要があり、比較的非効率的です。一方、LPUSH および BRPOP コマンドは Redis のブロックを使用します。機能が実装されています。リストが空の場合、BRPOP コマンドはリストに要素が存在するまで待機し、ポップされた要素を返します。これにより、リスト全体を走査する必要がなくなり、効率が大幅に向上します。

  1. 適切なタイムアウト期間を設定する

BRPOP コマンドを使用する場合、プログラムが常にブロックされないようにするために、適切なタイムアウト期間を設定する必要があります。一般に、プログラムが新しい要素が追加されたかどうかを迅速に検出できるように、1 秒などの比較的短いタイムアウトを設定できます。同時に、タイムアウト時間を短く設定しすぎると、BRPOP コマンドが頻繁に実行され、Redis サーバーの負荷が増加する可能性があることにも注意する必要があります。

  1. 複数のリストの使用

同時実行パフォーマンスを向上させるために、複数のリストを使用できます。各リストはタスクの一部を格納する役割を果たします。データシャーディングの効果を高めるために、異なるタスクを異なるリストに配置できます。同時に、各リストは独立したコンシューマ スレッドを持つこともでき、タスクを消費するときに並行して実行できるため、システム全体の同時実行パフォーマンスが向上します。

2. Redis 非同期キューのアプリケーション例

以下に、SMS 認証コードの送信に使用される Redis 非同期キューを使用したアプリケーション例を示します。このアプリケーションでは、送信する SMS 確認コードを携帯電話番号に従って複数のリストに分割し、リストごとにコンシューマ スレッドを開始して SMS メッセージを送信できます。具体的な実装プロセスは次のとおりです。

  1. Redis 接続の作成

Java 言語を使用して Redis サーバーに接続します。コードは次のとおりです:

Jedis jedis = new Jedis("localhost", 6379);
ログイン後にコピー
  1. タスクの追加

送信する SMS 確認コードを対応するリストに追加します。コードは次のとおりです:

jedis.lpush(mobile, code);
ログイン後にコピー

ここで、mobile は携帯電話番号です。 code は確認コードです。

  1. 消費タスク

各リストの消費者スレッドを開始して SMS メッセージを送信します。コードは次のとおりです:

new Thread(new SmsSender(jedis, mobile)).start();
ログイン後にコピー

その中に、SmsSender class は SMS の送信に使用され、コンストラクター パラメーター jedis は Redis サーバーへの接続に使用され、mobile は処理する必要があるリストの指定に使用されます。

  1. コンシューマ スレッドの実装

コンシューマ スレッドは、BRPOP コマンドを通じてリストから送信する必要がある検証コードを取り出し、サードパーティの SMS を呼び出します。それを送信するための送信インターフェイス。コードは次のとおりです。

public class SmsSender implements Runnable {
    private Jedis jedis;
    private String mobile;
    public SmsSender(Jedis jedis, String mobile) {
        this.jedis = jedis;
        this.mobile = mobile;
    }
    @Override
    public void run() {
        while (true) {
            List<String> codes = jedis.brpop(1, mobile);
            if (codes != null) {
                String code = codes.get(1);
                // 调用第三方短信接口发送验证码
                sendSms(mobile, code);
            }
        }
    }
}
ログイン後にコピー

1 秒のタイムアウトは、実際のニーズに応じて調整できます。

概要

この記事では、Redis を使用して非同期キューを実装する方法を紹介し、実際のアプリケーション例を示します。非同期キューを実装する場合は、同時実行パフォーマンスを向上させるために、LPUSH および BRPOP コマンドの使用、適切なタイムアウトの設定、および複数のリストの使用に注意する必要があります。 Redis 非同期キューを使用すると、システムの同時実行パフォーマンスを効果的に向上させ、ユーザー エクスペリエンスを向上させることができます。

以上が非同期キューを実装するための Redis メソッドとアプリケーション例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート