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()

有効期限が 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}

おすすめ

転載: blog.csdn.net/xingzuo_1840/article/details/129277351