Node-redis: 如何设置到期时间

创建于 2016-03-07  ·  40评论  ·  资料来源: NodeRedis/node-redis

client.set(key, value)

如何设置过期时间

question

最有用的评论

@BridgeAR :理解了,但是您有点漏了点。 也许这只是我的懒惰,但我拒绝学习整个本机Redis API,只是为了粘贴内容并退出。 也许那时我不应该使用node_redis库。 也许我应该使用其他位于它上面的东西,并将其抽象出来。 但是,就像我之前说过的那样,我认为大多数人都将Redis用作缓存,并且node_redis文档中什至没有提到“ expire”或“ expiration”(甚至是“ EX”命令或TTLs),因此如果不深入研究Redis官方文档,很难理解如何为密钥实际设置TTL,我希望大多数人都需要这样做。

所有40条评论

请检查命令dcoumentation 。 每个部分都有其自己的参数,因此您将编写如下内容:

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

谢谢

@BridgeAR文档链接不起作用

它不起作用.. redis版本3.0

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

@sxyjijiji对我来说很好用。 如果遇到错误,请发布堆栈跟踪并描述不起作用的地方。

@brucejcw我修复了链接

我认为它不包含在node_redis文档中,甚至不包含在set函数中。
也许会让一些人困惑。

@bruceCzK没有明确的命令文档。 通常,这不是一个好主意,因为Redis中的命令可能会更改,并且随着时间的推移可能会添加新的参数。

但是,您应该经常查看主文档的参考,以了解命令如何工作。 如果您发现有可能改进当前文档,请随时打开它的请求请求。 将链接添加到README.md中所有“命令”出现处可能是一个好主意。

大家好,有没有办法在客户端级别设置默认过期时间?

例如:类似

  const redisClient = redis.createClient({
    host: process.env.REDIS_ENDPOINT,
    port: process.env.REDIS_PORT,
    expire: 60 
})

只是在回声这是一种超级混乱的语法,尤其是对于新手。 node_redis文档中没有有关密钥到期/ TTL的任何内容。 我想大多数人会将Redis用作缓存层的一部分,并且密钥的过期时间将是该工作流程中非常重要的一部分。 IMO,应该将其烘焙到基本API中(也许set函数可以接受可选参数),或者文档至少应讨论与密钥有效期相关的命令API。

似乎答案是否定的,我们不能在客户端级别设置全局过期。 必须在每个密钥上设置过期时间有点让人讨厌。

@ryanvanderpol set函数已经采用了一个可选参数,如所述。 只需查看文档和上面的评论即可

@ kienpham2000在客户端级别没有全局过期,这将很难实现。 每个命令都必须进行检查和操作。 相反,添加挂钩的新功能可以解决该问题。
这不是一个缓存库,可能您正在寻找它。

@BridgeAR :理解了,但是您有点漏了点。 也许这只是我的懒惰,但我拒绝学习整个本机Redis API,只是为了粘贴内容并退出。 也许那时我不应该使用node_redis库。 也许我应该使用其他位于它上面的东西,并将其抽象出来。 但是,就像我之前说过的那样,我认为大多数人都将Redis用作缓存,并且node_redis文档中什至没有提到“ expire”或“ expiration”(甚至是“ EX”命令或TTLs),因此如果不深入研究Redis官方文档,很难理解如何为密钥实际设置TTL,我希望大多数人都需要这样做。

@ryanvanderpol这是Redis客户端库,而不是缓存库。 如果使用Redis库,则应该阅读Redis文档,尤其是因为这个原因,node_redis没有记录命令的工作方式。 毕竟,node_redis大部分时间只是将参数转发给Redis。

如果您想要一个缓存库,则可以使用其中的许多npm软件包之一,例如cacheman-redisnode-redis-cache ,在它们的文档中,您会发现明确提及“ expire”:smile:

我理解您的意思,但我认为复制Redis的文档或不必要地抽象化东西不应该是node_redis的工作。

@CherryDT,您的观点是正确的,这也是为什么我在前面的评论开头加上“也许我应该使用位于node_redis之上的其他内容”的原因,但是鉴于我的评论到目前为止已收到+1,我毫不怀疑在这个挫折中我并不孤单。

