Go语言操作Redis的客户端工具有很多,今天我们就选择比较常见的一个来进行演示,这个就是​​go-redis​


GitHub链接:https://github.com/go-redis/redis


1 简介

  • 开箱即用的工作与Redis服务器,Redis集群,Redis哨兵。
  • 类型安全的
    go-redis为大多数Redis命令提供了类型。
  • 功能丰富的
    支持管道、事务、发布/订阅、Lua脚本、模拟、分布式锁等等。

2 使用

在使用之前我们一定要先将自己的项目安装好go-redis包,然后再进行初始化操作,具体步骤如下:

安装go-redis

go mod init github.com/my/repo
go get github.com/go-redis/redis/v8

新建go文件,初始化redis.Client,以下的每一个函数都在该文件内

//上下文变量
var ctx = context.Background()

//redis操作指针
var rdb *redis.Client

/**
初始化*redis.Client
*/
func init() {
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
}

2.1 操作String类型

/**
操作String类型
*/
func ExampleString() {
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
fmt.Println(err)
}
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
fmt.Println(err)
}
fmt.Println("key", val)
}

2.2 操作List类型

/**
操作List类型
*/
func ExampleList() {
list := []interface{}{2, 3, 4, 5, 6}
//添加数组类型元素
err := rdb.LPush(ctx, "list", list).Err()
if err != nil {
fmt.Println(err)
}
//获取长度
rLen, err := rdb.LLen(ctx, "list").Result()
//获取根据范围获取数据
lists, err := rdb.LRange(ctx, "list", 0, rLen-1).Result()
fmt.Println(lists)
//遍历全部元素
for item := range lists {
fmt.Println(lists[item])
}
}

2.3 操作Set类型

/**
Set类型
*/
func ExampleSet() {
set := []interface{}{"s", "3", "5", 4, "sw", "s"}
//添加zSet类型
result, err := rdb.SAdd(ctx, "set", set).Result()
if err != nil {
fmt.Println(result)
fmt.Println("err")
}
//获取和变量zSet类型变量
members, err := rdb.SMembers(ctx, "set").Result()
for i := range members {
fmt.Println(members[i])
}
}

2.4 操作ZSet类型

/**
ZSet类型
*/
func ExampleZSet() {
//zSet类型需要使用特定的类型值*redis.Z,以便作为排序使用
zs := redis.Z{1, "zs"}
ls := redis.Z{2, "ls"}
ww := redis.Z{3, "ww"}
member := []*redis.Z{&zs, &ls, &ww}
//插入ZSet类型
result, err := rdb.ZAdd(ctx, "zset", member...).Result()
if err != nil {
fmt.Println(result)
fmt.Println("err")
}
//将ZSet中的某一个元素顺序值增加
newScore, err := rdb.ZIncrBy(ctx, "zset", 5.0, "zs").Result()
fmt.Println("zs加5分后的最新分数", newScore)
//根据分数排名取出元素
zsetList2, _ := rdb.ZRevRangeWithScores(ctx, "zset", 0, 1).Result()
fmt.Println("zset前2名热度的", zsetList2)
}

2.5 操作Map类型

/**
Map类型
*/
func ExampleMap() {
my_map := map[string]interface{}{
"id": 1,
"name": "zs",
"age": 23,
}
//插入map类型变量
result, err := rdb.HMSet(ctx, "map", my_map).Result()
if err != nil {
fmt.Println(result)
fmt.Println("err")
}
//获取map类型变量的全部值
get_map_all, err := rdb.HGetAll(ctx, "map").Result()
fmt.Println(get_map_all)
//获取map类型变量的某一个字段值
get_map, err := rdb.HMGet(ctx, "map", "name").Result()
fmt.Println(get_map)
}

2.6 操作结构体类型

type Student struct {
Id int64
Name string
Age int
}

func (stu Student) MarshalBinary() ([]byte, error) {
return json.Marshal(stu)
}

/**
Struct类型
*/
func ExampleStruct() {
student := Student{1, "zs", 23}
//将结构体转化为json类型
bytes, err2 := student.MarshalBinary()
if err2 != nil {
fmt.Println("err", err2)
}
//插入结构体类型变量
result, err := rdb.Set(ctx, "student", bytes, 0).Result()
if err != nil {
fmt.Println(result)
fmt.Println("err", err)
}
stu, err := rdb.Get(ctx, "student").Result()
//将获取的json反序列化成结构体
var studen Student
err = json.Unmarshal([]byte(stu), &studen)
fmt.Println(studen)
}

~