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可同时在本机或远端上遥…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...