go-redis使用(redis链接,数据写入,数据查询,存储结构体,自动解析和反解析,MarshalBinary(),UnmarshalBinary())
创始人
2025-05-28 02:01:18
0

文章目录

  • 1. redis链接
    • 1.1 相关结构体
    • 1.2 语法
    • 1.3 完整示例
  • 2. 存数据
    • 2.1 语法
    • 2.2 简单示例
  • 3. 数据查询
    • 3.1 语法
    • 3.2 完整示例
  • 4. 其他示例
    • 4.1 使用结构体
    • 4.2 MarshalBinary()和UnmarshalBinary()

引用包:“github.com/go-redis/redis/v8”

1. redis链接

1.1 相关结构体

type Options struct {Network            stringAddr               stringDialer             func(ctx context.Context, network string, addr string) (net.Conn, error)OnConnect          func(ctx context.Context, cn *Conn) errorUsername           stringPassword           stringDB                 intMaxRetries         intMinRetryBackoff    time.DurationMaxRetryBackoff    time.DurationDialTimeout        time.DurationReadTimeout        time.DurationWriteTimeout       time.DurationPoolFIFO           boolPoolSize           intMinIdleConns       intMaxConnAge         time.DurationPoolTimeout        time.DurationIdleTimeout        time.DurationIdleCheckFrequency time.DurationreadOnly           boolTLSConfig          *tls.ConfigLimiter            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 mainimport ("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.OptionsmyRedis.Addr = "10.10.239.136:6379"myRedis.Password = ""myRedis.DB = 1rdb = 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 mainimport ("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.OptionsmyRedis.Addr = "10.10.239.136:6371"myRedis.Password = ""myRedis.DB = 1rdb = 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 mainimport ("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.OptionsmyRedis.Addr = "10.10.239.136:6379"myRedis.Password = ""myRedis.DB = 1rdb = redis.NewClient(&myRedis)return rdb
}
  • 输出
以string完整输出:get project:users:{user_name}:string: GuanYu
仅输出值:GuanYu

4. 其他示例

4.1 使用结构体

  • 使用结构体
package mainimport ("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,}//结构体转为json字串的[]byteb, 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.OptionsmyRedis.Addr = "10.10.239.136:6379"myRedis.Password = ""myRedis.DB = 1rdb = 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"`
}//var _ encoding.BinaryMarshaler = new(myStruct)
//var _ encoding.BinaryUnmarshaler = new(myStruct)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.Printf("get success: %+v\n", result)fmt.Println(data)}func RedisConnect() (rdb *redis.Client) {var myRedis redis.OptionsmyRedis.Addr = "10.10.239.136:6379"myRedis.Password = ""myRedis.DB = 1rdb = redis.NewClient(&myRedis)return rdb
}
  • 输出
&{UserId:123 UserName:GuanYu Age:25}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...