Redis - 如何每天使密钥过期

Posted

技术标签:

【中文标题】Redis - 如何每天使密钥过期【英文标题】:Redis - How to expire key daily 【发布时间】:2015-08-14 10:40:20 【问题描述】:

我知道 Redis 中的 EXPIREAT 用于指定密钥何时过期。我的问题是它需要一个绝对的 UNIX 时间戳。如果我希望密钥在一天结束时过期,我很难考虑应该设置什么作为参数。

这就是我设置密钥的方式:

client.set(key, body);

所以设置过期时间:

client.expireat(key, ???);

有什么想法吗?我将它与 nodejs 和sailsjs 一起使用 谢谢!

【问题讨论】:

你使用的是哪个redis npm模块,是不是所有redis npm模块都支持expireat()函数。 ? 【参考方案1】:

如果您想在 24 小时后过期

client.expireat(key, parseInt((+new Date)/1000) + 86400);

或者,如果您希望它恰好在今天结束时过期,您可以在 new Date() 对象上使用 .setHours 来获取一天结束时的时间,并使用它。

var todayEnd = new Date().setHours(23, 59, 59, 999);
client.expireat(key, parseInt(todayEnd/1000));

【讨论】:

记录在哪里? 我没能在任何记录的地方找到这个?你是怎么找到这个的? expiresat 是同步还是异步?我有很多问题 @laggingreflex 真的是new Date 前面的+ 符号吗? 如何在redis中设置从不过期?【参考方案2】:

您可以同时设置价值和到期日。

  //here key will expire after 24 hours
  client.setex(key, 24*60*60, value, function(err, result) 
    //check for success/failure here
  );

 //here key will expire at end of the day
  client.setex(key, parseInt((new Date().setHours(23, 59, 59, 999)-new Date())/1000), value, function(err, result) 
    //check for success/failure here
  );

【讨论】:

它的工作,但最好忽略此命令.. 因为在 redis 文档中:" 注意:由于 SET 命令选项可以替换 SETNX、SETEX、PSETEX,因此有可能在Redis 的未来版本将弃用并最终删除这三个命令。 " redis set command【参考方案3】:

由于SETNX、SETEX、PSETEX将在下一个版本中被弃用,正确的做法是:

client.set(key, value, 'EX', 60 * 60 * 24, callback);

有关上述内容的详细讨论,请参阅here。

【讨论】:

以上是关于Redis - 如何每天使密钥过期的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Redis 过期密钥算法

Redis Key 过期通知 Jedis

使用 Redis 作为 Celery 结果后端和消息代理 - 任务过期(对于存储在 redis 中的密钥)

ruby Redis使用给定的命名空间过期密钥

Redis的键过期策略

redis过期策略(*)