redis基础连通只需redis-cli ping返回pong,go连接失败90%因服务未启动或监听地址错误;应改用127.0.0.1:6379、显式设超时、用go-redis/v9、注意set过期时间单位为time.duration。

能连上 Redis 服务,且 Set/Get 不报错,就算基础环境配通了。 其他所谓“完整配置”都是后续优化项,别被带偏。
redis-cli ping 能回 PONG 才算 Redis 活着
Go 程序连不上,90% 是 Redis 根本没跑起来,或者监听地址不对。别急着改代码,先本地验证服务状态:
- 终端执行
redis-cli ping,返回PONG才说明服务在线;如果报Connection refused,就不是 Go 的问题 - Mac 用户用
brew services start redis启动;Linux 用sudo systemctl start redis - 检查
redis.conf:确认bind包含127.0.0.1(不是只写::1),protected-mode no可临时设为no(上线前必须改回yes)
Go 里别写 "localhost",改用 "127.0.0.1:6379"
DNS 解析 localhost 在某些系统(尤其是 macOS 和 Docker)会优先走 IPv6,导致连接 [::1]:6379 失败。这不是 bug,是行为预期。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 把
Addr: "localhost:6379"改成Addr: "127.0.0.1:6379" - 超时参数必须显式设:
DialTimeout: 3 * time.Second、ReadTimeout: 2 * time.Second、WriteTimeout: 2 * time.Second,否则网络卡住会 hang 住整个 goroutine - 用
github.com/redis/go-redis/v9,别用老版本go-redis/v8或 redigo —— v9 错误类型更明确,比如redis.Nil表示 key 不存在,redis.ConnErr才是真断连
Set() 成功但 Get() 返回空?大概率是过期时间单位错了
这是新手踩坑最密集的点。v9 的 Set() 第三个参数是 time.Duration,传整数 10 就是 10 纳秒,不是 10 秒。
- 错误写法:
rdb.Set(ctx, "key", "val", 30)→ 实际过期 30 纳秒,几乎立刻失效 - 正确写法:
rdb.Set(ctx, "key", "val", 30 * time.Second)或time.Minute等标准单位 - 调试时加一行
fmt.Printf("ttl: %v\n", rdb.TTL(ctx, "key").Val()),看返回值是不是负数(-1 表示永不过期,-2 表示 key 不存在)
环境变量配置别硬编码,但也不用一上来就搞复杂解析
开发阶段直接读 REDIS_ADDR 和 REDIS_PASSWORD 就够用,不用强求 REDIS_URL 全格式支持。
- 最小可用配置:
os.Getenv("REDIS_ADDR")默认 fallback 到"127.0.0.1:6379",密码同理 - 数据库编号(
DB)建议显式传0,别依赖默认值,避免不同环境行为不一致 - 连接池大小(
PoolSize)开发期设 10–20 足够,别盲目调大;生产再按压测结果调
真正容易被忽略的是 context 生命周期——别把一个短命的 ctx(比如 HTTP 请求的)传给后台缓存操作,否则还没等 Set 完就 cancel 了;该用 context.Background() 的地方别犹豫。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










