go语言和redis数据库

news2024/11/18 1:43:09

1通过go语言和redis数据库进行交互

安装命令

go get github.com/gomodule/redigo/redis

安装完成后,回到家目录创建test.go,把下面代码复制到test.go里面,编译执行test.go,之后在redis中查找到键c1值为hello,说明安装成功

package main
import ( "github.com/gomodule/redigo/redis")
func main(){
        conn,_ := redis.Dial("tcp", ":6379")
        defer conn.Close()
        conn.Do("set", "c1", "hello")
}

2操作方法

Go操作redis文档https://godoc.org/github.com/gomodule/redigo/redis

连接数据库

Dial(network, address string)(conn,err)

执行数据库操作命令

Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)

Send函数发出指令,flush将连接的输出缓冲区刷新到服务器,Receive接收服务器返回的数据
例如:

c.Send("SET", "foo", "bar")
c.Send("GET", "foo")
c.Flush()//把缓冲区命令发到服务器
c.Receive() // 接收set请求返回的数据
v, err = c.Receive() // 接收get请求传输的数据

示例

//连接数据库
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		c.Ctx.WriteString("连接redis")
		logs.Info("redis err", err)
		return
	}
	defer conn.Close()
	//执行操作数据库语句 send放到缓冲区
	err = conn.Send("set", "ca", "xxxx")
	if err != nil {
		logs.Info("send 发送失败", err)
		return
	}

	err = conn.Flush() //把缓冲区命令发到服务器 刷缓冲器
	if err != nil {
		logs.Info("Flush 缓冲失败", err)
		return
	}
	receive, err := conn.Receive()  接收set请求返回的数据
	if err != nil {
		logs.Info("Receive 返回失败", err)
		return
	}
	logs.Info(receive)
	//返回结果
	c.Ctx.WriteString("执行成功")

另外一种执行数据库操作命令

Do(commandName string, args ...interface{}) (reply interface{}, err error)

reply helper functions(回复助手函数)

Bool,Int,Bytes,map,String,Strings和Values函数将回复转换为特定类型的值。为了方便地包含对连接Do和Receive方法的调用,这些函数采用了类型为error的第二个参数。如果错误是非nil,则辅助函数返回错误。如果错误为nil,则该函数将回复转换为指定的类型:

exists, err := redis.Bool(c.Do("EXISTS", "foo"))
if err != nil {
//处理错误代码
}
reflect.TypeOf(exists)//打印exists类型

Scan函数

func Scan(src [] interface {},dest ... interface {})([] interface {},error)

Scan函数从src复制到dest指向的值。
Dest参数的值必须是整数,浮点数,布尔值,字符串,[]byte,interface{}或这些类型的切片。Scan使用标准的strconv包将批量字符串转换为数字和布尔类型。
示例代码

var value1 int
var value2 string
reply, err := redis.Values(c.Do("MGET", "key1", "key2"))
if err != nil {
    //处理错误代码
}
 if _, err := redis.Scan(reply, &value1, &value2); err != nil {
    // 处理错误代码
}

示例

//连接数据库
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		c.Ctx.WriteString("连接redis")
		logs.Info("redis err", err)
		return
	}

	do, err := conn.Do("get", "chengpeng")
	if err != nil {
		return
	}

	//回复助手函数
	string, err := redis.String(do, err)
	if err != nil {
		c.Ctx.WriteString("获取内容出错")
		logs.Info("Strings", err)
		return
	}
	//返回结果
	c.Ctx.WriteString(string)

案例结合

在这里插入图片描述
在这里插入图片描述

序列化与反序列化
序列化(字节化)

var buffer bytes.Buffer//容器
enc :=gob.NewEncoder(&buffer)//编码器
err:=enc.Encode(dest)//编码

反序列化(反字节化)

dec := gob.NewDecoder(bytes.NewReader(buffer.bytes()))//解码器
dec.Decode(&src)//解码

简单案例

