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

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

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

Ответ 1

Вы можете сделать это только с помощью модели pub-sub Запустить сервер Redis

Измените события уведомления-keyspace-события в 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. подписаться (новый 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*__:* [email protected]__:notify set
onPMessage pattern __key*__:* [email protected]__:set notify
onPMessage pattern __key*__:* [email protected]__:notify expire
onPMessage pattern __key*__:* [email protected]__:expire notify
onPMessage pattern __key*__:* [email protected]__:notify expired
onPMessage pattern __key*__:* [email protected]__: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

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

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

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

Ответ 2

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

        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) {

        }