2015-04-20 2 views
3

Я использую Redis 2.8 ключевое пространство Pub/Sub уведомление, я хотел бы знать, можно ли получить уведомление о , которое изменилось после HSET команда?redis hset и уведомление о пробеле в ключе

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

+1

Если вы используете StackExchange.Redis, я начал работу над реализацией базы данных, которая повышает пользовательские уведомления, включая имя затронутого хэш-поля. Вы можете сделать то же самое для любой библиотеки Redis, которую используете. https://github.com/johnnycardy/StackRedis.L1/tree/master/StackRedis.L1.Notifications – johnnycardy

ответ

2

Стандартные уведомления о ключах в Redis не включают данные о данных, которые были изменены, и, в частности, не содержат информацию о затронутом поле Hash.

+0

Я понял это. Значит, нет надежды? Что я могу сделать для достижения того, что я ищу? – mguijarr

+1

Всегда есть надежда - пожалуйста, не отчаивайтесь :) Вместо того, чтобы использовать только уведомления, вы могли бы, например, иметь другое поле в Hash, в котором хранится имя недавно измененного поля. Конечно, ваше приложение должно будет обновить его, и всегда есть вероятность, что ваш абонент уведомлений может пропустить обновление (или больше), но это также верно для простого pubsub, поэтому я думаю, вы можете жить с этим. –

-1

Я не знаю, было ли у вас уже какое-то решение, но я хочу поделиться тем, как я работаю с Redis и NodeJS.

У меня есть клиент REDIS создали:

var client = redis.createClient(redis_options); 

Таким образом, этот клиент делате сообщения, когда приходит уведомление Redis. (Сервер Redis был настроен, чтобы сделать это ->redis-cli config set notify-keyspace-events KEA - https://redis.io/topics/notifications)

client.on('pmessage', function(pattern, channel, message) { 

Здесь 'pmessage' событие предлагает нам три параметра (https://www.npmjs.com/package/redis):

шаблон: шаблон для suscribed ключа канала: канал, который вы слушаете ('__keyspace @ 0__:' + хэш) сообщения: операция выполняется в Redis (е: H Установите)

Итак, если у вас есть какой-то объект, как словарь, который связывает объект (который вы хотите обновить при поступлении уведомления) в redis-хэш. Затем, когда вы получите уведомление, вы можете предпринять действия над этим конкретным объектом.

Надеюсь, вы понимаете мой ответ! Извините за мой бедный английский!

Если вам нужно что-то еще, просто дайте мне знать!

0

Хотя это не совсем то, что вы хотите, его все еще можно использовать в качестве обходного пути. Попытка иметь уникальный хэш имя ключа, например:

redis.hmset('task:{}'.format(unique_id), status='running') 

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

(b'[email protected]__:task:c81b8373-b5ea-4be0-b8f1-b490e7280898', 'hset') 

Теперь, зная уникальный идентификатор задачи, вы можете сделать:

redis.hget('task:{}'.format(unique_id), 'status') 
> running 
Смежные вопросы