web-dev-qa-db-ja.com

JedisによるRedis Keyの期限切れ通知

Redisデータストアでキーの有効期限が切れたときに、redisを使用して有効期限キー通知を実装しようとしています。 redisのWebサイトには、方法の説明がいくつか記載されています http://redis.io/topics/notifications が、Imがredis Javaジェディスのようなクライアント?

イラスト付きの可能なコードは、redisの初心者として非常に役立ちます。

13
Rocky Ray

pub-subモデルでのみ実行できます。Redisサーバーを起動します。

Redis.confのnotify-keyspace-eventsをKEAに変更します(これは要件によって異なります)。redisのドキュメントに記載されている詳細 http://redis.io/topics/notifications

Redis Java Client(Jedis))、以下を試してください:

通知リスナー:

public class KeyExpiredListener extends JedisPubSub {

@Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        System.out.println("onPSubscribe "
                + pattern + " " + subscribedChannels);
    }

@Override
    public void onPMessage(String pattern, String channel, String message) {

        System.out
                .println("onPMessage pattern "
                        + pattern + " " + channel + " " + message);
    }

//add other Unimplemented methods


}

サブスクライバー:

****注** jedis。psubscribe(new KeyExpiredListener()、 "__key * __:*"); -このメソッドは、正規表現パターンベースのチャネルをサポートしていますが、jedis。subscribe(new KeyExpiredListener()、 "" __keyspace @ 0 __:notify "); --Thisメソッドは完全な/正確なチャネル名を取ります

public class Subscriber {

    public static void main(String[] args) {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

        Jedis jedis = pool.getResource();
        jedis.psubscribe(new KeyExpiredListener(), "__key*__:*");

    }

}

テストクラス:

public class TestJedis {

    public static void main(String[] args) {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

        Jedis jedis = pool.getResource();
        jedis.set("notify", "umq");
        jedis.expire("notify", 10);

    }
}

次に、最初にサブスクライバを起動し、次にTestJedisを実行します。次の出力が表示されます。

onPSubscribe __key*__:* 1
onPMessage pattern __key*__:* __keyspace@0__:notify set
onPMessage pattern __key*__:* __keyevent@0__:set notify
onPMessage pattern __key*__:* __keyspace@0__:notify expire
onPMessage pattern __key*__:* __keyevent@0__:expire notify
onPMessage pattern __key*__:* __keyspace@0__:notify expired
onPMessage pattern __key*__:* __keyevent@0__:expired notify

有効期限が切れたキーのvalueにも関心がある1つのユースケース

注:Redisは、キースペースイベントの通知を通じてキーの期限が切れたときにのみキーを提供します。キーが期限切れになると、値は失われます。キーの有効期限の値を取得するために、シャドウキーのトリッキーな概念を使用して、以下に示す回避策を実行できます。

通知キーを作成するときに、特別な期限切れの「シャドウ」キーも作成します(実際の通知を期限切れにしないでください)。例えば:

// set your key value
SET notify umq 
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:notify "" EX 10 

//チャネルで有効期限メッセージを取得しますkeyevent @ 0:expired // ":"でキーを分割します(または使用することにしたセパレータ) 、2番目の部分を取り、元のキーを取得します

// Then get the value and do whatever with it
GET notify
// Then delete the key
DEL notify

シャドウキーの値は使用されないので、できるだけ小さい値を使用したいことに注意してください。空の文字列 ""にすることもできます。セットアップは少し手間がかかりますが、上記のシステムはまさに必要なことを行います。オーバーヘッドは、実際にキーを取得して削除するためのいくつかの追加コマンドと、空のキーのストレージコストです。

それ以外の場合は、値が追加されるようにキーを準備する必要があります。

お役に立てば幸いです。

28
Kuntal-G