我使用go-redis与REDIS服务器(版本3.2.100)进行交互。
根据Redis documentation,如果某个键不存在,那么命令TTL应返回值-2。
但是,如果该键不存在,则方法TTL返回一个值,该值表示某个持续时间(-2s),而不是整数。
下面的代码说明了这种行为。
package main
import (
"github.com/go-redis/redis"
"fmt"
)
func main() {
fmt.Print("Create a REDIS client now.\n")
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
ttl, _ := client.TTL("MyKey").Result()
fmt.Printf("%v\n", ttl)
if ttl < 0 {
if -1 == ttl.Seconds() {
fmt.Print("The key will not expire.\n")
} else if -2 == ttl.Seconds() {
fmt.Print("The key does not exist.\n")
} else {
fmt.Printf("Unexpected error %d.\n", ttl.Seconds())
}
}
}
输出:
Create a REDIS client now.
-2s
The key does not exist.
可以吗?我认为GO方法TTL应该返回一个整数,而不是负的持续时间。
答案 0 :(得分:1)
将redis中现有密钥的TTL作为time.Duration更有用。 -1和-2是异常,声明为主类型。如果TTL返回可能会更方便(* DurationCmd,错误),但我并没有深入研究go-redis逻辑。我在这里没有看到问题。只考虑你总是得到时间。结果是持久的。
答案 1 :(得分:1)
在Redis客户端TTL
的此实现中,返回*DurationCmd
本身不会以任何特殊方式解释-2
和-1
,因此在调用{{1}之后该值表示为Result
。
然后你的代码是正确的;另请注意time.Duration
只是一个带有特殊time.Duration
实现的包装int,因此您会产生这种误导性的Stringer
输出。
在检查特殊负面情况后,您的代码只需打印持续时间就会更优雅。 顺便说一下,你不需要调用关于比较 - 你可以直接比较-2s
duration.Seconds()
和raw int,但是返回的值将是纳秒 - 甚至更多的mimsleading(感谢@Peter指出);所以,你用time.Duration
做了正确的事。
请注意,最好不要忽略您拨打ttl.Seconds()
的错误,这样该行就会变为:
Result
如果您觉得将ttl, err := client.TTL("MyKey").Result()
和-2
视为需要专门错误的特殊情况会更加有效和优雅,那么就有空间在GitHub上打开问题。
希望这有帮助,