IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Golang学习(三十五) go 连接redis -> 正文阅读

[大数据]Golang学习(三十五) go 连接redis

在编程的时候,连接数据库进行存储操作是必不可少的,这里我们去连接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\n",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() 关闭连接池

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:37:17  更:2022-03-15 22:41:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:48:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码