Redis数据库学习笔记03--go语言与Redis数据库简单交互

目录

1.使用go语言与redis数据库交互配置

1.1 安装redis数据库操作工具包redigo

1.2 测试redigo工具包是否正常工作

1.3 redigo工具包来源

1.4 go get命令概述

2.redigo工具包简单使用说明

3.go语言与Redis数据库简单交互

3.1 准备工作

3.2 链接redis数据库

3.3 使用send方法对redis数据库写入数据

3.4 使用do方法对redis数据库读写数据

3.5 使用Scan接口和Values接口操作多条不同类型数据

3.6 通过序列化与反序列化方法对redis数据库进行复杂数据的读写操作


1.使用go语言与redis数据库交互配置

由于NoSQL类型的数据库并没有统一的执行标准,因此对于redis数据库来说想要操作就必须先找到一套趁手的工具,或者自己创建一套。当然我这初学者只能先使用别人的工具了,稍后再说工具的出处,我们直奔主题先将工具安装完毕保证能够使用go来操作redis之后再聊别的。

1.1 安装redis数据库操作工具包redigo

直接执行指令:【~/ $ go get -u -v github.com/gomodule/redigo/redis】,在网络正常的情况下会在几秒钟之内下载并安装完毕。

***deMacBook-Pro:~ ***$ go get -u -v github.com/gomodule/redigo/redis
github.com/gomodule/redigo (download)
github.com/gomodule/redigo/redis

***deMacBook-Pro:~ ***$

1.2 测试redigo工具包是否正常工作

测试redigo工具包是否正常工作,实际上就是测试go语言能否通过redigo提供的方法来对redis数据库进行编辑或添加内容。所以我们需要先在go的环境下创建一个.go测试文件,至于名字无所谓就叫test.go就行。

***deMacBook-Pro:~ ***$ ls
Desktop Downloads Movies Pictures
Documents Library Music Public

***deMacBook-Pro:~ ***$ cd Desktop/
***deMacBook-Pro:Desktop ***$ ls
goLearn goTest                   #我自己桌面上就俩文件夹,一个goLearn是beego写代码的workSpace,一个goTest是git路径。

***deMacBook-Pro:Desktop ***$ cd goTest
***deMacBook-Pro:goTest ***$ ls
README.md conf models static views
a.code controllers project02 temp.code
b.code main.go routers tests

shangyujiedeMacBook-Pro:goTest shangyujie$ vim test.go

然后在test.go测试文件中添加下列go代码内容,直接:wq保存退出。这段代码的含义是能够向redis数据库中添加一条key为c1,value为hello的数据。

package main
import ( "github.com/gomodule/redigo/redis")

func main(){
    conn,_ := redis.Dial("tcp", ":6379")
    defer conn.Close()
    conn.Do("set", "c1", "hello")
}

然后将这个test.go文件编译,然后执行它。

***deMacBook-Pro:goTest ***$ ls
README.md conf models static tests
a.code controllers project02 temp.code views
b.code main.go routers test.go        #test.go是刚刚创建的

***MacBook-Pro:goTest ***$ go build test.go
***deMacBook-Pro:goTest ***$ ls
README.md conf models static test.go
a.code controllers project02 temp.code tests
b.code main.go routers test views     #go build编译文件会生成一个test文件
            
***deMacBook-Pro:goTest ***$ ./test   #执行这个test文件
                

然后进入redis数据库,如果能够查看到非手动添加的key的value值证明环境配置成功。

***deMacBook-Pro:goTest ***$ redis-cli
127.0.0.1:6379> get c1
"hello"

127.0.0.1:6379>

OK 搞定!配置完成。

1.3 redigo工具包来源

由于redis是一个NoSQL数据库,因此并不存在所谓的统一标准操作语言。所以在官网redis.cn中选择客户端来选择我们对应的语言。

然后在下面支持的语言中选择go语言

然后下面有很多可以提供go-redis相互操作的工具包,我选的是星标的redigo工具。点击branch标志分支标志准备去github下载工具包

进入github页面资源分享页面,能够看到readMe中说明维护地址已经发生转移,所以复制链接github.com/gomodule/redigo继续跳转

在跳转到的页面中发现有redis文件夹,终于发现redigo本体。所以最终工具包下载路径就是github.com/gomodule/redigo/redis。

1.4 go get命令概述

go get命令可以根据要求和实际情况,从互联网上下载或更新指定的代码包及其依赖包并对它们进行编译和安装。其中-u 和-v是比较常见的两个命令标记。

标记名称

标记描述

-d

让命令程序只执行下载动作,而不执行安装动作。

-f

仅在使用-u标记时才有效。该标记会让命令程序忽略掉对已下载代码包的导入路径的检查。如果下载并安装的代码包所属的项目是你从别人那里Fork过来的,那么这样做就尤为重要了。

-fix

让命令程序在下载代码包后先执行修正动作,而后再进行编译和安装。

-insecure