//获取文章类型
	var types []models.ArticleType
	_, err = newOrm.QueryTable("ArticleType").All(&types)
	if err != nil {
		logs.Info("获取文章类型失败", err)
		return
	}
	//连接
	conn, err := redis.Dial("tcp", ":6379")
	if err != nil {
		logs.Info("redis连接失败", err)
		return
	}

	defer conn.Close()
	//编码操作
	var buffer1 bytes.Buffer            //容器
	encoder := gob.NewEncoder(&buffer1) //返回的是编码器 获取编码器

	err = encoder.Encode(types) //编码
	if err != nil {
		logs.Info("编码错误", err)
		return
	} //编码
	//操作数据 存入到redis
	_, err = conn.Do("set", "types", buffer1.Bytes())
	if err != nil {
		logs.Info("redis 存储失败", err)
		return
	}
	//没有相应的转换助手函数 获取数据
	resp, err := conn.Do("get", "types")
	if err != nil {
		logs.Info("获取失败", err)
		return
	}
	//助手函数
	data, err := redis.Bytes(resp, err)
	if err != nil {
		logs.Info("Bytes 获取失败", err)
		return
	}
	//解码
	newEncoder := gob.NewDecoder(bytes.NewReader(data)) //获取解码器
	var types2 []models.ArticleType
	err = newEncoder.Decode(&types2)
	if err != nil {
		logs.Info("解码失败", err)
		return
	}
	logs.Info("chengpeng", types2)

分析

//连接
conn, err := redis.Dial("tcp", ":6379")
if err != nil {
	logs.Info("redis连接失败", err)
	return
}

defer conn.Close()

var types []models.ArticleType
//var types2 []models.ArticleType

//没有相应的转换助手函数 获取数据
resp, err := conn.Do("get", "types")
if err != nil { //redis是否有数据
	//logs.Info("chengpengziye2222")
	//logs.Info("获取失败", err)
	//获取文章类型
	_, err = newOrm.QueryTable("ArticleType").All(&types)
	if err != nil {
		logs.Info("获取文章类型失败", err)
		return
	}
	//编码操作
	var buffer bytes.Buffer            //容器
	encoder := gob.NewEncoder(&buffer) //返回的是编码器 获取编码器

	err = encoder.Encode(types) //编码
	if err != nil {
		logs.Info("编码错误", err)
		return
	}
	//操作数据 存入到redis
	_, err = conn.Do("set", "types", buffer.Bytes())
	if err != nil {
		logs.Info("redis 存储失败", err)
		return
	}
} else {
	//logs.Info("chengpengziye")
	//助手函数
	data, err := redis.Bytes(resp, err)
	if err != nil {
		logs.Info("Bytes 获取失败", err)
		return
	}
	//解码
	newEncoder := gob.NewDecoder(bytes.NewReader(data)) //获取解码器
	err = newEncoder.Decode(&types)
	if err != nil {
		logs.Info("解码失败", err)
		return
	}
}

go语言redis-cluster开源客户端
安装:

go get github.com/gitstliu/go-redis-cluster

示例代码

func (this*ClusterController)Get(){
	cluster, _ := redis.NewCluster(
		&redis.Options{
			StartNodes: []string{"192.168.110.37:7000", "192.168.110.37:7001", "192.168.110.37:7002","192.168.110.38:7003","192.168.110.38:7004","192.168.110.38:7005"},
			ConnTimeout: 50 * time.Millisecond,
			ReadTimeout: 50 * time.Millisecond,
			WriteTimeout: 50 * time.Millisecond,
			KeepAlive: 16,
			AliveTime: 60 * time.Second,
		})
	cluster.Do("set","name","itheima")

	name,_ := redis.String(cluster.Do("get","name"))
	beego.Info(name)
	this.Ctx.WriteString("集群创建成功")
}

后续上传到代码上地址在上一篇上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合POI实现Excel文件读写操作

