Уведомление об истечении срока действия Redis Key с помощью Jedis

Я пытаюсь реализовать уведомление об истечении срока действия ключа с помощью Redis, когда срок действия моего ключа истекает в хранилище данных Redis. Веб-сайт Redis предоставляет некоторое описание того, как http://redis.io/topics/notifications, но я не могу найти ни одного примера, как сделать это с помощью java-клиента Redis, такого как Jedis?

Любой возможный код с иллюстрацией будет очень полезен, так как я новичок в Redis.


person Rocky Ray    schedule 16.10.2014    source источник


Ответы (2)


Вы можете сделать это с помощью модели pub-sub, только запустите Redis Server.

Измените notify-keyspace-events в redis.conf на 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 (новый KeyExpiredListener (), «__key * __: *»); - Эти методы поддерживают канал на основе шаблона регулярных выражений, тогда как jedis. subscribe (new KeyExpiredListener (), "" __keyspace @ 0 __: notify "); - Этот метод принимает полное / точное имя канала

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

Теперь один вариант использования, когда вас также интересует значение истекшего ключа.

Примечание. 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 // Разделите ключ на ":" (или любой другой разделитель, который вы решите использовать), возьмите вторую часть, чтобы получить исходный ключ

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

Обратите внимание, что значение теневого ключа не используется, поэтому вы хотите использовать наименьшее возможное значение, это может быть пустая строка "". Для настройки потребуется немного больше работы, но указанная выше система делает именно то, что вам нужно. Накладные расходы - это несколько дополнительных команд для фактического извлечения и удаления вашего ключа плюс стоимость хранения пустого ключа.

В противном случае вам придется подготовить свой ключ таким образом, чтобы он включал добавленное к нему значение.

Надеюсь, это вам поможет!

person Kuntal-G    schedule 16.10.2014
comment
Выглядит великолепно .. Ты сэкономил мне много времени, чувак .. Я искал это весь день .. Спасибо @ Kuntal-G за ваш код и правильную иллюстрацию. - person Rocky Ray; 16.10.2014
comment
Есть ли способ получить значение "umq" в onPMessage? - person Kaidul; 13.11.2016
comment
Пожалуйста, проверьте обновленный ответ, чтобы узнать, как получить значение по истечении срока действия ключа. - person Kuntal-G; 24.11.2016
comment
Как провести урок в первую очередь? - person Don Corleone; 08.11.2017

Это может вам помочь.

        JedisPool jedisPool=null;
        JedisPoolConfig poolConfig = null;

        try {

            poolConfig=new JedisPoolConfig();
            jedisPool = new JedisPool(poolConfig,"127.0.0.1" /*Host IP*/,1234 /*Port*/, 0);             
            Jedis jedis=jedisPool.getResource();            
            jedis.expire("KeyName", 10 /*Key Expires in 10 seconds*/);  

        } catch (Exception e) {

        }
person Vishvesh Phadnis    schedule 16.10.2014
comment
Насколько я понимаю, пользователь спрашивает, как получить уведомление, когда истечет срок действия ключа, а не как истечь срок действия ключа, как вы показали в своем коде. - person Kuntal-G; 16.10.2014
comment
@ Vishvesh, спасибо за ответ, но Кунтал прав, я знаю об истечении срока действия, но я искал механизм уведомления об истечении срока действия ключа, как упоминается в документации Redis. - person Rocky Ray; 16.10.2014