允许命令程序使用非安全的scheme(如HTTP)去下载指定的代码包。如果你用的代码仓库(如公司内部的Gitlab)没有HTTPS支持,可以添加此标记。请在确定安全的情况下使用它。

-t

让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。

-u

让命令利用网络来更新已有代码包及其依赖包。默认情况下,该命令只会从网络上下载本地不存在的代码包,而不会更新已有的代码包。

-v

打印出被构建的代码包的名字

-x

打印出用到的命令

所以刚刚下载redigo工具包的指令就是【~/ $ go get -u -v github.com/gomodule/redigo/redis】,表示使用go get -u 指令去github指定url处下载redis工具包并安装,并采用-v标记将安装过程展示。

2.redigo工具包简单使用说明

redigo工具包使用说明文档地址:https://godoc.org/github.com/gomodule/redigo/redis,内部有redigo工具包所有具体的详细说明。一般情况下redigo主要使用的只有三大类接口:

  • 连接指令接口:以Dial开头的接口全都是,但是一般只使用Dial接口足够用。
  • 执行指令接口:Do 和 Send 主要就这两个指令接口
  • 转换指令接口:Index下的Variables类接口

三种接口主要特殊说明一下转换指令接口。这一类接口在文档页面检索Index,得到的结果都是转换指令接口。他们存在的目的在于:因为redis中所有的value都必须是string类型,所以当存储其他数据类型的时候需要进行数据类型转换,而当数据被从redis中取出后也要进行数据类型转换从而变回原来的数据类型。转换类型接口就是用来做数据类型转换工作的。

需要了解一点就是redis数据库近年来逐渐在升温,使用的频度也越来越高。但是这并不意味着redis数据库就什么都好,可以彻底摒弃mysql这类关系型数据库转而完全投入redis的怀抱,毕竟两种数据库结构决定了他们的优势方向不同。关系型数据库适用于存储大量的、不会频繁读写的数据,而内存型数据库则适用于存储一些经常使用、加载非常频繁的数据。这具体可以参考https://blog.csdn.net/qq_26050385/article/details/80983508博主文章。所以两者综合使用是一个比较好的也是现在的一个趋势的选择。例如数据原本存放在mysql中,可以在第一次加载的时候将数据存入redis中,而后如果需要再次获取数据就从redis里面获取。这样就能大大提高页面的加载速度。

3.go语言与Redis数据库简单交互

3.1 准备工作

第一步:准备redis干净数据库

***deMacBook-Pro:~ ***$ redis-cli
127.0.0.1:6379> keys *
(empty list or set)

第二步:使用beego创建干净的go工程

***deMacBook-Pro:~ ***$ bee new goredistest
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0
2018/12/12 23:42:51 WARN     ▶ 0001 You current workdir is not inside $GOPATH/src.
2018/12/12 23:42:51 INFO     ▶ 0002 Creating application...
	create	 /Users/***/Desktop/goLearn/src/goredistest/
	create	 /Users/***/Desktop/goLearn/src/goredistest/conf/
	create	 /Users/***/Desktop/goLearn/src/goredistest/controllers/
	create	 /Users/***/Desktop/goLearn/src/goredistest/models/
	create	 /Users/***/Desktop/goLearn/src/goredistest/routers/
	create	 /Users/***/Desktop/goLearn/src/goredistest/tests/
	create	 /Users/***/Desktop/goLearn/src/goredistest/static/
	create	 /Users/***/Desktop/goLearn/src/goredistest/static/js/
	create	 /Users/***/Desktop/goLearn/src/goredistest/static/css/
	create	 /Users/***/Desktop/goLearn/src/goredistest/static/img/
	create	 /Users/***/Desktop/goLearn/src/goredistest/views/
	create	 /Users/***/Desktop/goLearn/src/goredistest/conf/app.conf
	create	 /Users/***/Desktop/goLearn/src/goredistest/controllers/default.go
	create	 /Users/***/Desktop/goLearn/src/goredistest/views/index.tpl
	create	 /Users/***/Desktop/goLearn/src/goredistest/routers/router.go
	create	 /Users/***/Desktop/goLearn/src/goredistest/tests/default_test.go
	create	 /Users/***/Desktop/goLearn/src/goredistest/main.go
2018/12/12 23:42:51 SUCCESS  ▶ 0003 New application successfully created!
***deMacBook-Pro:~ ***$ 

第三步:使用IDE打开,找到controllers/default.go,准备编写测试代码

准备完毕。

3.2 链接redis数据库

3.3 使用send方法对redis数据库写入数据

图中使用redigo工具接口send向redis数据库中写入了两个字段,分别是frankName和frankAge。

在终端命令中使用beego指令开启服务器

