一文搞懂Go语言操作Redis

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 一文搞懂Go语言操作Redis

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

~

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
60 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
42 7
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
105 71
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
109 67
|
1月前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
106 62
|
1天前
|
监控 安全 算法
深度剖析核心科技:Go 语言赋能局域网管理监控软件进阶之旅
在局域网管理监控中,跳表作为一种高效的数据结构,能显著提升流量索引和查询效率。基于Go语言的跳表实现,通过随机化索引层生成、插入和搜索功能,在高并发场景下展现卓越性能。跳表将查询时间复杂度优化至O(log n),助力实时监控异常流量,保障网络安全与稳定。示例代码展示了其在实际应用中的精妙之处。
24 9
|
11天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
46 12
|
1月前
|
存储 Go
go语言中映射
go语言中映射
41 11
|
1月前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
40 12