如何在Node Redis中设置hmset的过期时间?

20

我以前使用client.setex(key, 900, value)来存储单个键值对。
但是,我想要存储一个带有过期时间的对象。
我想到了hmset函数,但是我不知道如何设置过期时间。
我想将其用于在对话中存储当前聊天的内容和文本。
请帮忙。

3个回答

31

要过期一个哈希(或任何其他Redis键),请调用EXPIRE命令。在您的情况下:

client.hmset(key, ...
client.expire(key, 9000)

11
这里有两个命令,也就是说整个操作不是原子的。如果由于任何原因 client.expire() 没有被执行,你最终会得到一条永远不会过期的记录。如果 Redis 有一个单一的命令可以同时设置哈希和定义其过期时间,那将会很好。 - Stas Korzovsky
4
可以使用 MULTI/EXEC 块或 Lua 脚本来确保原子性,代替专用命令。 - Itamar Haber
@StasKorzovsky,我需要通过hmset为哈希中的密钥集设置过期时间。你能告诉我如何实现吗?上述方法显示密钥的TTL为-1。 - Vipulw

4

由于hmset已被弃用(请参考此链接),您可以使用pipelinehset来设置expire

pipe = client.pipeline()
pipe.hset(key, mapping=your_object).expire(duration_in_sec).execute()

# for example:
pipe.hset(key, mapping={'a': 1, 'b': 2}).expire(900).execute()

注意管道操作并不保证原子性


值得一提的是,为了确保原子性,您可以使用multi()而不是pipeline()(正如您链接的文章中所述)。 - undefined

-3
一个确保在设置键后过期的好方法是将该过程包装在ES6异步函数中:
async function (keyString, token, ttl) {
        return new Promise(function(resolve, reject) {
            redisClient.hmset("auth", keyString, token, function(error,result) {
                if (error) {
                    reject(error);
                } else {
                    redisClient.expire(keyString, ttl)
                    resolve(result);
                }
            });
        });
    }

2
它不能帮助您确保原子性,这已在上面讨论过。 - Pavel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接