ホームページ >バックエンド開発 >PHPチュートリアル >Redis はメッセージ キューをどのように実装しますか?

Redis はメッセージ キューをどのように実装しますか?

小云云
小云云オリジナル
2018-02-27 13:26:469595ブラウズ

インスタントサーバーリクエスト処理を非同期処理に変更し、サーバーへの負担を軽減し、シーケンシャルなデータ取得を実現します。この記事では主に、Redis がメッセージ キューを実装する方法について説明し、皆様のお役に立てれば幸いです。

Redis はメッセージ キューをどのように実装しますか?

メッセージキューは、平たく言えば、メッセージ送信プロセス中にメッセージを一時的に保存するコンテナであり、異なるプラットフォームおよび異なる言語上のアプリケーション間でデータを送信でき、大規模な同時実行を処理できます。問題に対処するときに非常に効果的です。

ここでメッセージ キューを使用するシナリオについて説明します。私のシステムは、クライアントからのリクエスト (定期的なリクエスト) をリアルタイムで受信し、リクエストされたデータをデータベースに保存する必要があります。各リクエストのデータ量は小さいですが、期限が切れています。データベースを運用していると、システムがパフォーマンスのボトルネックに遭遇しました。このデータをredisに直接保存するというのが当初の考えだったのですが、よく考えてみると、redisには永続化機能もありますが、毎回のデータ量は大きくないものの、データは周期的で増え続けるため、永続性に依存する場合 ハードディスクに保存すると、インメモリデータベースとしての Redis の利点が失われるため、最終的にメッセージキューを使用することにしました。

その方法は次のとおりです:

毎回要求されるデータはメッセージ キューに直接書き込まれ、その後、データが書き込まれると、バックグラウンドでスレッドが開かれて、メッセージ キューを監視します。 、メッセージ キュー内のデータが取得されて mysql データベースに書き込まれるため、リアルタイム データをデータベースに非同期で書き込むことができ、データベースの直接操作によって引き起こされるシステムのボトルネックを回避できます。

そこで問題は、どのメッセージ キューを使用するかということですが、現在主流のメッセージ キューは、RabbitMQ、ActiveMQ などです。これらのテクノロジは比較的成熟しており、非常に効率的です。ただし、プロジェクト自体が (キャッシュに) redis を使用しており、毎回のデータ量が比較的少ないことを考慮すると、redis はキーと値のデータベースであるだけでなく、HashMap、Set、List、その中で、List はメッセージ キューとして使用でき、Redis List は blpop や brpop などのブロック コマンドをサポートしており、私のニーズを完全に満たすことができます。簡単なテスト コードは次のとおりです:

//产生数据
import redis.clients.jedis.Jedis;
public class RedisProducer {
    /** 
     * jedis操作List 
     */  
    public static void main(String[] args){
        Jedis jedis = new Jedis("192.168.10.209", 6379); 
        for(int i = 0;i<10;i++) {
            jedis.lpush("informList","value_" + i);  
        }
        jedis.close();
    }
}
//消费数据
import java.util.List;
import redis.clients.jedis.Jedis;
public class RedisConsumer {
    /** 
     * jedis操作List 
     */  
    public static void main(String[] args){
       ScheduleMQ mq = new ScheduleMQ();
       mq.start();
    }   
}
class ScheduleMQ extends Thread {
    @Override
    public void run() {
        while(true) {
            Jedis jedis = new Jedis("192.168.10.209", 6379);
            //阻塞式brpop,List中无数据时阻塞
            //参数0表示一直阻塞下去,直到List出现数据
            List<String> list = jedis.brpop(0, "informList");
            for(String s : list) {
                System.out.println(s);
            }
            jedis.close();
        }
    }
}

関連する推奨事項:

PHP Redis メッセージ キューを使用して Weibo を公開する方法

php はメッセージ キュー クラス インスタンスの共有を実装します

PHP 高度なプログラミング メッセージ キュー

以上がRedis はメッセージ キューをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。