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