如果我想做的只是以原始格式直接与Redis通信,那么此包装器实际上并没有为我提供太多价值。 我认为完全可以假设使用Redis的大多数人都是出于缓存目的,并且会关心过期时间。

整个对话可能只是一个“要点,我们应该在文档中增加一些有关如何设置密钥有效期的方法以及一些其他常用命令”的讨论。 我想我也可以为此提交PR,但是除了将Redis用作缓存之外,我对Redis并不熟悉。

也就是说,我将查看您提到的其他库,如果它们更适合我的用例,我可能会改用其中一个库。

我的观点是,功能比TTL多得多。 有不同的数据类型(列表,集合,排序集合),发布者和订阅者系统等等,基本上是复制Redis的文档(并保持更新),或在参数上添加更多糖(并保持_them_更新)是我认为超出此客户范围的事情。 我也不希望MySQL客户端具有ORM(或MySQL参考)的功能,对吗?

我相信模块化设计,因此我也相信各个模块的大小不应超过所需的大小。 在这种情况下,该客户端在抽象化网络部分并提供命令作为第一层便利的方法方面做得很好,但是我认为最重要的是应该针对特定目标的更专业的库(例如我之前链接用于缓存的链接,或其他用于pubsub链接的链接等)。 顺便说一下,那些经常在内部使用node_redis,因此,即使它可能对您没有太大的直接作用,也可以是间接的,因为您可能使用的更加抽象的库可能会将node_redis用作依赖项。

因此,我同意对于您的用例,最好在node_redis之类的基础上增加一个“高级”库。

是的,我在这里完全不同意你的看法。 我希望MySQL客户端的文档向我展示如何做每个人在MySQL中所做的一些常见的事情,例如如何使用聚合函数进行选择或如何执行子查询。 我不希望它解释如何构建ORM或复制整个MySQL文档,而是向我展示如何使用该库进行常见操作。

无论如何,显然您不会看到我的观点,这是浪费时间。 到目前为止,有17个人同意我,只有您和另一个人不同意。 因此,也许您应该退后一步,不时考虑如何从他人的角度看事物。

您为什么要将此设置为个人? 我完全理解您的观点,我只是认为node_redis并不是当时的正确工具。 (正如您在我开始提出观点之前就已经同意自己的观点。)考虑一下,将事物保持小巧而独立,可以简化很多事情。 node_redis担心网络,诸如node-cache-redis (或您自己的实现)之类的东西会担心正确使用Redis API。 这样,就没有那么多的依赖关系。 “在最上面”的库将始终以一种或另一种方式存在,并且这种方式不需要每次Redis添加或更改某些功能时(仅当它添加整个_command_时)都需要更新node_redis(甚至支持不同的API版本)。 。

我为您提供了替代解决方案,希望这些解决方案可以满足您的需求,如果没有,请花点时间在npm上搜索“ redis”,您还将发现大量其他图书馆。

我们只是同意我们不同意这一点。 (而且,是否有17或1700人同意您或我也没关系。我认为每一个意见都应该得到重视。)

如果我们看原始的问题和答案,我不知道我必须在此库中将.set()'EX'以及类似的时间选项一起使用。

查看当前的README.md,它说明了如何使用client.hgetall (https://github.com/NodeRedis/node_redis#clienthgetallhash-callback),也许我们可以为SET和GET添加一些其他常见情况以类似的方式? 我还假设人们大量使用带有Redis的GET和SET。

我不知道有太多人对此有疑问,因为喜欢的人没有出现在我的收件箱中。

我将以PR记录set命令为例,同时也提到“ expire”。

我还想拥有一个PR,该PR证明这不是缓存库,也不打算成为一个缓存库。 我愿意接受任何有关如何使文档更适合新手的意见。

@ kienpham2000好吧,它也是一个单独的命令-setex :)

只是为了说明_node_redis_模块自述文件中的_redis_而已。 我对这个想法并不完全满意。 如本例所示-在multi / exec使用setexpire exec ,使用setex或使用set和'ex'-做很多事情的方法有很多。 这些都与节点无关。 我们解释hgetall因为它与其他命令返回值的方式不同。

