Go Redis 字段和结构体映射

go-redis 为返回多个 key-val 的命令提供了一个映射模块将值扫描到结构体中,例如: HGetAllHMGetMGet 命令。

你可以使用 redis 标签来修改字段名称或忽略一些字段,用法和 go json 类似:

type Model struct {
	Str1    string   `redis:"str1"`
	Str2    string   `redis:"str2"`
	Int     int      `redis:"int"`
	Bool    bool     `redis:"bool"`
	Ignored struct{} `redis:"-"`
}

准备一些测试数据:

rdb := redis.NewClient(&redis.Options{
	Addr: ":6379",
})

if _, err := rdb.Pipelined(ctx, func(rdb redis.Pipeliner) error {
	rdb.HSet(ctx, "key", "str1", "hello")
	rdb.HSet(ctx, "key", "str2", "world")
	rdb.HSet(ctx, "key", "int", 123)
	rdb.HSet(ctx, "key", "bool", 1)
	return nil
}); err != nil {
	panic(err)
}

可以使用 HGetAll 命令,把结果映射到 model1 变量中:

var model1 Model
// 扫描所有字段到model1
if err := rdb.HGetAll(ctx, "key").Scan(&model1); err != nil {
	panic(err)
}

HMGet 命令:

var model2 Model
if err := rdb.HMGet(ctx, "key", "str1", "int").Scan(&model2); err != nil {
	panic(err)
}

你可以在 GitHub在新窗口打开 中找到上面的示例。

同样的,也可以把 struct 字段值写入到 redis 中,比如 MSetHSet 命令:

if err := rdb.HSet(ctx, "key", model1).Err(); err != nil {
	panic(err)
}