go-redis包

引用包:"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,
}
//结构体转为json字串的[]byte
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"`
}
//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.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}

posted on   运维开发玄德公  阅读(116)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示