go-zerogo web集成redis实战
前言
上一篇: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 setDB: 0, // use default DBMaxRetries: 3, // 最大重试次数MinIdleConns: 8, // 空闲链接})// 集群crdb := redis.NewClusterClient(&redis.ClusterOptions{Addrs: []string{"localhost:6379","localhost:6380","localhost:6381",}, // 集群IP:PORTPassword: "", // 密码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 setDB: 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 valuemval, err := rdb.HGetAll(ctx, "myhash").Result()if err != nil {panic(err)}fmt.Println("myhash ", mval)// 删除指定keydel, 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 valuerdb.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)// listrdb.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/redisRedis redis.RedisConf `json:",optional"`Auth struct {AccessSecret stringAccessExpire 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# 关闭StatStat: false
Middlewares:Trace: falseMetrics: falseLog: 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测试
相关文章:
go-zerogo web集成redis实战
前言 上一篇: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.…...
油猴浏览器(安卓)
油猴浏览器页面设计非常简约,在主页上还为小伙伴们推荐了很多的常用书签,像油猴脚本,常用导航,新闻,热搜类的,快递查询等等,可以设置快捷访问,把常用到的一些网站设置在主页上。 浏览…...
Redis 6.0多线程模型比单线程优化在哪里了
推荐阅读 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 AI绘画 stable…...
[hello,world]这个如何将[ ] 去掉
[hello,world]这个如何将[ ] 去掉? 你可以使用编程语言中的字符串处理函数来去掉方括号。以下是一个示例代码,使用Python的strip()函数去掉方括号: text "[hello,world]" text text.strip("[]") print(text)输出为&a…...
机器学习_个人笔记_周志华(更新中......)
第1章 绪论 1.1 引言 形成优秀的心理表征,自然能成为领域内的专家。 系统1 & 系统2。 机器学习:致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。主要研究计算机从数据中产生model的算法,即“learning algori…...
嵌入式Linux驱动开发(LCD屏幕专题)(二)
一、结合APP分析LCD驱动程序 1、open app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0 -------------------------------------------------------------- kernel:fb_open // fbmem.cstruct fb_info *info;info get_fb_info(fbidx);if (info->fbop…...
React的jsx的用法
React是一个流行的JavaScript库,用于构建用户界面。它使用一种名为JSX的语法扩展来描述组件的结构和样式。JSX是React的核心语言之一,它允许开发人员在JavaScript中编写HTML,从而使代码更加简洁和易于阅读。 JSX是一种语法扩展,它…...
Ei Scopus检索 | 2024年第四届能源与环境工程国际会议(CoEEE 2024)
会议简介 Brief Introduction 2024年第四届能源与环境工程国际会议(CoEEE 2024) 会议时间:2023年5月22日-24日 召开地点:意大利米兰 大会官网:www.coeee.org CoEEE 2024将围绕“能源与环境工程”的最新研究领域而展开,为研究人员、…...
习题练习 C语言(暑期第四弹)
自我小提升! 前言一、数组二、指针运算三、统计每个月兔子的总数四、双指针的应用五、判断指针六、珠玑妙算七、两数之和八、数组下标九、指针十、寻找峰值十一、二级指针十二、大端小端十三、无符号参数十四、数对十五、截取字符串总结 前言 重要的事说三遍&#…...
【docker快速部署微服务若依管理系统(RuoYi-Cloud)】
工作原因,需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合,它有足够多的中间件,而且官方提供docker安装,但我本人在安装过程中遇到了很多坑,在这里记录一下防止下次会再次遇到。 项目地址 ht…...
面试求职-简历编写技巧
没有高水平简历 只有高匹配的简历 试问一下:如果一个非常牛逼的软件工程的硕士,投递市场营销岗位,结果会是什么样呢? 这位同学大概率没办法通过简历。 不是因为他不够优秀,而是因为简历和岗位不够匹配。 在公司的招…...
云原生安全性:构建可信任的云应用的最佳实践
文章目录 云原生安全性的重要性1. 数据隐私2. 恶意攻击3. 合规性要求4. 业务连续性 构建可信任的云应用的最佳实践1. 安全开发2. 身份验证与授权3. 容器安全性4. 监控与审计5. 持续集成与持续交付(CI/CD)6. 安全培训和教育 未来趋势:服务网格…...
第一章 数据库SQL-Server(及安装管理详细)
❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 21 世纪,人类迈入了“信息爆炸时代”,…...
chrome extension无法获取window对象
背景见上一篇博客修改网页内容的方法 上一篇博客之后,我要修改的网页有一个新改版,然后有个数据存在了window中,我直接在js中使用window.xxx发现无法获取。所以有本文。 https://juejin.cn/post/7145749643316428830 https://onelinerhub.com…...
在linux虚拟机上安装docker(我的实践)
参考文章: https://blog.csdn.net/qq_29479041/article/details/82659218 步骤: 1.安装docker 参考文章: https://blog.csdn.net/qq_29479041/article/details/82659218 https://blog.csdn.net/qq_38345468/article/details/110128659 2.…...
Spring之事务开发
什么是事务? 事务是指数据库管理系统中的一个执行单位或一个逻辑工作单元,它由一个或多个数据库操作序列组成。事务具有以下四个特性,通常被称为ACID特性: 原子性(Atomicity):事务是一个不可分…...
干了三年的功能测试,让我女朋友跑了,太难受了...
简单概括一下 先说一下自己的情况,普通本科,19年通过校招进入深圳某软件公司,干了3年多的功能测试,21年的那会,因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不…...
JavaScript函数的使用
前言 程序中的foo、bar、baz 在学习编程的过程中,你可能会经常看到foo、bar、baz这些名词: 它们通常被用来作为函数、变量、文件的名词;目前已经编程了计算机编程的术语一部分;但是它们本身并没有特别的用途和意义;…...
【算法】Java-使用数组模拟单向链表,双向链表
目录 试题1:实现一个单链表,并实现以下功能: 试题2:实现一个双链表,并实现以下功能 思路总结: 什么情况下可能涉及到用数组实现链表呢? 在学习时了解到了可以用数组模拟链表,使其…...
Nessus简单介绍与安装
Nessus简单介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
