go-zerogo web集成redis实战

news2024/12/27 12:33:11

前言

上一篇:go-zero&go web集成JWT和cobra命令行工具实战

从零开始基于go-zero搭建go web项目实战-03集成redis实战
源码仓库地址 源码 https://gitee.com/li_zheng/treasure-box

golang redis 客户端

Go-Redis 地址:

  • GitHub: https://github.com/redis/go-redis
  • 中文:https://redis.uptrace.dev/zh/

特点/特性

  • 支持单机Redis Server、Redis Cluster、Redis Sentinel、Redis分片服务器
  • go-redis会根据不同的redis命令处理成指定的数据类型,不必进行繁琐的数据类型转换
  • go-redis支持管道(pipeline)、事务、pub/sub、Lua脚本、mock、分布式锁等功能

安装依赖
没有使用最新版本v9
go get github.com/go-redis/redis/v8

非go-zero配置go-redis

初始化客户端

	// 单机版
	rdb := redis.NewClient(&redis.Options{
		Addr:         "zachary.ink:6677",
		Password:     "", // no password set
		DB:           0,  // use default DB
		MaxRetries:   3,  // 最大重试次数
		MinIdleConns: 8,  // 空闲链接
	})
	// 集群
	crdb := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: []string{
			"localhost:6379",
			"localhost:6380",
			"localhost:6381",
		}, // 集群IP:PORT
		Password:     "", // 密码
		MaxRetries:   3,  // 最大重试次数
		MinIdleConns: 8,  // 空闲链接
	})
	// sentinel哨兵-服务器客户端: 连接到 哨兵模式 管理的服务器
	frdb := redis.NewFailoverClient(&redis.FailoverOptions{
		MasterName:    "master-name",
		SentinelAddrs: []string{":9126", ":9127", ":9128"},
	})
	// 从 go-redis v8 版本开始,可以使用 NewFailoverClusterClient 把只读命令路由到从节点,
	// NewFailoverClusterClient 借助了 Cluster Client 实现,不支持 DB 选项(只能操作 DB 0)
	frdb := redis.NewFailoverClusterClient(&redis.FailoverOptions{
		MasterName:    "master-name",
		SentinelAddrs: []string{":9126", ":9127", ":9128"},
		// 你可以选择把只读命令路由到最近的节点,或者随机节点,二选一
		// RouteByLatency: true,
		// RouteRandomly: true,
	})
	// entinel哨兵-哨兵服务器客户端
	// 哨兵客户端本身用于连接哨兵服务器,可以从哨兵上获取管理的 redis 服务器信息
	srdb := redis.NewSentinelClient(&redis.Options{
		Addr: ":9126",
	})
	addr, err := srdb.GetMasterAddrByName(ctx, "master-name").Result()

更多客户端配置查看,官方文档

操作命令

go-redis提供的API命名和redis命令几乎一样,上手非常简单,j简单列举常用的几个

