♟Go语言那些事儿之Redis连接与数据操作♟

举报
Regan Yue 发表于 2021/08/04 09:49:19 2021/08/04
【摘要】 一、安装所需第三方包在命令行模式下执行go get github.com/garyburd/redigo/redis可将该包下载到GOPATH的路径下。 二、启动 redis-server 和redis-cli启动服务端要记得加上配置文件 redis-server .\redis.windows.conf启动客户端,如果有密码记得输入密码。C:\Users\11316\Desktop\re...

一、安装所需第三方包

在命令行模式下执行go get github.com/garyburd/redigo/redis

可将该包下载到GOPATH的路径下。

二、启动 redis-server 和redis-cli

启动服务端要记得加上配置文件

 redis-server .\redis.windows.conf

启动客户端,如果有密码记得输入密码。

C:\Users\11316\Desktop\redis-latest>redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379>

三、编写代码

package main

import (
	"github.com/garyburd/redigo/redis"
	"fmt"
	"os"
)

func HandleError(err error,when string)  {
	if err!=nil{
		fmt.Println(when,err)
		os.Exit(1)
	}
}
func main() {
	// Dial connects to the Redis server at the given network and
	// address using the specified options.
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	HandleError(err,"redis.Dial")

	//延时关闭连接
	defer conn.Close()
	// Do sends a command to the server and returns the received reply.
	// 命令的名字 和 参数
	reply, err := conn.Do("Get", "name")
	HandleError(err,"conn.Do Get")
	fmt.Printf("type=%T value=%v",reply,reply)

	//根据具体的业务类型进行数据类型转换
	nameStr, _ := redis.String(reply, err)
	fmt.Println(nameStr)

}

先是导入了有关包。

然后写了一个处理错误的函数。os.Exit(1)表示出错,程序会马上结束运行,并且 defer 的东西不会再执行。

redis.Dial()这个函数是用来连接redis的,需要给定网络协议和IP地址及端口号,redis的端口号默认为6379.

defer conn.Close()表示延时结束与redis的连接,为了节省系统的io资源,需要及时结束!新手很容易忘记这个,要养成习惯!

conn.Do()是用来执行数据库命令的,第一个参数是命令名,后面的参数是数据库命令的参数。它返回的结果中reply是字节数组[]byte类型,需要根据具体的业务类型进行数据类型转换。

四、一起来了解Do()函数

conn.Do()替换为下列代码:

reply, err := conn.Do("llen", "list")

执行结果为:

type=int64 value=5

发现没有正确打印结果,打印的是空字符串,也就是reply未成功输出。

然后我们更改数据类型转换的函数。

使用:

nameStr, _ := redis.Int(reply, err)

因为查询结果是Int类型,所以我们之前转换成String是不能成功的。这里我们现在使用Int(),就可以成功转换输出了。

我们来看看运行结果吧!

type=int64 value=5
5

同理,是Float类型我们就需要使用Float(),是什么类型就需要转换为什么类型,这样才能正确输出。

操作数据

set操作

reply, err := conn.Do("SET", "myname","ReganYue")

运行结果:

type=string value=OK
OK

这后面就需要用

redis.String()

来将byte[]类型的数据转换为字符串类型的数据,才能正确输出。

reply, err := conn.Do("setex","yourname",20,"hello")

如上所示,如果有多个参数就用多个参数,就是把命令行里面的空格变成逗号,然后是字符串用双引号括起来,不是字符串就不用双引号。

上面代码执行结果:

type=string value=OK
OK
127.0.0.1:6379> ttl yourname
(integer) 5
127.0.0.1:6379> ttl yourname
(integer) 2
127.0.0.1:6379> ttl yourname
(integer) 1
127.0.0.1:6379> ttl yourname
(integer) -2

说明执行成功了!

redis.String()和redis.Strings()

reply, err := conn.Do("lrange","list",0,-1)

如果执行这条语句,那么可以使用redis.Strings()

nameStr, _ := redis.Strings(reply, err)

结果是这个:

type=[]interface {} value=[[49] [110 97 109 101] [51] [50] [49]]
[1 name 3 2 1]

如果使用redis.String(),那么结果就是这个:

type=[]interface {} value=[[49] [110 97 109 101] [51] [50] [49]]

来观察一下他们有什么区别吧!

这是我们需要注意的地方,这里如果使用redis.String()就会导致无输出结果。

Redis支持管道化,你可以使用管道化技术

管道化操作有Send(),Flush(),Receive()方法

Do方法将Send,Flush和 Receive方法组合在一起。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。