一文搞懂Go语言操作Redis

2023-10-14 17:20:24 浏览数 (1)

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

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

1 简介

  • 开箱即用的工作与Redis服务器,Redis集群,Redis哨兵。
  • 类型安全的

go-redis为大多数Redis命令提供了类型。

  • 功能丰富的

支持管道、事务、发布/订阅、Lua脚本、模拟、分布式锁等等。

2 使用

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

安装go-redis

代码语言:shell复制
go mod init github.com/my/repo
go get github.com/go-redis/redis/v8

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

代码语言:go复制
//上下文变量
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类型
代码语言:go复制
/**
操作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类型
代码语言:go复制
/**
操作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类型
代码语言:go复制
/**
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类型
代码语言:go复制
/**
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类型
代码语言:go复制
/**
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 操作结构体类型
代码语言:go复制
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)
}

~

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