如何在Golang中设置Redis键的过期时间

8

我正在使用golang作为后端,将一些令牌值存储在redis中。我使用HSET设置这些值,并使用HGETALL获取这些值。我想知道是否有任何函数可以为存储在redis数据库中的密钥设置到期时间。我希望在1小时后删除令牌及其数据。我正在使用Redigo包进行redis操作。感谢您的帮助。

I use this to set the struct with has token as key    
redisCon.Do("HMSET", redis.Args{}.Add(hashToken).AddFlat(&dataStruct)...)

1
你应该告诉其他人你使用的Redis库。另外,你可以在"godoc.com"上搜索关于如何使用它的信息。 - Laily
我在客户端使用redigo库连接到redigo服务器,使用c.Do("HMSET", ciphertext, 3200, datastruct)这样的方式。其中cipertext是键,3200是ttl,datastruct是包含令牌详细信息的结构体。但是检查该键的ttl时,显示为-1...非常感谢任何帮助。谢谢。 - Rajesh Kumar
2个回答

10
对于使用go-redis库的用户,您可以通过调用以下方法来设置过期时间:
_, err = redisClient.Expire("my:redis:key", 1 * time.Hour).Result()

或者,您可以在插入时进行此操作

_, err = redisClient.Set("my:redis:key", "value", 1 * time.Hour).Result()

过期时间无效。 - chovy
@chovy,你正在使用哪个版本的Redis?你得到的错误是“无效的时间过期”吗?你尝试设置的时间值是多少秒? - Jossef Harush Kadouri
我没有使用 time.Hour,我猜那是必需的。我只是传递了 86400,我猜那也是纳秒,所以它立即过期了。 - chovy

6

Redis文档并不支持类似于"HMSETEX"的命令。 "HMSET"修改哈希键,而不是根键。TTL在根键级别上受支持,而不是哈希键级别上受支持。因此,在您的情况下,您必须在单独的调用中执行类似于以下操作:

redisCon.Do("EXPIRE", key, ttl)

您连接Redis时使用的是哪个客户端?
对于redigo,您可以使用这个 - https://github.com/yadvendar/redigo-wrapper。 在其中使用以下调用:
func Expire(RConn *redigo.Conn, key string, ttl int)

对于goredis - https://godoc.org/gopkg.in/redis.v5#Client.TTL 在这种情况下使用:

func (c *Client) TTL(key string) *DurationCmd

谢谢。过期时间只有在我单独设置时才会被设置。但是当我将两者结合在hset中并使用密钥检查ttl时,它显示为-1。请问这里出了什么问题。我使用了类似于c.Do(“HMSET”,ciphertext,3200,datastruct)的东西。对于您的信息,datastruct是具有一些字段的令牌结构。感谢任何帮助... - Rajesh Kumar
如果这种方法适用于您,请将其分别设置为两个调用可能是最好的。如果您对使用的程序包没有承诺,那么检查一下此程序包 https://github.com/keimoon/gore/wiki/Pipeline 可能值得一试。使用Pipeline工具,您可以设置调用并同时运行它们。所以先设置再过期。 - reticentroot
你需要单独设置它。根据Redis的官方文档,它支持将字符串数据设置为值并为给定的键设置到期时间的"SETEX"命令http://redis.io/commands/setex。它不支持任何"HMSETEX"命令,因此我认为你需要单独调用它。 - Yadvendar

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