我想使用NodeJS中的redis库在Redis的hset特定键中设置Expiry
我在Redis中设置了一个哈希。
const redis = require("redis");
let client = redis.createClient('host', 'port', 'password', 'db');
client.hset("emailVerification", "[email protected]", "token_1");
client.hset("emailVerification", "[email protected]", "token_2");
现在,我想在emailVerification哈希集中将[email protected]设置为24小时到期时间。因此,它会在24小时后过期并从哈希中删除。
回答如下:可悲的是,Redis不支持这种操作。 EXPIRE
命令仅适用于键,并且哈希操作不会重置计时器。
仅通过删除或覆盖键内容的命令(包括DEL,SET,GETSET和所有* STORE命令)才能清除超时。这意味着在概念上更改存储在键上的值而不用新键替换的所有操作将使超时保持不变。例如,使用INCR增加键的值,使用LPUSH将新值推入列表,或使用HSET更改哈希的字段值,所有这些操作都将使超时保持不变。
这是一个简单的概念证明。
EXPIRE
有几种方法可以实现您的目标:
将电子邮件或基于电子邮件的某些哈希用作键,例如$ {
> redis-cli hset myhash key1 one
> redis-cli expire myhash 5
> sleep 2
> redis-cli hset myhash key2 two
> sleep 4
> redis-cli dump myhash
> }
(integer) 1
(integer) 1
(integer) 1
(nil)
的SHA1哈希为[email protected]
:
c0d0a32c405c68cb538e3891a3e3bce98887f012
或将过期作为元数据添加到您的哈希中,您必须存储一些JSON或其他结构化形式,而不是普通令牌:
SET emailVerificationc0d0a32c405c68cb538e3891a3e3bce98887f012 token1
EXPIRE emailVerificationc0d0a32c405c68cb538e3891a3e3bce98887f012 86400
然后您可以设置一些自动过程来清理旧条目。并在尝试验证电子邮件时检查到期时间。