详解如何通过Go来操作Redis实现简单的读写操作

 更新时间:2023年09月22日 10:33:56   作者:Shawn590  
作为最常用的分布式缓存中间件——Redis,了解运作原理和如何使用是十分有必要的,今天来学习如何通过Go来操作Redis实现基本的读写操作,需要的朋友可以参考下

为什么要使用Redis?

对于这个问题,最近看到有种比较清晰的说法,想要记录下来:

  • 在微服务的场景下,我们有多台服务器。这多台的服务器需要去并发地操作同一个变量。在这种情况下,显然不能只存放在单个的服务器上面,而应该存放在一个公共的地方——分布式缓存。

  • 我们有时候需要加载大量的数据放入缓存。如果说在每台服务器上面,都开辟一个很大的内存空间来存放这些数据的话,显然非常消耗内存。此时我们应该也把它们挪到一个公共的地方——分布式缓存

导入对应的包

go get github.com/redis/go-redis/v9

创建一个操作Redis的一个客户端

client := redis.NewClient(&redis.Options{
    Addr:"127.0.0.1:6379",      //地址,这里使用本地服务器的默认端口
    Password:"123456",          //访问Redis的密码
    DB:0,                       //使用默认的0号DB
})
ctx :=conetxt.TODO()            //创建一个默认的context

写入和读写string类型的值

