当前位置:网站首页>Golang学习(三十五) go 连接redis
Golang学习(三十五) go 连接redis
2022-08-02 14:17:00 【m0_67393828】
在编程的时候,连接数据库进行存储操作是必不可少的,这里我们去连接redis数据库
第三方开源库
go get -v github.com/garyburd/redigo/redis
这种第三方的包没有像是之前那种的文档可以查看,不过我们可以通过idea查看
随便输入下包名加点
package main
import (
"github.com/garyburd/redigo/redis"
)
func main(){
redis.
}
我们上面输入了一个redis. 然后在idea中把鼠标放在这个名字上,会有以下信息
翻译信息
包redis是redis数据库的客户端。
Redigo常见问题解答(https://github.com/garyburd/redigo/wiki/FAQ)包含有关此软件包的更多文档。
连接
Conn接口是使用Redis的主要接口。应用程序通过调用Dial、DialWithTimeout或NewConn函数来创建连接。将来,将添加用于创建分片连接和其他类型连接的功能。
当应用程序完成连接时,应用程序必须调用connection Close方法。
通过上述信息我们得知Dial、DialWithTimeout或NewConn函数来创建连接
一、如何查询第三方包函数
package main
import (
"github.com/garyburd/redigo/redis"
)
func main(){
redis.Dial()
}
我们直接去调用Dial函数,再次查看说明信息
翻译
拨号连接到Redis服务器在给定的网络和地址使用指定的选项
说明这里的Dial和我们之前的tcp类似都是建立连接使用的,补全案例
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main(){
conn , err := redis.Dial("tcp","101.43.4.210:6379")
if err != nil{
fmt.Println(err)
return
}
fmt.Println(conn)
}
上面我们看到了返回值是conn,相当于我们已经连接上了redis
那么我们就可以对redis做一些操作了,先将鼠标放在conn上查看接口下的方法
翻译
Do向服务器发送命令并返回收到的回复
如上翻译得知,Do是用来与已经连接的redis服务器进行命令交互的
而redis数据库基本上都是直接使用命令进行存储的,这样我们就能做很多事情
二、redis数据库连接认证
从go去连接redis,如果redis里面带有认证信息,那么我们go也要带认证
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main(){
c , err := redis.Dial("tcp","101.43.4.210:6379")
if err != nil{
fmt.Println(err)
}
defer c.Close()
if _, err := c.Do("AUTH", "123456"); err != nil {
c.Close()
}
}
和正常连接redis一样,直接auth 加密码就可以认证redis
三、redis写入并查看数据
1、简单写入数据
和上面一致,通过Do方法即可
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main(){
c , err := redis.Dial("tcp","101.43.4.210:6379")
if err != nil{
fmt.Println(err)
}
defer c.Close()
if _, err := c.Do("AUTH", "123456"); err != nil {
c.Close()
}
_,err = c.Do("Set","key1",998) //redis写入数据
if err != nil{
fmt.Println(err)
}
r ,err := redis.Int(c.Do("Get","key1")) //类型断言接口
if err != nil{
fmt.Println(err)
}
fmt.Println(r)
}
2、redis hash操作
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main(){
c , err := redis.Dial("tcp","101.43.4.210:6379")
if err != nil{
fmt.Println(err)
}
defer c.Close()
if _, err := c.Do("AUTH", "123456"); err != nil {
c.Close()
}
//修改为HSet 定义Hash值
_,err = c.Do("HSet","user01","name","john")
if err != nil{
fmt.Println(err)
}
//定义年龄
_,err = c.Do("HSet","user01","age",18)
if err != nil{
fmt.Println(err)
}
//名称 字符串
r1 ,err := redis.String(c.Do("HGet","user01","name"))
if err != nil{
fmt.Println(err)
}
fmt.Println(r1)
//年龄是int
r2 ,err := redis.Int(c.Do("HGet","user01","age"))
if err != nil{
fmt.Println(err)
}
fmt.Println(r2)
}
3、批量写入或读取多个数据
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main(){
c , err := redis.Dial("tcp","101.43.4.210:6379")
if err != nil{
fmt.Println(err)
}
defer c.Close()
if _, err := c.Do("AUTH", "123456"); err != nil {
c.Close()
}
//修改为HMSet
_,err = c.Do("HMSet","user02","name","john","age",18)
if err != nil{
fmt.Println(err)
}
//redis.String 表示为一个组,用于接收多个数据,形式是一个切片
r ,err := redis.Strings(c.Do("HMGet","user02","name","age"))
if err != nil{
fmt.Println(err)
}
//上面返回的是一个集合,类似于切片,我们通过for-range去遍历切片
for i , v := range r{
fmt.Printf("r[%d]=%s
",i,v)
}
}
四、redis 连接池
通过golang对redis的操作,还可以通过redis链接池,流程如下
1、实现初始化一定数量的链接,放入链接池
2、当go需要操作redis时,直接从redis连接池取出链接
3、这样可以节省临时获取redis链接的时间,从而提高效率
核心代码
var pool *redis.Pool
pool = &redis.Pool{
Maxldle: 8 //最大空闲链接数量
MaxActive: 0 //表示和数据库最大链接数,0表示,并发不限制数量
ldleTimeout: 100 //最大空闲时间,用完链接后100秒后就回收到链接池
Dial: func()(redis.Conn,error){ //初始化链接池的代码
return redis.Dial("tcp","101.43.4.210:6379)
},
}
c := pool.Get() //从连接池中取出一个链接,关闭后会回收
pool.Close() //关闭连接池,一旦关闭连接池,就无法再从池里再取链接
案例
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
//定义一个全局的pool
var pool *redis.Pool
//当程序启动的时候,就初始化链接池
func init(){
pool = &redis.Pool{
MaxIdle: 8,
MaxActive: 0,
IdleTimeout: 100,
Dial: func()(redis.Conn,error){
return redis.Dial("tcp","101.43.4.210:6379")
},
}
}
func main(){
conn := pool.Get() //先从pool 取出一个链接
defer conn.Close() //关闭这个链接,用完了就不要占着位置
//添加一个认证
if _, err := conn.Do("AUTH", "123456"); err != nil {
conn.Close()
}
_, err := conn.Do("Set","name","tom")
if err != nil{
fmt.Println("conn.Do err=",err)
return
}
//取数据
r , err := redis.String(conn.Do("Get","name"))
if err != nil{
fmt.Println("conn.Do err=",err)
return
}
fmt.Println("r=",r)
}
说明
如果我们要从pool取出链接,一定要保证连接池是没有关闭的 poll.Close() 关闭连接池
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
随机推荐
Mysql索引优化二
PostgreSQL 协议数据样例
webrtc 有关 SDP 部分的解析流程分析
【面经】被虐了之后,我翻烂了equals源码,总结如下
grub 命令使用
三大特殊类(String Object 包装类)与异常
Oauth2.0 补充
UINIX 高级环境编程杂项之限制
makefile——rule概览
Oauth2.0 认证服务器搭建
APP版本更新通知流程测试要点
JOOQ 报错 StackOverflowError
Linux下mysql的彻底卸载
WEB自动化之键盘、鼠标操作
Mysql-Explain与索引详解
Cmd Markdown Formula Guidebook
MYSQL5.7详细安装步骤
Xshell 使用删除键乱码问题
华为单臂路由配置,实现不同vlan之间的通信
Mysql索引底层数据结构