***deMacBook-Pro:goRedis ***$ bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0
2018/12/12 12:57:12 INFO     ▶ 0001 Using 'goRedis' as 'appname'
2018/12/12 12:57:12 INFO     ▶ 0002 Initializing watcher...
goRedis/controllers
goRedis/routers
goRedis
2018/12/12 12:57:18 SUCCESS  ▶ 0003 Built Successfully!
2018/12/12 12:57:18 INFO     ▶ 0004 Restarting 'goRedis'...
2018/12/12 12:57:18 SUCCESS  ▶ 0005 './goRedis' is running...
2018/12/12 12:57:18.909 [I] [asm_amd64.s:1333]  http server Running on http://:8080

然后去本机地址的8080端口加载一下页面,好让刚才编写的代码能够执行,从而向redis数据库中写入数据。

最后去终端redis数据库中查看内容变化。

127.0.0.1:6379> keys *
“frankName”
“frankAge”

127.0.0.1:6379> get frankName
frank

127.0.0.1:6379> get frankAge
18

因为send方法操作过于繁琐,而读取数据操作是同样的道理,所以省略。

3.4 使用do方法对redis数据库读写数据

在IDE中添加do方法代码,然后保存等待热更新完成,去页面刷新保证代码重新执行一次。

此时去终端查看redis数据库中内容,能够证明添加成功

127.0.0.1:6379> keys *
“frankName”
“frankAge”
“frankGender”

127.0.0.1:6379> get frankGender
male

而后将添加内容代码注释,转而编辑下列代码来进行读取操作。重复上述步骤。

在IDE的控制台中能够看到服务器的输出结果是:

3.5 使用Scan接口和Values接口操作多条不同类型数据

需要说明多条不同类型数据指的是在go语言中有多条不同类型数据被存入redis中,但是进入redis内部的时候必须都转换成string字符串格式。当然从redis中将数据取出来的时候依然需要转换回数据原来的格式。为了方便测试具体代码效果,我先行清空了redis数据库中前面几条代码写入进去的数据。

很显然仍然是redis标准类型的操作语句mset,添加了一个字符串和一个int类型进入redis。在redis中查看能够看到输出内容是:

127.0.0.1:6379> keys *
“frankName”
“frankAge”

127.0.0.1:6379> get frankName
frank

127.0.0.1:6379> get frankAge
18

然后尝试从代码中读取数据

发现问题通过简单的Do方法难以解决,于是借助Values接口和Scan接口来实现。特别注意Scan扫描的数据类型仅仅能够支持常见基本数据类型例如int string bool,而对于复杂数据类型则不能够生效。

在IDE的控制台中能够看到服务器的输出结果是:

3.6 通过序列化与反序列化方法对redis数据库进行复杂数据的读写操作

前文已经提到了go语言中通过使用Scan接口和Values接口能够对基本数据进行redis的存取,但是这种操作对于复杂数据类型却无能为力。但是实际开发中复杂数据类型的存取操作必然是重点,因此可以通过序列化和反序列化的方法来帮助进行复杂数据类型的操作。序列化和反序列化的方法被添加在了“encoding/gob”包里面。


  • 序列化方法:gob.NewEncoder(序列化内容存储容器 bytes.Buffer).Encode(需要被序列化的复杂数据类型)
  • 反序列化方法:gob.NewDecoder(bytes.NewReader(要被反序列化的加密字串)).Decode(&接收复杂数据类型的容器)
stuList := []string{"xiaohong","xiaohuang","xiaolan","xiaolv","xiaobai"}
var buffer bytes.Buffer
gob.NewEncoder(&buffer).Encode(stuList)
conn.Do("set","stuList",buffer.Bytes())

上述代码通过【gob.NewEncoder(&buffer).Encode(stuList)】语句将切片stuList这个复杂数据类型转换成为了字节流存入到了buffer变量内,因为字节流本质就是字符串,所以就可以通过do方法将对应数据存储进入redis了。此时去redis数据库查看结果。

127.0.0.1:6379> keys *
stuList
127.0.0.1:6379> get stuList

????
    .?xiaohong	xiaohuangxiaolanxiaolvxiaobai

而与gob的序列化方式不同的是,反序列化的工作原理刚好相反:【序列化是将已知内容转换为字节流放到序列化容器内,反序列化是将字节流转换为原本数据类型放到反序列化容器内】。所以序列化的时候Encode中的参数用来存放序列化之后的字节流,而反序列化的时候Decode中的参数却是用来存放反序列化之后的数据。因为此时就不需要关心反序列化的数据究竟是什么数据类型了,因为序列化之前数据是什么类型,反序列化之后数据必然与之相同。

//创建接收数据容器
tempStu := []string{}

//从redis中获取stuList字段内容,并将字符串通过转换指令接口转换为字节流
reply,_:=redis.Bytes(conn.Do("get","stuList"))

//反序列化
byteReader := bytes.NewReader(reply)
gob.NewDecoder(byteReader).Decode(&tempStu)

//输出反序列化结果tempStu
beego.Info(tempStu)

结果显而易见,标准的切片类型。

猜你喜欢

转载自blog.csdn.net/u013792921/article/details/84980478
今日推荐