go-redis:当密钥不存在时,TTL返回负的持续时间

时间:2018-04-13 14:53:38

标签: go redis ttl

我使用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应该返回一个整数,而不是负的持续时间。

2 个答案:

答案 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上打开问题。

希望这有帮助,