Вы можете сделать это с помощью модели 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