You need to enable JavaScript to run this app. Go语言如何实现Redis数据读写?Set无报错却无数据问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何实现Redis数据读写?Set无报错却无数据问题排查

Go-Redis Set无报错但查询不到数据的排查与解决

最高概率原因:过期时间参数类型错误(适配新版本go-redis)

  • go-redis v8及以上版本(当前社区主流维护版本)的Set方法,第三个过期时间参数要求传入time.Duration类型,而非直接传int型秒数
  • 你传入的86400会被解析为86400纳秒,换算后过期时间不足1毫秒,Set命令返回OK后key立刻过期,因此不会产生任何报错,但后续无论手动查询还是代码Get都拿不到值
  • 修正方式:将过期时间参数改为带单位的时长,同时导入time包:
import "time"

// 两种等价写法都可以
err := rdb.Set(ctx, topics, data, 24 * time.Hour).Err()
// 或者
err := rdb.Set(ctx, topics, data, 86400 * time.Second).Err()

补充:如果使用的是已停止维护的go-redis v6及更早版本,参数确实是直接传秒数,可根据自身版本对应调整。

次常见排查方向

  • Redis实例/DB不匹配
    • 确认手动查询用的客户端(redis-cli、可视化工具)的连接地址、端口和代码中Addr配置完全一致,没有误连其他本地/远程Redis实例
    • 确认手动查询时切换到了代码指定的DB 0,很多可视化工具默认连接的DB非0,或redis-cli启动时加了-n参数指定了其他DB
    • 确认全局变量rdb在Set执行时没有被其他业务逻辑重新赋值,指向了你预期之外的Redis实例
  • key名存在不可见字符
    • 如果topics变量是从外部配置/接口读取的,可能附带换行、空格、零宽字符等不可见内容,实际存储的key和你手动查询的预期key不一致
    • 可在Set前打印key的实际内容验证:fmt.Printf("实际key: %q, 长度: %d\n", topics, len(topics))
  • 极端情况:内存淘汰策略误删
    • 若Redis配置了maxmemory且内存已满,同时开启allkeys-lru淘汰策略,极端情况下刚写入的key可能被误判为冷数据淘汰,该场景概率极低,优先排查前述问题即可。

快速验证流程

修正过期时间后,在Set逻辑后立刻执行Get逻辑,确认能正常获取到值,再通过Redis客户端对应DB查询验证key存在即可。

内容的提问来源于stack exchange,提问作者chovy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 09:45:05