Redisを使用してキュー操作を行う方法

3370 ワード

まず調味料をください.見てください.
Reidsは比較的高度なオープンソースkey-valueストレージシステムであり、ANSI Cを採用して実現されている.これはmemcachedと似ていますが、永続化されたデータストレージをサポートし、valueは文字列(memcachedのvalueと同じ)、リスト、集合(Set)、秩序化集合(OrderSet)、Hashなど、さまざまなタイプをサポートします.すべての値タイプは、リストにポップアップ要素を追加したり、コレクションに削除要素を挿入したりするなど、原子操作をサポートします.Rdidsのデータの大部分はメモリにあり、その読み書き効率は非常に高く、AOF(追加型操作記録ファイル)とDUMP(定期データバックアップ)の2つの永続化方式を提供する.RedisはカスタムVM(仮想メモリ)機構をサポートし、データ容量がメモリを超えると一部のValueをファイルに保存することができる.同時にRedisはMaster-Slave機構をサポートし、データ複製を行うことができる.
Redisのlist構造をキューとして使用することができる.
上のRedisのシーンと役割から言えば、私たちの現在の開発活動にとって、このような良いものを「Redisを使うために、Redis」の惨烈な局面に変えるのではなく、Redisをそれらのシーンに導入することができるのだろうか.もちろん、具体的な問題を具体的に分析することは本当に重要ですね.
キャッシュ?分散キャッシュ?
キュー?分散キュー?
一部のシステムアプリケーション(例えば、電信、銀行、大型インターネットアプリケーションなど)は使用されます.もちろん、現在盛んに行われているmemcacheは良い証明ですが、ある面から言えば、memcacheは2枚を網羅することができ、より良いことができますか.(実際に応用されていないので、投げ出すだけです).しかし、Redisから、Redisは、キューとキャッシュの2枚を網羅することができ、同時環境での悩みは生じないと感じることができます.Redisでの操作はすべて原子操作だったからです.
両者のどちらが良いか悪いかを評論するのは免れ、存在は理由であり、適切なものを選ぶのが一番だ.
次はRedisの中の行列(分布式)のデザインYYを游びましょう.エビたちによろしくお愿いします.
状況シーン:
現在のプロジェクトは,複数のサーバ,あるいは複数のIPに配備されており,フロントがF 5を介して配布されているため,ユーザの要求がどのサーバに落ちているのかは確定できない.プロジェクトでは、最初はこのような導入を考慮しておらず、最も扱いやすい方法でもあります.データベース・テーブルに直接ロー・レコードをロックします(Oracle).異なるアプリケーションの導入に対して、データベース・サーバが1台しかない場合、この同時発生の問題は「簡単」に解決されると言えます.したがって、アプリケーションに移行するかどうかを考慮して、データベース・サーバがビジネスにドープされないようにします.
たとえば、現在2台のアプリケーションサーバ、1台のデータベースサーバがあります.Redisをデータベースサーバに配備し,2台のサーバが同時キャッシュやキューを操作する際に,まずRedisサーバから,2台のアプリケーションサーバでエージェントオブジェクトを取得してから,列に列挙する操作を行うという考え方である.
コード実装を見る(PHP)

        list_push.php

<?php
$redis = getRedisInstance();// Redis     redis  
$redis->connect('Redis   IP', 6379);
while (true) {
  $redis->lPush('list1', 'A_'.date('Y-m-d H:i:s'));
    sleep(rand()%3);
}
?>

  # php list_push.php &

      list_pop.php  
<?php
$redis = getRedisInstance();// Redis     redis  
$redis->pconnect('Redis   IP', 6379);
while(true) {
    try {
        var_export( $redis->blPop('list1', 10) );
    } catch(Exception $e) {
        //echo $e;   
    }

}

    (Python)

        1.   (write.py)

        #!/usr/bin/env python

        import time

        from redis import Redis

 

        redis = Redis(host='127.0.0.1', port=6379)

        while True:

                now = time.strftime("%Y/%m/%d %H:%M:%S")

                redis.lpush('test_queue', now)

                time.sleep(1)

         2.   (read.py)

         #!/usr/bin/env python

         import sys

         from redis import Redis

 

         redis = Redis(host='127.0.0.1', port=6379)

         while True:

                 res = redis.rpop('test_queue')

                 if res == None:

                         pass

                 else:

                         print str(res)

操作時には、同じリストオブジェクトを操作することに注意してください.
ほほほ、今の主な考え方は多くありませんが、実際のシーンでは、出入りがあります.
【転載先】http://hi.baidu.com/daqing15/item/b213dc7a64208f3c70442317