Web アプリケーションの開発が進むにつれて、タスクを完了する前にユーザーがアプリケーションを使い続けられるようにする必要があるため、非同期タスク処理の必要性がますます重要になっています。この場合、非同期タスクの処理を除いて、複数タスクの並列処理は実現できないため、非同期タスクを処理するために何らかのツールを使用する必要があることが多く、その中でも Redis は非常に便利なツールです。
Redis は、データの迅速な保存、読み取り、操作に使用できる高性能のインメモリ データベースです。主な用途はキャッシュとメッセージングの実装ですが、非同期タスクの処理にも使用できます。 Redis にはキューイング機能とパブリッシュ/サブスクライブ機能が組み込まれているため、非同期タスク処理に非常に便利なツールになります。
この記事では、Redisを使用して非同期タスク処理を実装する方法を紹介します。
- Redis 接続の確立
まず、Redis クライアントを使用して Redis サーバーとの接続を確立する必要があります。 Redis 接続をサポートする任意のクライアントを使用できます。 Python の redis-py は非常に良い選択です。 redis-py をグローバルにインストールしてください:
pip install redis
次に、次のコマンドを使用して Redis 接続を確立できます:
import redis redis_conn = redis.Redis(host='localhost', port=6379, db=0)
ここでは、redis_conn という名前の Redis 接続インスタンスを作成しました。ローカル Redis サーバー (host='localhost') に接続し、ポート番号は 6379 (port=6379)、データベース番号 0 (db=0) を使用します。
- Redis Queue
Redis Queue (RQ) は、Redis をバックエンドとして使用して分散タスク キューを実装する Python ライブラリです。 RQ は Redis の lpush および rpop コマンドに基づいて構築されているため、非常に優れたパフォーマンスを発揮します。
RQ と Redis をインストールします:
pip install rq redis
- 同期タスク
同期タスクでは、メインスレッドはすべてのコードを実行し、タスクが完了するのを待ちます。完了。以下は、同期タスクのサンプル コードです。
import time def task(): # 等待5秒 time.sleep(5) print('Task complete') print('Starting task') task() print('Task ended')
上の例では、5 秒間待機してから「タスク完了」を出力する task という名前の関数を定義しました。次に、メイン スレッドでこのタスクを呼び出し、「開始タスク」を出力し、5 秒間待機してから「タスクが終了しました」を出力します。
このアプローチは、存続期間が短いタスクには実行可能ですが、実行時間が長いタスクの場合、アプリケーションを使用できないため、ユーザーは非常に不満を感じる可能性があります。
次に、このタスクを非同期タスクに変換する方法を見てみましょう。
- 非同期タスク
タスクを非同期タスクに変換するという考え方は、タスクを別のスレッドまたはプロセスで実行し、別のスレッドまたはプロセスで他のコードを実行し続けることです。メインスレッド。こうすることで、ユーザーはバックグラウンドでタスクが実行されている間もアプリケーションを使い続けることができます。
Python では、スレッドまたはプロセスを使用してバックグラウンド タスクを実行できます。ただし、複数のタスクが実行されている場合、スレッドとプロセスの数が増加し、デッドロックや同期の問題などの問題が発生する可能性があります。
Redis にはこれらの問題を回避できる組み込みのキュー構造があるため、Redis を使用するとこの問題を解決できます。 Redis で非同期タスクを実装する基本的な考え方は、タスク キューを作成し、そのキューにタスクを追加することです。次に、キュー内のタスクを取得して実行するための別のタスク エグゼキューターを作成します。
Redis はインメモリ データベースであるため、これを使用してすべてのキュー データを保存できます。この方法により、タスクのステータスを Redis に保存できるため、タスクを処理するためにスレッドやプロセスを使用する必要がなくなります。
以下は、非同期タスクのサンプル コードです:
from rq import Queue from redis import Redis redis_conn = Redis() q = Queue(connection=redis_conn) def task(): # 等待5秒 time.sleep(5) print('Task complete') print('Starting task') job = q.enqueue(task) print('Task started')
上記のコードでは、まず q という名前の Redis キューを作成し、次に task という名前の関数を定義します。メインスレッドでタスクを呼び出すときは、キュー オブジェクトの enqueue メソッドを使用してタスクをキューに追加します。このメソッドは、キュー内のタスクを表す job という名前のタスク オブジェクトを返します。次に、「タスクが開始されました」と出力すると、キュー実行プログラムがバックグラウンドでタスクを取得して実行します。
- タスクの監視
前の例では、ジョブ オブジェクトを使用してタスクのステータスを監視し、結果を取得できます。タスクを監視する方法のサンプル コードは次のとおりです。
from rq import Queue from redis import Redis redis_conn = Redis() q = Queue(connection=redis_conn) def task(): # 等待5秒 time.sleep(5) return 'Task complete' print('Starting task') job = q.enqueue(task) print('Task started') # 检查任务状态并获取结果 while job.result is None: print('Task still processing') time.sleep(1) print('Task complete: {}'.format(job.result))
上記のコードでは、タスクの result プロパティが空でなくなるまでチェックします。次に、「Task complete:」とタスク オブジェクトの結果を出力します。
- パブリッシュ/サブスクライブの使用
Redis はパブリッシュ/サブスクライブ (pub/sub) モデルもサポートしているため、非常に便利なメッセージング ツールになります。このモデルでは、パブリッシャーがトピックにメッセージをパブリッシュし、サブスクライバーがトピックをサブスクライブして、トピックに関するすべてのメッセージを受信します。
パブリッシュ/サブスクライブ モデルを使用した実装を説明するために、非同期タスクを例に挙げてみましょう。
まず、各タスクに一意の ID を作成し、タスクをキューに追加する必要があります。次に、タスク ID をトピックに公開します。タスク実行プログラムはトピックをサブスクライブし、タスク ID を受信すると、タスクを取得して実行します。
以下は、パブリッシュ/サブスクライブ モデルを使用して非同期タスクを実装するサンプル コードです:
from rq import Queue from redis import Redis import uuid redis_conn = Redis() q = Queue(connection=redis_conn) # 订阅任务主题并执行任务 def worker(): while True: _, job_id = redis_conn.blpop('tasks') job = q.fetch_job(job_id.decode('utf-8')) job.perform() # 发布任务并将其ID添加到队列中 def enqueue_task(): job = q.enqueue(task) redis_conn.rpush('tasks', job.id) def task(): # 等待5秒 time.sleep(5) return 'Task complete' print('Starting workers') for i in range(3): # 创建3个工作线程 threading.Thread(target=worker).start() print('Enqueueing task') enqueue_task() print('Task enqueued')
上記のコードでは、まず、worker という名前のタスク実行プログラムを定義します。これは継続的にループとキャンセルを行います。キューからのスケジュールされたタスク ID。タスク ID を取得すると、fetch_job メソッドを使用してタスク オブジェクトを取得し、実行します。
また、enqueue_task という関数も定義します。この関数は、job という名前の非同期タスクを作成し、その ID をキューに追加します。次に、メイン スレッドでこの関数を呼び出し、タスク ID を「タスク」というトピックに発行します。タスク実行プログラムは、タスク ID を受け取ると、タスクを取得して実行します。
- 概要
この記事では、Redis を使用して非同期タスク処理を実装する方法を紹介しました。 Python のキュー、パブリッシュ/サブスクライブ モデル、RQ ライブラリを使用し、タスクを非同期モードに変換し、非同期タスクを使用してユーザー エクスペリエンスの問題を解決する方法を示しました。 Redis は、組み込みのキューイング機能とパブリッシュ/サブスクライブ機能を非常に優れたパフォーマンスで提供するため、非同期タスクを処理する場合に非常に役立ちます。 Web アプリケーションの応答性を高め、非同期タスク処理を実装したい場合は、Redis が適しています。
以上がRedisにおける非同期タスク処理の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Redisのコア関数は、高性能のメモリ内データストレージおよび処理システムです。 1)高速データアクセス:Redisはデータをメモリに保存し、マイクロ秒レベルの読み取り速度と書き込み速度を提供します。 2)豊富なデータ構造:文字列、リスト、コレクションなどをサポートし、さまざまなアプリケーションシナリオに適応します。 3)永続性:RDBとAOFを介してディスクにデータを持続します。 4)サブスクリプションを公開:メッセージキューまたはリアルタイム通信システムで使用できます。

