go-redis包(redis链接,数据写入,数据查询,存储结构体,自动解析和反解析,MarshalBinary(),UnmarshalBinary())
引用包:"github.com/go-redis/redis/v8"
1. redis链接
1.1 相关结构体
| type Options struct { |
| Network string |
| Addr string |
| Dialer func(ctx context.Context, network string, addr string) (net.Conn, error) |
| OnConnect func(ctx context.Context, cn *Conn) error |
| Username string |
| Password string |
| DB int |
| MaxRetries int |
| MinRetryBackoff time.Duration |
| MaxRetryBackoff time.Duration |
| DialTimeout time.Duration |
| ReadTimeout time.Duration |
| WriteTimeout time.Duration |
| PoolFIFO bool |
| PoolSize int |
| MinIdleConns int |
| MaxConnAge time.Duration |
| PoolTimeout time.Duration |
| IdleTimeout time.Duration |
| IdleCheckFrequency time.Duration |
| readOnly bool |
| TLSConfig *tls.Config |
| Limiter Limiter |
| } |
1.2 语法
| func NewClient(opt *Options) *Client |
| rdb := redis.NewClient(&redis.Options{ |
| Addr: "10.10.239.136:6379", |
| Password: "", |
| DB: 1, |
| }) |
1.3 完整示例
| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "github.com/go-redis/redis/v8" |
| ) |
| |
| var ctx = context.Background() |
| |
| func main() { |
| rdb := RedisConnect() |
| fmt.Printf("rdb : %+v", rdb) |
| } |
| |
| func RedisConnect() (rdb *redis.Client) { |
| var myRedis redis.Options |
| myRedis.Addr = "10.10.239.136:6379" |
| myRedis.Password = "" |
| myRedis.DB = 1 |
| rdb = redis.NewClient(&myRedis) |
| return rdb |
| } |
| API server listening at: 127.0.0.1:62059 |
| rdb : Redis<10.10.239.136:6379 db:1> |
| Debugger finished with the exit code 0 |
2. 存数据
2.1 语法
| func (c cmdable) Set(ctx context.Context, key string, value interface{}, expiration time.Duration) *StatusCmd |
| err := rdb.Set(ctx, "project:users:{user_name}:string", "GuanYu", time.Minute*2).Err() |
expiration 为 0 表示没有过期限制
2.2 简单示例
| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "github.com/go-redis/redis/v8" |
| "time" |
| ) |
| |
| var ctx = context.Background() |
| |
| func main() { |
| rdb := RedisConnect() |
| fmt.Printf("rdb : %+v", rdb) |
| |
| err := rdb.Set(ctx, "project:users:{user_name}:string", "GuanYu", time.Minute*2).Err() |
| if err != nil { |
| fmt.Println("err: ", err) |
| } else { |
| fmt.Println("保存成功") |
| } |
| } |
| |
| func RedisConnect() (rdb *redis.Client) { |
| |
| var myRedis redis.Options |
| myRedis.Addr = "10.10.239.136:6371" |
| myRedis.Password = "" |
| myRedis.DB = 1 |
| |
| rdb = redis.NewClient(&myRedis) |
| return rdb |
| } |
| |
- 查看redis