并不是说人们没有问题,但在我看来,写博客或中篇文章或其他内容是更好的信息交流方式,而不是全神贯注。 如果我们有问题,可以将其链接到出现的任何问题中。 出于知识的考虑,将_node_redis_模块自述文件转换为源代码可能超出了范围。

@stockholmux我只是很好奇我们如何在这个lib中使用setex? 只是client.setex()吗?

如果这个lib是1-1与redis命令的映射,那么我认为我们不需要doc。 但是,如果此lib具有特殊的api或diff方式来传递选项,我认为拥有某种类型的API文档对开发人员将非常有帮助。

@ kienpham2000这是

@stockholmux是正确的,因为仅记录了hgetall因为与其他任何命令相比,您可以以更多方式使用它。 但这仍然是一对一的映射。

无论如何:我赞成添加有关此内容的部分,因此不会再次出现。

@BridgeAR很酷,感谢您愿意接受此文档PR,这是我的初稿: https :

更新: https

现在,我发现了这一点,它看起来像是另一种方法: https :

我也无法使该方法正常工作(没有错误,只是没有效果,所以我放弃了这个项目并切换到仍然可以使用Redis的https://www.npmjs.com/package/node-cache

在Windows下,无法使用'EX', 20在“ set”方法中设置到期时间,因为它仅接受2个参数,而不是3。

也许您有一个旧的Redis版本? 文档说它是在Redis 2.6.12中添加的: https :

您可以改用自2.0.0起存在的SETEX ...

也许您有一个旧的Redis版本? 文档说它是在Redis 2.6.12中添加的: https :

我在node-express项目中使用redis,用JS无法添加三个参数(否则我无法.. :-()

redis.set("cache:" + req.originalUrl, JSON.stringify(result), 'EX', 25); ->这是我的代码,在到期区域中有错误。

哪个Redis版本?

Redis 2.4.5适用于Windows Redis -Windows和最新版本的节点模块。

这样就很清楚了,请再次阅读以上消息并检查Redis文档! SET中的“ EX”参数仅在2.6.12中添加,因此您的Redis版本2.4.5没有它,但是您可以改用自2.0.0起存在的SETEX。

redis.setex(key, seconds, value)
redis.setex(key, value, seconds)

redis.setex(key, value, expiration) ->不起作用

...但是我在此链接中找到了一种正确的方法: redis windows

是的,如果您想更改Redis版本,那当然是对的。
如果不是,我的也可以,我只是弄错了参数(但是如果您检查了SETEX文档,就会注意到):它是键,秒,值,而不是键,值,秒。

无论如何,很高兴听到它现在对您有效。

以下不起作用。

client.set('key', 'value', 'EX', 10, (error, replay)=>{
...
}

有任何更新吗?
我现在正在使用client.expire(id,10)

PS:我正在使用redis版本: Redis server v=5.0.0和node verison: v8.10.0

@kdthanvi那应该工作。 运行时使用redis-cli MONITOR仔细检查实际发生了什么。

@kdthanvi是正确的。 它不适用于redis 5:

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

你需要:

`
client.set(键,值,回调);

client.expire(key,TTL,callback);
`

使它真正起作用。

@martinlevesque我相信你错了。 EX已在2.6.12中添加,无论版本如何,node_redis均可正确传递“ EX”。 与MONITOR核对,您会看到。

由于原子差异, SET + EXPIRE可能与SET .. EX危险地不同。

因为当我搜索“ Redis节点集过期”时此线程是1号,所以我想指出一个结论,即到今天为止,以下set set expire命令可用于nodeJS redis。

setex(key, 60, value)

其中60是终止时间(以秒为单位)。

因为当我搜索“ Redis节点集过期”时此线程是1号,所以我想指出一个结论,即到今天为止,以下set set expire命令可用于nodeJS redis。

setex(key, 60, value)

其中60是终止时间(以秒为单位)。

经过2小时的调试和错误解决后发现了这一点。 非常感谢 ;)

此页面是否有帮助?
0 / 5 - 0 等级