Redisは、次のようなさまざまなデータ構造をサポートしています。1。文字列、単一価値データの保存に適しています。 2。キューやスタックに適したリスト。 3.非重複データの保存に使用されるセット。 4。ランキングリストと優先キューに適した注文セット。 5。オブジェクトまたは構造化されたデータの保存に適したハッシュテーブル。

Redisカウンターは、Redisキー価値ペアストレージを使用して、カウンターキーの作成、カウントの増加、カウントの減少、カウントのリセット、およびカウントの取得など、カウント操作を実装するメカニズムです。 Redisカウンターの利点には、高速速度、高い並行性、耐久性、シンプルさと使いやすさが含まれます。ユーザーアクセスカウント、リアルタイムメトリック追跡、ゲームのスコアとランキング、注文処理などのシナリオで使用できます。

Redisコマンドラインツール(Redis-Cli)を使用して、次の手順を使用してRedisを管理および操作します。サーバーに接続し、アドレスとポートを指定します。コマンド名とパラメーターを使用して、コマンドをサーバーに送信します。ヘルプコマンドを使用して、特定のコマンドのヘルプ情報を表示します。 QUITコマンドを使用して、コマンドラインツールを終了します。

Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

RedisクラスターでのZsetの使用:Zsetは、要素をスコアに関連付ける順序付けられたコレクションです。シャード戦略:a。ハッシュシャーディング:ZSTキーに従ってハッシュ値を分配します。 b。範囲シャード:要素スコアに従って範囲に分割し、各範囲を異なるノードに割り当てます。操作の読み取りと書き込み:a。読み取り操作:ZSetキーが現在のノードのシャードに属している場合、ローカルで処理されます。それ以外の場合は、対応するシャードにルーティングされます。 b。書き込み操作:Zsetキーを保持しているシャードに常にルーティングされます。

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

WebStorm Mac版
便利なJavaScript開発ツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

メモ帳++7.3.1
使いやすく無料のコードエディター