func string(ctx context.Context, client *redis.Client) {
	key := "name"
	value := "大脸猫"
	err := client.Set(ctx, key, value, 1*time.Second).Err() //1秒后失效。0表示永不失效
  //错误处理
	if err != nil {  
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
  //通过Expire设置3秒后失效
	client.Expire(ctx, key, 3*time.Second) 
	v2, err := client.Get(ctx, key).Result()
  //错误处理
	if err != nil { 
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
	fmt.Println(v2)
  //删除键
	client.Del(ctx, key)
}

string函数展示了如何与Redis数据库进行交互,包括设置键值对、设置过期时间、获取值以及删除键的操作。下面是详细的解释:

  • func string(ctx context.Context, client *redis.Client) 该函数接受两个参数ctx 是一个类型为 context.Context 的上下文对象,client 是与Redis服务器建立连接的 redis.Client 实例。

  • key := "name"value := "大脸猫"定义一个键(key)和一个值(value。在这里,键被设置为 "name",而值被设置为 "大脸猫"。这些将作为数据存储在Redis中。

  • err := client.Set(ctx, key, value, 1*time.Second).Err()这一行代码使用 client.Set 方法来设置键值对的参数到Redis中。它接受四个参数:

    • ctx:上下文对象,用于处理操作的超时和取消。
    • key:要设置的键。
    • value:要设置的值。
    • 1*time.Second:过期时间,这里设置为1秒,表示在1秒后键值对会失效。如果将过期时间设置为0,键值对将永不失效。
  • client.Expire(ctx, key, 3*time.Second)这是一种另外的方式来设置键的过期时间:通过client.Expire 方法设置键 "name" 在3秒后过期失效。

  • v2, err := client.Get(ctx, key).Result()通过使用client.Get方法来获取键"name"对应的值

  • client.Del(ctx, key) 使用client.Del方法删除键"name",从而把这个键值对从Redis中删除。

写入和读取list类型的值

func list(ctx context.Context, client *redis.Client) {
	key := "ids"
	values := []interface{}{1, "中", 3, 4}
	err := client.RPush(ctx, key, values...).Err() //向List右侧插入。如果List不存在会先创建
	if err != nil { 
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
	v2, err := client.LRange(ctx, key, 0, -1).Result() //截取。双闭区间
	if err != nil { 
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
	fmt.Println(v2)
	client.Del(ctx, key)
} 

list函数展示了Redis的列表(List)数据结构的操作,包括向列表右侧插入值、获取列表元素以及删除列表。下面是详细的解释:

  • func list(ctx context.Context, client *redis.Client) 该函数接受两个参数ctx 是一个类型为 context.Context 的上下文对象,client 是与Redis服务器建立连接的 redis.Client 实例。

  • key := "ids" values := []interface{}{1, "中", 3, 4}定义了一个键(key)和一个值的切片(values)。在这里,键被设置为 "ids",而值的切片包含了多个元素,包括整数1、字符串 "中"、整数3和整数4。这些将作为列表存储在Redis中。

  • err := client.RPush(ctx, key, values...).Err()RPush 方法用于将值添加到列表的右侧,如果列表不存在,它会先创建一个新的列表。在这里,我们将值1、"中"、3和4依次插入到列表 "ids" 中。
    这里的 client.RPush 方法向名为 "ids" 的列表右侧插入多个值。它接受三个参数:

    • ctx:上下文对象,用于处理操作的超时和取消。
    • key:要插入值的列表的键。
    • values...:要插入的多个值。在这里,我们使用了 values... 来将切片 values 的元素展开作为参数。
  • v2, err := client.LRange(ctx, key, 0, -1).Result() LRange 方法用于获取列表中的元素,返回一个字符串切片。在这里,我们将获取到的元素存储在 v2 变量中。这里使用 client.LRange 方法来获取列表 "ids" 中的所有元素。它接受三个参数:

    • ctx:上下文对象,用于处理操作的超时和取消。
    • key:要获取元素的列表的键。
    • 0-1:表示要获取的元素范围,这里是从列表的第一个元素(下标0)到最后一个元素(-1)。这相当于获取整个列表。
  • client.Del(ctx, key) 使用 client.Del 方法删除了键为 "ids" 的列表,从而把这个列表从Redis中删除。

写入和读取hashtable类型的

func hashtable(ctx context.Context, client *redis.Client) {
	//key  field1 value1  field2 value2  ...
	err := client.HSet(ctx, "学生1", "Name", "张三", "Age", 18, "Height", 173.5).Err()
	//错误处理
  if err != nil { 
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
	err = client.HSet(ctx, "学生2", "Name", "李四", "Age", 20, "Height", 180.0).Err()
  //错误处理
  if err != nil { 
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
	age, err := client.HGet(ctx, "学生2", "Age").Result()
  //错误处理
  if err != nil { 
		if err == redis.Nil {
			fmt.Println("key不存在")
		} else {
			fmt.Println(err)
			os.Exit(1)
		}
	} 
	fmt.Println(age)
	for field, value := range client.HGetAll(ctx, "学生1").Val() {
		fmt.Println(field, value)
	}
	client.Del(ctx, "学生1")
	client.Del(ctx, "学生2")
}

hashtable函数具体展示了Redis的哈希表(Hash)数据结构的操作,包括设置字段和值、获取字段的值、获取所有字段-值对以及删除哈希表。下面是详细的解释:

  • func hashtable(ctx context.Context, client *redis.Client) 该函数接受两个参数ctx 是一个类型为 context.Context 的上下文对象,client 是与Redis服务器建立连接的 redis.Client 实例。

  • err := client.HSet(ctx, "学生1", "Name", "张三", "Age", 18, "Height", 173.5).Err()使用 client.HSet 方法向名为 "学生1" 的哈希表中设置多个字段(field)和对应的值(value)。哈希表是一种键值对存储结构,类似于字典。在这里,我们设置了三对字段和值: "Name" 和 "张三"、"Age" 和 18、"Height" 和 173.5。换言之,就是在 "学生1" 哈希表中存储了学生的姓名、年龄和身高信息。

  • age, err := client.HGet(ctx, "学生2", "Age").Result() 使用 client.HGet 方法获取名为 "学生2" 的哈希表中的 "Age" 字段对应的值。在这里,我们获取了学生的年龄信息,并将其存储在 age 变量中。

for field, value := range client.HGetAll(ctx, "学生1").Val() {
   fmt.Println(field, value)
}
  • 使用 client.HGetAll 方法获取名为 "学生1" 的哈希表中的所有字段和对应的值,并将它们以字段-值 对的形式遍历并打印出来。这样可以获取并显示学生1的所有信息。

  • client.Del(ctx, "学生1")client.Del(ctx, "学生2")使用 client.Del 方法删除了 "学生1" 和 "学生2" 两个哈希表。这将从Redis中删除这两个哈希表,清除了示例中使用的数据。

以上就是详解如何通过Go来操作Redis实现简单的读写操作的详细内容,更多关于Go操作Redis实现读写的资料请关注脚本之家其它相关文章!

相关文章

  • 谈谈Go语言的反射三定律

    谈谈Go语言的反射三定律

    本文中,我们将解释Go语言中反射的运作机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。由于本文是介绍Go语言的,所以当我们谈到“反射”时,默认为是Go语言中的反射。
    2016-08-08
  • Golang的命名规范及最佳实践(推荐!)

    Golang的命名规范及最佳实践(推荐!)

    这篇文章主要给大家介绍了关于Golang的命名规范及最佳实践的相关资料,命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名,文中介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Go基础教程系列之import导入包(远程包)和变量初始化详解

    Go基础教程系列之import导入包(远程包)和变量初始化详解

    这篇文章主要介绍了Go基础教程系列之import导包和初始化详解,需要的朋友可以参考下
    2022-04-04
  • go 下载非标准库包(部份包被墙了)到本地使用的方法

    go 下载非标准库包(部份包被墙了)到本地使用的方法

    今天小编就为大家分享一篇go 下载非标准库包(部份包被墙了)到本地使用的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • golang文件读取-按指定BUFF大小读取方式

    golang文件读取-按指定BUFF大小读取方式

    这篇文章主要介绍了golang文件读取-按指定BUFF大小读取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang内存模型教科书级讲解

    Golang内存模型教科书级讲解

    go官方介绍go内存模型的时候说:探究在什么条件下,goroutine 在读取一个变量的值的时,能够看到其它 goroutine 对这个变量进行的写的结果,Go内存模型规定了一些条件,在这些条件下,在一个goroutine中读取变量返回的值能够确保是另一个goroutine中对该变量写入的值
    2023-03-03
  • Go语言中的Iota关键字

    Go语言中的Iota关键字

    这篇文章介绍了Go语言中的Iota关键字,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • go xorm框架的使用

    go xorm框架的使用

    xorm框架和Spring Data Jpa有点相似,可以对比学习,对于这个框架感觉还不错,闲暇时间学习一下
    2021-05-05
  • Go gRPC服务客户端流式RPC教程

    Go gRPC服务客户端流式RPC教程

    这篇文章主要为大家介绍了Go gRPC服务客户端流式RPC教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言异常处理(Panic和recovering)用法详解

    Go语言异常处理(Panic和recovering)用法详解

    异常处理是程序健壮性的关键,往往开发人员的开发经验的多少从异常部分处理上就能得到体现。Go语言中没有Try Catch Exception机制,但是提供了panic-and-recover机制,本文就来详细讲讲他们的用法
    2022-07-07

最新评论