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实例
- 确认手动查询用的客户端(redis-cli、可视化工具)的连接地址、端口和代码中
- key名存在不可见字符
- 如果
topics变量是从外部配置/接口读取的,可能附带换行、空格、零宽字符等不可见内容,实际存储的key和你手动查询的预期key不一致 - 可在Set前打印key的实际内容验证:
fmt.Printf("实际key: %q, 长度: %d\n", topics, len(topics))
- 如果
- 极端情况:内存淘汰策略误删
- 若Redis配置了
maxmemory且内存已满,同时开启allkeys-lru淘汰策略,极端情况下刚写入的key可能被误判为冷数据淘汰,该场景概率极低,优先排查前述问题即可。
- 若Redis配置了
快速验证流程
修正过期时间后,在Set逻辑后立刻执行Get逻辑,确认能正常获取到值,再通过Redis客户端对应DB查询验证key存在即可。
内容的提问来源于stack exchange,提问作者chovy
相关产品推荐
相关产品推荐