1.环境准备 1、导入sql脚本: create database if not exists springboot default charset utf8mb4;use springboot;create table if not exists user (id bigint(20) primary key auto_increment comment 主键id,username varchar(255) not null comment 用…

你想去外包or外派岗?

外包/外派的本质 在H银行的经理口中,外包/外派员工们都被称为contractor。 为什么很多大公司招外包呢?原因有以下几个: 经济和技术都在发展,没有人能预测未来。很多新创公司,短期员工需求量更大,不跟自己…

地图资源下载工具数据在线、离线查询及数据激活功能

哨兵相关产品,工具提供了表示系统是否为归档离线的信息!您可以利用下载[定时重试]功能激活并下载哨兵相关离线产品数据!

LVS负载均衡集群和LVS负载均衡—DR模式

一.LVS集群基本介绍 1.1.群集的含义 Cluster,集群、群集 由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机。 1.2.群集的作用 对于企业服务的的性能提升…

Echarts 教程三

Echarts 教程三 经验总结折线图设置网格线在图表x/y轴添加描述文字饼图中间添加描述echarts中y轴坐标不为小数自定义tooltip 样式new echarts.graphic.LinearGradient 使用内置渐变器图例过多的时候,显示分页横向柱状图显示数字使用formatter让X轴文字竖直显示&…

K8S:配置资源管理 Secret和configMap

文章目录 一.Secret1.Secret概念2.Secret的类型①kubernetes.io/service-account-token②opaque③kubernetes.io/dockerconfigjson④kubernetes.io/tls 3.secret的三种参数①tls②docker-registry③generic 4.Pod 的3种方式来使用secret5.Secret创建及案例(1&#x…

12.1 使用键盘鼠标监控钩子

本节将介绍如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函数来实现键盘鼠标的监控。这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中…

【Spring笔记05】Spring的自动装配

这篇文章,主要介绍的内容是Spring的自动装配、五种自动装配的方式。 目录 一、自动装配 1.1、什么是自动装配 1.2、五种自动装配方式 (1)no (2)default (3)byType (4&#xf…

e为底数的指数运算e^x,math.exp(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 e为底数的指数运算e^x math.exp(x) 选择题 关于以下代码的说法中正确的是? import math print("【执行】math.exp(0)") print(math.exp(0)) print("【执行】math.ex…

网络基础知识面试题1

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)

js 事件参考

事件参考 事件介绍 触发事件是为了通知代码可能影响代码执行的“有趣变化”。这些可能来自用户交互,例如使用鼠标或调整窗口大小,底层环境状态的变化(例如,低电量或来自操作系统的媒体事件)以及其他原因。 每个事件都由一个基于Event接口的…

使用Plotly模拟远古博弈游戏_掷骰子

不乏投资大师、量化基金经理从着迷博弈游戏开始迈出步伐...... 开始学习使用python包Plotly模拟掷骰子。 安装Plotly 终端输入命令:python3 -m pip install --user plotly 创建骰子类 掷骰子 分析结果 绘制直方图 程序都正常运行,直方图也显示无误&…

老胡的周刊(第110期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 bitwarden[2] 一个开源,免费&…

代码随想录算法训练营第23期day14|二叉树层序遍历、226.翻转二叉树、101. 对称二叉树

目录 一、二叉树层序遍历 非递归法 递归法 相关题目(10题) 二、(leetcode 226)翻转二叉树 递归法 层序遍历 深度优先遍历 1)非统一写法——前序遍历 2) 统一写法——前序遍历 三、(le…

解决spawn-fcgi:child exited with: 127/126/1报错

解决spawn-fcgi:child exited with: 126报错 执行文件的权限不够,如果是使用.sh文件进行执行的,首先对.sh文件进行权限修改 chmod 777 执行文件.sh 之后再对sh文件中所有执行spawn-fcgi的程序授予权限 比如: spawn-fcgi -a 127.0.0.1 -p 789…

【无标题】This project has been opened by another efinity instance

This project has been opened by another efinity instance 说明:(1)软件自动即出可能有些进程没有关闭 (2)目录中有中文路径。

对一门不是非常熟悉的语言是怎么面试的

公司是一个基础通讯类的公司,需要的职位是一个高级系统和软件工程师。 职位要求,是一个完全不怎么大众的语言:Elixir。 没听过,这就对了,这是一个函数式的语言,可以认为是 Erlang 的升级版本,…

15073-2014 铸造钛及钛合金 知识梳理

声明 本文是学习GB-T 15073-2014 铸造钛及钛合金.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铸造钛及钛合金的牌号、代号和化学成分,以及化学成分分析方法。 本标准适用于机加石墨型、捣实型、金属型和熔模精…

BootstrapBlazor企业级组件库:前端开发的革新之路

作为一名Web开发人员,开发前端我们一般都是使用JavaScript,而Blazor就是微软推出的基于.Net平台交互式客户Web UI 框架,可以使用C#替代JavaScript,减少我们的技术栈、降低学习前端的成本。 而采用Blazor开发,少不了需…

[SWPUCTF 2021 新生赛]sql - 联合注入

这题可以参考文章:[SWPUCTF 2021 新生赛]easy_sql - 联合注入||报错注入||sqlmap 这题相比于参考文章的题目多了waf过滤 首先,仍然是网站标题提示参数是wllm 1、fuzz看哪些关键字被过滤:空格、substr、被过滤 2、?wllm-1/**/union/**/selec…