3. 数据查询
3.1 语法
| func (c cmdable) Get(ctx context.Context, key string) *StringCmd |
| esult := rdb.Get(ctx, "project:users:{user_name}:string") |
3.2 完整示例
| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "github.com/go-redis/redis/v8" |
| "time" |
| ) |
| |
| var ctx = context.Background() |
| |
| func main() { |
| rdb := RedisConnect() |
| fmt.Printf("rdb : %+v", rdb) |
| |
| |
| err := rdb.Set(ctx, "project:users:{user_name}:string", "GuanYu", time.Minute*2).Err() |
| if err != nil { |
| fmt.Println("err: ", err) |
| } else { |
| fmt.Println("保存成功") |
| } |
| |
| |
| result := rdb.Get(ctx, "project:users:{user_name}:string") |
| err = result.Err() |
| if err != nil { |
| fmt.Println("err :", err) |
| return |
| } |
| fmt.Printf("以string完整输出:%s\n", result.String()) |
| fmt.Printf("仅输出值:%s\n", result.Val()) |
| |
| } |
| |
| func RedisConnect() (rdb *redis.Client) { |
| var myRedis redis.Options |
| myRedis.Addr = "10.10.239.136:6379" |
| myRedis.Password = "" |
| myRedis.DB = 1 |
| rdb = redis.NewClient(&myRedis) |
| return rdb |
| } |
| 以string完整输出:get project:users:{user_name}:string: GuanYu |
| 仅输出值:GuanYu |
4. 其他示例
4.1 使用结构体
| package main |
| |
| import ( |
| "context" |
| "encoding/json" |
| "fmt" |
| "github.com/go-redis/redis/v8" |
| "time" |
| ) |
| |
| var ctx = context.Background() |
| |
| type UserName struct { |
| UserId int64 `json:"user_id"` |
| UserName string `json:"user_name"` |
| Age int64 `json:"age"` |
| } |
| |
| func main() { |
| rdb := RedisConnect() |
| |
| data := &UserName{ |
| UserId: 1, |
| UserName: "LiuBei", |
| Age: 28, |
| } |
| |
| |
| b, err := json.Marshal(data) |
| if err != nil { |
| fmt.Println(err) |
| } |
| |
| |
| err = rdb.Set(ctx, "project:users:{user_name}:struct", string(b), time.Minute*2).Err() |
| if err != nil { |
| fmt.Println("err: ", err) |
| } |
| |
| |
| result := rdb.Get(ctx, "project:users:{user_name}:struct") |
| fmt.Println(result.Val()) |
| } |
| |
| func RedisConnect() (rdb *redis.Client) { |
| var myRedis redis.Options |
| myRedis.Addr = "10.10.239.136:6379" |
| myRedis.Password = "" |
| myRedis.DB = 1 |
| rdb = redis.NewClient(&myRedis) |
| return rdb |
| } |
| {"user_id":1,"user_name":"LiuBei","age":28} |
4.2 MarshalBinary()和UnmarshalBinary()
-
MarshalBinary()
- 如上例,写入的时候需要对结构体实例解析,其实
go-redis
已经提供了一个解析方法供我们使用。
- 使用Set()方法时,它会自动调用结构体的
MarshalBinary()
方法
- 因此我们只需定义结构体的这个方法来解析结构体(结构体的名字是go-redis定义的,我们不能改。见完整代码)
-
UnmarshalBinary()
- 如上例,读取数据的时候,需要用 *redis.StringCmd的实例来接收。其实
go-redis
已经提供了一个方法让我们的自定义结构体接收它。
- 使用Get方法的时候,它会自动调用结构体的
MarshalBinary()
方法
- 因此我们只需定义结构体的这个方法来解析结构体(见完整代码)
-
完整代码
| import ( |
| "context" |
| "encoding/json" |
| "fmt" |
| "github.com/go-redis/redis/v8" |
| ) |
| |
| type myStruct struct { |
| UserId string `json:"user_id"` |
| UserName string `json:"user_name"` |
| Age int64 `json:"age"` |
| } |
| |
| |
| |
| |
| func (m *myStruct) MarshalBinary() (data []byte, err error) { |
| return json.Marshal(m) |
| } |
| |
| func (m *myStruct) UnmarshalBinary(data []byte) error { |
| return json.Unmarshal(data, m) |
| } |
| |
| func main() { |
| var ctx = context.Background() |
| rdb := RedisConnect() |
| |
| data := &myStruct{ |
| UserId: "123", |
| UserName: "GuanYu", |
| Age: 25, |
| } |
| |
| err := rdb.Set(ctx, "project:users:{user_name}:struct", data, 0).Err() |
| if err != nil { |
| fmt.Println(err) |
| } |
| |
| |
| result := &myStruct{} |
| err = rdb.Get(ctx, "project:users:{user_name}:struct").Scan(result) |
| if err != nil { |
| fmt.Println(err) |
| } |
| |
| fmt.Println(data) |
| |
| } |
| |
| func RedisConnect() (rdb *redis.Client) { |
| var myRedis redis.Options |
| myRedis.Addr = "10.10.239.136:6379" |
| myRedis.Password = "" |
| myRedis.DB = 1 |
| rdb = redis.NewClient(&myRedis) |
| return rdb |
| } |
| |
| &{UserId:123 UserName:GuanYu Age:25} |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了