2016-02-04 3 views
1

Есть ли простой способ EXPIRE клавиши redis, если значение не было изменено за последние x минут?EXPIRE Ключ Redis, если не был изменен

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

Теперь это может быть уже существующее - я вызываю EXPIRE на ключ. Тогда, если я назову SET на этом ключе, я могу снова вызвать EXPIRE, и ключ будет EXPIRE с новым значением, а не старым?

+1

У меня такой же сценарий, поэтому я сделал, как вы сказали. Всякий раз, когда я получаю доступ к ключу, я продлеваю его срок действия с новым значением. Это так. – Nebras

ответ

2

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

EXPIRE не накапливает и не перезагружает или ничего, он просто устанавливает таймер на новое значение.

Пример (без обработки ошибок за многословие):

'use strict'; 

let client = require('redis').createClient() 
const KEY = 'my:key'; 
const TTL = 10; 
let value = 'some-value'; 

client.on('ready', function() { 

    console.log('Setting key...') 
    client.set(KEY, value, function() { 

    console.log('Setting expire on the key...'); 
    client.expire(KEY, TTL, function() { 

     console.log('Waiting 6 sec before checking expire time...'); 
     // Check in 6 seconds, ttl should be around 6 
     setTimeout(function() { 

     client.ttl(KEY, function(err, expiryTime) { 

      console.log('expiryTime:', expiryTime); // "expiryTime: 6" on my system 
      // expire again to show it does not stack, it only resets the expire value 

      console.log('Expiring key again...'); 
      client.expire(KEY, TTL, function() { 

      // again wait for 3 sec 
      console.log('Waiting 3 more sec before checking expire time...'); 
      setTimeout(function() { 

       client.ttl(KEY, function(err, expiryTime) { 

       console.log('New expiryTime:', expiryTime); // 7 
       process.exit(); 
       }) 
      }, 3000); 
      }); 
     }); 
     }, 6000); 
    }); 
    }); 
}); 

(К сожалению для обратного вызова Piramid).

Запуск этого на моей системе:

[[email protected] ~/tmp]$ node test.js 
Setting key... 
Setting expire on the key... 
Waiting 6 sec before checking expire time... 
expiryTime: 4 
Expiring key again... 
Waiting 3 more sec before checking expire time... 
New expiryTime: 7 
[[email protected] ~/tmp]$ 

Как вы можете видеть, мы установили истекает время до 10 секунд. Через 6 секунд, очевидно, оставшееся время составляет 4 секунды.

Если мы в этот момент с 4 секундами, установите срок годности на 10, мы просто начнем с 10. Через 3 секунды после этого мы по-прежнему готовы еще на 7 секунд.

+0

Спасибо, из документов Redis «Тайм-аут будет очищен только командами, которые удаляют или перезаписывают содержимое ключа, включая DEL, SET, GETSET и все команды * STORE ...» Так что, похоже, мне нужно быть осторожно вызвать EXPIRE после вызова SET, а не наоборот. Однако, если SET всегда очищает таймаут, тогда документы не делают это ясным ... Я думаю, мне нужно знать, всегда ли SET всегда очищает таймаут. –

+0

Да, но вы также можете использовать 'setex', который задает и истекает ключ атомарно. – Zlatko

+0

Кроме того, SET не очищает тайм-аут. Просто добавляет новое значение к ключу, который потенциально существует с дополнительным таймаутом. – Zlatko

Смежные вопросы