我在Redis中有一个哈希集。
const redis = require(“redis”);let client = redis.createClient(‘host’,‘port’,‘password’,‘db’);
client.hset(“emailVerification”,“abc @ gmail.com”,“token_1”);…
可悲的是,Redis不支持此类操作。该 EXPIRE 命令仅适用于键和哈希操作不会重置计时器。
EXPIRE
只有删除或覆盖密钥内容的命令才能清除超时,包括DEL,SET,GETSET和所有* STORE命令。这意味着从概念上改变存储在密钥中的值而不用新密钥替换它的所有操作将使超时保持不变。例如,使用INCR递增键的值,将新值推送到具有LPUSH的列表中,或者使用HSET更改散列的字段值,这些操作将使超时保持不变。
这是一个简单的概念证明。
$ { > 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哈希 abc@gmail.com 是 c0d0a32c405c68cb538e3891a3e3bce98887f012 :
abc@gmail.com
c0d0a32c405c68cb538e3891a3e3bce98887f012
SET emailVerificationc0d0a32c405c68cb538e3891a3e3bce98887f012 token1 EXPIRE emailVerificationc0d0a32c405c68cb538e3891a3e3bce98887f012 86400
或者将过期作为元数据添加到哈希,您必须存储一些JSON或其他结构化表单而不是普通标记:
HSET myhash abc@gmail.com '{"token":"token1", "expiration": "20190205T09:00"}'
然后,您可以设置一些自动过程来清理旧条目。并在尝试验证电子邮件时检查过期时间。