2012-05-20 22 views
8

redisコレクションに変更が加えられたときにコールバックを実行できるようにしたい。コールバックはキーと値を入力として受け取ります。このようなことは可能でしょうか?Redisの変更を聞く?

ありがとうございます。

+0

関連機能のリクエスト:https://github.com/antirez/redis/issues/83 –

答えて

8

また、syncコマンドを使用して、スレーブのようなRedisサーバに接続することもできます。簡単な紹介についてはどのようにRedis Replication Works?を参照してください。

syncコマンドの出力には2つのフェーズがあります。第1段階では、サーバーはデータベースdump.rdbファイルを戻します。ファイルが送信されると、AOFフォーマットであるRedisプロトコルでコマンドの送信が開始されます。ここで

はあなたが何ができるかのハイレベルの画像です:

  1. 接続RedisのサーバーへとSYNCコマンド
  2. 保存を発行し、dump.rdbファイルを解析。初期データセットを構築する。 A node.js based rdb parserが利用可能です。
  3. 以下のコマンドを解析します。それらはRedisプロトコルのため、既存のRedisライブラリから始めることができます。
  4. あなたが受け取るすべてのコマンドについては、コールバック

それは多くの作業を思わを呼び出していますが、かなり簡単にこれをハックすることができるはずです。そしてそれは良いオープンソースライブラリを作るでしょう!

EDIT:同期V/sのモニター

  1. Monitorは、デバッグコマンドです。応答フォーマットは、時間の経過と共に変化する(および変化する)ことができる。 Syncはマスタ - >スレーブレプリケーションに使用されるため、よりよくサポートされます。
  2. Monitorは、読み取り専用コマンドを含むすべてのコマンドを発行します。 Syncは、データを変更するコマンドだけを取得します。
  3. Monitorは、luaスクリプト内で実行される個々のコマンドを記録します。Syncはluaスクリプト全体を転送するだけなので、スクリプトを自分で解析する必要があります。これは確かにsyncのディール・ブレーカーです。
  4. Monitorは、成功しなかったコマンドを記録します。Syncは、データを変更するコマンドだけを記録します。たとえば、コマンドdel non-existing-keyはモニタによって記録されますが、同期を実行すると表示されません。
+0

感謝スリッファティ!あなたは私にこのアップデートとアップデートのためのモニターを使っていることの概要を教えてください。 – fancy

+1

@fancy私の答えの更新を見る –

10

つのオプション:

  1. 使用MONITORコマンド - それはRedisのために、あなたが分析し、あなたのコレクションに触れているときに見ることができます取得するすべてのコマンドをトレースします。

  2. コレクションに書き込むコードを「所有する」場合は、他のコード(コールバック)を通知します。これにはRedis Pub/Subチャンネルを使用できます。

EDIT Redisのは、実際には、バージョン2.8でこの機能を実装する予定です。 Antirezのブログ記事Redis keyspace changes notification systemを参照してください。

+0

@fancy私の答えへの更新を参照してください –

3

短答 - いいえ。

あなたのクライアントのredis PubSubの特定のチャンネルに公開を追加した場合にのみ、これを行うことができます。またはユーザMONITORを実行して、redisで何が起こっているのかを解析しますが、そのプロセスがredisへの接続を失った場合、あなたは戸惑います。

0
<dependency> 
    <groupId>com.moilioncircle</groupId> 
    <artifactId>redis-replicator</artifactId> 
    <version>2.5.0</version> 
</dependency> 

は、Javaを使用している場合。 redis-replicatorは、Redisレプリケーションプロトコルを実装しています。 詳細は、あなたがnode-redisモジュールで使用できるパブリッシュ/サブスクライブ・メカニズムが今ありますreferences

0

2017年に

を参照してください。特定の文書HEREを参照してください。 (redis-mockと併用してテストすることもできます)

同じチャネルに複数のサブスクライバ(リスナー)を置くことができます。その場合、あなたのコレクションのキーとなります。

迅速なサンプル:(実装の詳細については、ドキュメント上を参照)

sub.subscribe('myCollection'); 
sub.on('message', (channel, data) => { 
    // this is the callback you talked about 
    console.log(`${channel} is now ${data}`); 
}); 

// ... later on ... 

pub.publish('myCollection', [1,2,3]) 
// console will output: 
// myCollection is now [1,2,3] 
関連する問題