func ExampleClient() {
	// 初始化客户端
	rdb := redis.NewClient(&redis.Options{
		Addr:     "zachary.ink:6677",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
	// set命令
	err := rdb.Set(ctx, "key", "value", 0).Err()
	if err != nil {
		panic(err)
	}
	// get命令
	val, err := rdb.Get(ctx, "key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("key", val)

	val2, err := rdb.Get(ctx, "key2").Result()
	if err == redis.Nil {
		fmt.Println("key2 does not exist")
	} else if err != nil {
		panic(err)
	} else {
		fmt.Println("key2", val2)
	}
	// hash相关
	valInt, err := rdb.HSet(ctx, "myhash", "key1", "value1", "key2", "value2").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("myhash key1 num ", valInt)

	val, err = rdb.HGet(ctx, "myhash", "key1").Result()
	if err != nil {
		panic(err)
	}
	// 获取hash map 所有 key value
	mval, err := rdb.HGetAll(ctx, "myhash").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("myhash ", mval)
	// 删除指定key
	del, err := rdb.Del(ctx, "myhash").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("myhash del ", del)
	
	// 关闭链接
	err = rdb.Close()
	if err != nil {
		panic(err)
	}
}

其他常用命令

	// SETEX key seconds value
	rdb.SetEX(ctx, "key-ex", "time expire", time.Second*5)
	// SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX] [GET]
	rdb.SetNX(ctx, "key-ex", "time expire", 0)
	// list
	rdb.RPush(ctx, "key-list", "val1", "val2")
	rdb.LSet(ctx, "key-list", 1, "xxx")
	rdb.LPop(ctx, "key-list")

go-zero中使用go-redis

go-zero中使用redis支持单机版和集群版两种模式,暂不支持 sentinel,本文版本:go-zero v1.5.3

增加redis相关配置

在全局配置struct中增加Redis配置:

type Config struct {
	rest.RestConf
	// 增加redis配置,导入包: github.com/zeromicro/go-zero/core/stores/redis
	Redis redis.RedisConf `json:",optional"`
	Auth  struct {
		AccessSecret string
		AccessExpire int64
	}
}

对应的yaml文件中增加配置信息

Name: tbox-api
Host: 0.0.0.0
Port: 8888
# 接口超时时间30s
Timeout: 30000
Auth:
  #jwt密钥
  AccessSecret: "12345678"
  #过期时间
  AccessExpire: 10000
Log:
  #日志格式使用行模式
  Encoding: plain
  #日志时间显示格式
  TimeFormat: 2006-01-02 15:04:05.000
  # 关闭Stat
  Stat: false
Middlewares:
  Trace: false
  Metrics: false
  Log: false
# redis配置
Redis:
  # 如果是 redis cluster 则为 ip1:port1,ip2:port2,ip3:port3...
  Host: localhost:6379
  # 这里密码如果是纯数字需要加引号
  Pass: abc23132
  # 单机模式
  Type: node
  # true 检查链接是否可用,不可用报错
  NonBlock: false

服务启动Ctx上下文初始化redis实例

run_cmd 中的 runServer 方法,以 server.StartWithOpts()的方式启动服务,会进行上下文初始化,具体代码可参考:cmd/run_cmd.go:52 runServer 方法

func Init(svr *http.Server) {
	initLock.Do(func() {
		initRedisIns()
		initDb()
		initOther()
		sCtx.IsInit = true
	})
}

func initRedisIns() {
	if len(sCtx.Config.Redis.Host) == 0 {
		return
	}
	logx.Infof("Initializing redis ...")
	// 设置redis慢请求阈值
	redis.SetSlowThreshold(time.Millisecond * 500)
	// redis实例对象缓存在上下文中
	sCtx.Redis = redis.MustNewRedis(sCtx.Config.Redis)
	logx.Infof("Redis Initialized.")
}

使用命令

svc.GetServiceContext().Redis 或者 svc.Redis() 获取redis客户端对象,进行命令操作,具体代码位置: \internal\svc\ctx.go
在这里插入图片描述
在这里插入图片描述
go-zero对go-redis的命令进行了简单的封装,使用起来更加便利

源码

源码仓库地址: https://gitee.com/li_zheng/treasure-box

下一章

1、go-zero&go web集成gorm、mysql实战
2、实现简单的学生信息CRUD测试

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

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

相关文章

酒店常见十大突发事件应急处置方案

文章目录 1.处理客房门未关的程序2.客房内异常声响的处理程序3.酗酒客人应对程序4.预防打架斗殴、流氓滋事5.停电紧急处理6.客人差欠、拒付酒店费用的处理程序7.客人意外受伤、病危、身亡的处理程序8.防风、防汛等自然灾害应急处理9.发生盗窃案处理程序10.客人报告的“丢失/盗窃…

链表例题小总结:

链表: 第一种题型:双指针 力扣203:移除链表元素 力扣题目链接 题意:删除链表中等于给定值 val 的所有节点。示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2&#xff1…

浏览器窗口间的通信

一、汇总 二、同源策略 三、webSocket (无跨域限制) 优点:无跨域限制 缺点:成本高 四、客户端存储 1、localStorage onStorage 例子: 2、定时器 客户端存储 例子: 缺点: 五、postMessage (无跨域…

TypeScript类型判断

快速认知 TS允许我们为变量设置类型限制并进行检测判断 // 常见的类型判断 let age: number 20; let isDead: boolean true; let name: string abc; 但是上面的写法太啰嗦了。ts有一个类型推断机制,ts会根据为变量赋的值自动给该变量设置一个类型。上面可以写为…

SpringMvc--综合案例

目录 1.SpringMvc的常用注解 2.参数传递 基础类型(String) 创建一个paramController类: 创建一个index.jsp 测试结果 复杂方式 ​编辑 测试结果 RequestParam 测试结果 PathVariable 测试结果 RequestBody pom.xml依赖导入 输…

软件测试之登录测试详解-功能性

功能测试 一、功能测试–登录 功能性测试用例包括: 1.什么都不输入,点击提交按钮,看提示信息。(非空检查) 2.输入已注册的用户名和正确的密码,验证是否登录成功; 3.输入已注册的用户名和不…

面试中的问题提问:如何通过提问展示你的主动性

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

大型语言模型,第 1 部分:BERT

一、介绍 2017是机器学习中具有历史意义的一年,当变形金刚模型首次出现在现场时。它在许多基准测试上都表现出色,并且适用于数据科学中的许多问题。由于其高效的架构,后来开发了许多其他基于变压器的模型,这些模型更专注于特定任务…

Nginx详解 五:反向代理

文章目录 1. 正向代理和反向代理1.1 正向代理概述1.1.1 什么是正向代理1.1.2 正向代理的作用1.1.3 正向代理的基本格式 1.2 反向代理概述1.2.1 什么是反向代理1.2.2 反向代理可实现的功能1.2.3 反向代理的可用模块 2. 配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其…

(其他) 剑指 Offer 65. 不用加减乘除做加法 ——【Leetcode每日一题】

❓ 剑指 Offer 65. 不用加减乘除做加法 难度:简单 写一个函数,求两个整数之和,要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a 1, b 1 输出: 2 提示: a, b 均可能是负数或 0结果不会溢出 …

在 Windows 上远程对 Linux 进行抓包

文章目录 名词解释事先准备下载安装 Wireshark下载运行 libpcap设置 libpcap 环境变量在 Wireshark 中远程连接 libpcap 笔者的运行环境:(成功) 本地客户端: Windows: Windows 10 教育版(本文) …

基于STM32设计的生理监测装置

一、项目功能要求 设计并制作一个生理监测装置,能够实时监测人体的心电图、呼吸和温度,并在LCD液晶显示屏上显示相关数据。 随着现代生活节奏的加快和环境的变化,人们对身体健康的关注程度越来越高。为了及时掌握自身的生理状况&#xff0c…

Hololens2部署很慢可能是unity工程选择不对

这样就很快,几分钟就完成了。(虽然又遇到新问题了) 第一次使用时如下,直接运行了一个多小时还没有完

虚拟专用网络——VPN

VPN的英文全称是"Virtual Private Network",意为"虚拟专用网络"。它的本质是一种特殊的加密通讯协议,可以在不同地点的企业内部网之间建立一条专用的通讯线路,就像真正铺设了一条专线一样,但无需真正的物理线…

【图卷积神经网络】1-入门篇:为什么使用图神经网络

在本节中,将涵盖以下主要内容: 为什么使用图?为什么学习图?为什么使用图神经网络?为什么使用图? 首先需要回答的问题是:为什么对图感兴趣?图论是对图进行数学研究的学科,它已经成为理解复杂系统和关系的基本工具。图是一种将节点(也称为顶点)和连接这些节点的边的集…

go语言的高级特性

go语言调用C语言 go tool cgo main.go

MySQL误删数据 回滚

前言 生产环境数据库不允许删除表,可以将表修改成 XXX_to_delete 如果误删简单数据,可以考虑使用binlog恢复 一、查看命令 1.查看binlog是否开启 show variables like log_bin;切换到MySQL安装目录,查看mysqlbinlog日志文件 2.查看所有 binlog 日志…

网络技术学习十二:子网划分

子网划分 A类地址 ⑴ A类地址第1字节为网络地址,其它3个字节为主机地址。另外第1个字节的最高位固定为0。 ⑵ A类地址范围:1.0.0.1到126.255.255.254。 ⑶ A类地址中的私有地址和保留地址: ①10.0.0.0到10.255.255.255是私有地址&#xff0…

AIGC - 生成模型及其应用

AIGC - 生成模型及其应用 0. 前言1. 生成模型2. 生成模型与判别模型的区别2.1 模型对比2.2 条件生成模型2.3 生成模型的发展2.4 生成模型与人工智能 3. 生成模型示例3.1 简单示例3.2 生成模型框架 4. 表示学习5. 生成模型与概率论6. 生成模型分类小结 0. 前言 生成式人工智能 …

知识大杂烩(uniapp)

首先声明:不敢保证都管用,这是我自己实践得来的。 box-shadow: 这段 CSS 样式代码用于创建一个阴影效果,它是通过 box-shadow 属性来实现的。让我解释一下这段代码的含义: - box-shadow: 这是 CSS 的属性,用于添加阴影…