Go用redis/v9存字符串必须调用client.Set()并传string值,struct/map需JSON序列化;过期时间用time.Duration;中文emoji需确保UTF-8编码;client.Set()操作Redis String类型,非Set集合结构。

Go 连 Redis 用 redis.Set 存字符串,别直接传 struct 或 map
Go 里用 github.com/go-redis/redis/v9 写入字符串到 Redis,核心是调用 client.Set() 方法。它只接受 string 类型的值(或能转成 string 的类型),不能直接塞 struct、map 或 []byte —— 否则会 panic 或存成乱码。
常见错误现象:redis: nil 报错(实际是传了 nil 值),或存进去后用 redis-cli 查看是 &{...} 这种 Go 内存地址格式(说明误用了 fmt.Sprint() 或没序列化)。
- 必须手动序列化:JSON 是最稳妥选择,用
json.Marshal()转成[]byte,再转string;或直接用string(b) - 过期时间单位是
time.Duration,别传整数秒(如3600),得写3600 * time.Second - 如果值本身含双引号或换行,
json.Marshal()会自动转义,安全;手拼字符串容易出错
client.Set() 的三个必填参数和常见配置项
client.Set(ctx, key, value, expiration) 是最简调用形式,四个参数缺一不可:
-
ctx:带超时的 context,别用context.Background()在生产环境长期运行 -
key:string,建议加命名空间前缀,比如"user:123:profile",避免键冲突 -
value:必须是 string;若原数据是 int/bool,用strconv.Itoa()或fmt.Sprintf()转,别用string(int)(那是 ASCII 码转换) -
expiration:过期时间,0表示永不过期;-1 * time.Second表示删除该 key(等价于DEL)
可选配置通过 redis.SetArgs{} 传,比如:
立即学习“go语言免费学习笔记(深入)”;
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
redis.SetArgs{
Mode: redis.SetNX, // 仅当 key 不存在时设置(实现分布式锁常用)
Get: true, // 返回旧值(Redis 6.2+ 支持)
}
存中文、emoji 或特殊字符要确认编码和客户端配置
Go 字符串默认是 UTF-8 编码,Redis 也原生支持,但问题常出在中间环节:
- 如果从 HTTP 请求体或数据库读取的字符串本身是乱码(比如 GBK 编码未转 UTF-8),存进去还是乱码
- 用
redis-cli查看时,终端不支持 UTF-8 显示(如某些 Windows CMD),会显示\u4f60\u597d,这不是 Redis 问题,是显示层问题 - 确保
redis.NewClient()初始化时没误设Option.Password或Option.DB导致连错实例(不同 DB 间数据隔离)
验证方法:存一个明确的中文字符串,然后用 redis-cli -h host -p port GET your:key 直接查,输出应为原始中文。
Set 类型不是这里说的 client.Set(),别混淆
标题里提到“用 Set 存储字符串”,容易误解为 Redis 的 SET 数据结构(即集合)。但 client.Set() 是命令名,对应 Redis 的 SET 命令,操作的是 String 类型的键值对,不是集合。
如果真要存「多个不重复字符串」(比如用户标签列表),该用 client.SAdd() + client.SMembers() 操作 Set 结构:
client.SAdd(ctx, "user:123:tags", "golang", "redis", "backend")
vals, _ := client.SMembers(ctx, "user:123:tags").Result()
// vals 是 []string{"golang", "redis", "backend"}(顺序不定)
String 类型和 Set 类型底层存储、内存占用、适用场景完全不同:前者适合单值缓存(如用户资料 JSON),后者适合去重集合操作(如粉丝 ID 列表)。选错类型,后期改起来成本高。

















