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,
	}

	//结构体转为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}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,使用 Go 语言将经纬度写入 Redis 可以使用以下步骤: 1. 首先需要安装 Go 的 Redis 客户端库,可以使用以下命令进行安装: ``` go get github.com/go-redis/redis ``` 2. 然后在 Go 代码中引入 Redis 客户端库,例如: ``` import "github.com/go-redis/redis" ``` 3. 着创建 Redis 客户端实例,连Redis 数据库,例如: ``` client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis 服务器地址和端口号 Password: "", // Redis 认证密码 DB: 0, // Redis 数据库编号 }) // 测试连是否成功 pong, err := client.Ping().Result() fmt.Println(pong, err) ``` 4. 最后使用 Redis 的 GEOADD 命令将经纬度写入 Redis,例如: ``` // GEOADD 命令格式:GEOADD key longitude latitude member [longitude latitude member ...] // 将经度为 116.404 和纬度为 39.915 写入 Redis 的 "locations" 集合中,成员名称为 "Beijing" client.GeoAdd("locations", &redis.GeoLocation{ Name: "Beijing", Longitude: 116.404, Latitude: 39.915, }) ``` 5. 如果需要一次写入多个经纬度可以使用以下方式: ``` // 使用 GEOADD 命令一次写入多个经纬度 locations := []*redis.GeoLocation{ {Name: "Beijing", Longitude: 116.404, Latitude: 39.915}, {Name: "Shanghai", Longitude: 121.473, Latitude: 31.230}, {Name: "Guangzhou", Longitude: 113.264, Latitude: 23.129}, } client.GeoAdd("locations", locations...) ``` 以上是使用 Go 语言将经纬度写入 Redis 的基本步骤,您可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值