You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:49