go-redis的TTL方法在Key不存在时返回负时长而非-2整数的问题咨询
嘿,这个问题我之前用go-redis的时候也踩过坑!其实根源是go-redis库对TTL返回值的封装逻辑,和Redis原生返回的整数格式不一样,给你两个简单的解决办法:
解决办法
1. 把Duration转换为整数秒
go-redis会把Redis返回的TTL整数自动包装成time.Duration类型,所以你只需要把这个Duration转成int64类型的秒数就能拿到预期的-2:
package main import ( "github.com/go-redis/redis" "fmt" "time" ) func main() { fmt.Print("Create a REDIS client now.\n") client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) // 先确认连接正常 _, err := client.Ping().Result() if err != nil { panic(err) } // 获取TTL ttl, err := client.TTL("non_existing_key").Result() if err != nil { panic(err) } // 转换为整数秒 ttlSeconds := int64(ttl.Seconds()) fmt.Printf("TTL整数结果: %d\n", ttlSeconds) // 这里会输出-2 }
2. 用RawCmd直接获取原生整数响应
如果你想完全绕过库的封装,直接拿到Redis返回的原始整数,可以用RawCmd来执行TTL命令:
// 直接执行原生TTL命令 ttlCmd := client.RawCmd("TTL", "non_existing_key") ttlInt, err := ttlCmd.Int64() if err != nil { panic(err) } fmt.Printf("TTL原生整数: %d\n", ttlInt) // 直接返回-2
为什么会出现这个情况?
go-redis的设计初衷是为了让开发者更方便地处理时间相关操作——它把Redis返回的TTL秒数自动转换成了Go的time.Duration类型。比如Redis返回-2,库就会转成-2 * time.Second(也就是你看到的-2s),这样你可以直接用这个值做时间操作,比如time.Sleep(ttl)。但如果需要原生的整数返回值,就需要手动转换或者用RawCmd绕开封装。
另外补充下,Redis 3.2.100的TTL行为是完全符合官方文档的:不存在的Key返回-2,存在但无过期时间的Key返回-1,go-redis对这两个值的处理都是转换成对应的Duration(-1s和-2s)。
内容的提问来源于stack exchange,提问作者Denis Kertios
相关产品推荐
相关产品推荐

