go-zero&go web集成redis实战

2023-11-02

前言

上一篇: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测试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go-zero&go web集成redis实战 的相关文章

随机推荐

  • vue 路由跳转 外部链接

    1 vuejs 是单页面应用 应用内的跳转 可以用router link标签 跳转demo
  • 微服务Dubbo和SpringCloud架构设计、优劣 势⽐较

    本 主要围绕微服务的技术选型 通讯协议 服务依赖模式 开始模式 运 模式等 来综合 较 Dubbo和Spring Cloud 这2种开发框架 架构师可以根据公司的技术实 并结合项 的特点来选择某个 合适的微服务架构平台 以此稳妥地实施项 的
  • 解决webstorm中ts自动编译

    解决webstorm中ts自动编译 我们可以首先写一段ts代码 然后在终端执行tsc helloworld ts来编译为js代码 下面运行代码 使用node helloworld js来运行 但是当我们改变ts内容时 js内容不会对应改变
  • python中的科学计数法表示

    在python中如何使用科学计数法对我们想要定义的变量进行赋值呢 请看以下代码 coding utf 8 author 15025 time 2021 8 2 14 43 software PyCharm Description Scien
  • Linux开发工具之项目自动化构建工具-make/Makefile

    make是一条命令 makefile是一个文件 两个搭配使用 完成项目自动化构建 makefile带来的好处就是自动化编译 一旦写好 只需要一个make命令 整个工程完全自动编 译 极大的提高了软件开发的效率 下面来看一个实例 在Makef
  • mysql 优化之索引视图和索引为何未调用

    如何判断语句运行速度的快慢呢 执行计划 在mysql中我们可以通过explain显示了mysql如何使用索引来处理select语句以及连接表 可以帮助选择更好的索引和写出更优化的查询语句 我们在查询mysql语句时经常会出现查询速度极其缓慢
  • 如何实现响应式(自适应)网页

    响应式网页 什么是响应式布局 为什么会造成布局混乱 META标签 相对度量 FLEX布局 宽高设置 媒体查询 替换元素 响应式框架 什么是响应式布局 响应式网页 Responsive Web RW 又称自适应网页 是一种网页设计布局 可以根
  • IP地址相关知识点

    IP地址 IP地址 网络部分 主机部分 32位 网络部分用来确定终端是不是在同一个网段 主机部分用来确定终端的容量大小 这个网段可容纳多少台 同一个部门主机应该确保其在一个网段 主机数量应该在你的主机容量的范围内 IP地址分为5类 A B
  • ceph-cursh规则实战及PGS unknown 问题处理

    问题描述 root ceph mon01 ceph s cluster id 92d4f66b 94a6 4c40 8941 734f3c44eb4f health HEALTH ERR 1 filesystem is offline 1
  • FFT(快速傅里叶变换)中频率和实际频率的关系

    一 四个名词 实际物理频率 角频率 圆周频率 归一化频率 数字频率 模拟频率 1 实际物理频率表示AD采集物理信号的频率 fs为采样频率 由奈奎斯特采样定理可以知道 fs必须 信号最高频率的2倍才不会发生信号混叠 因此fs能采样到的信号最高
  • Windows系统使用Docker安装Mysql配置详情步骤

    1 开始到结束的全部命令 1 拉去镜像 docker pull mysql 8 0 2 查看镜像 docker images 3 安装容器 lower case table names 1防止大小写错误 命令 docker run itd
  • 超详细的js知识树状图~数组、函数、对象

    前言 学习任何新知识 最重要的永远都是搭建属于自己的知识框架 随后学习的细碎知识点往框架里面填入 最后形成一棵属于自己的知识大树 本系列的博客专注更新总结好的思维导图 希望可以帮助大家快速理清知识结构 注意 本系列文章是拿来建立知识体系 知
  • redis与mysql的区别

    1 在类型上 mysql是关系型数据库 而redis是缓存数据库 2 在作用上 mysql用于持久化的存储数据到硬盘 而redis用于存储使用较为频繁的数据到缓存中 内存 redis用于存储使用较为频繁的数据到缓存中 读取速度快 3 mys
  • 不要错过项目汇报的合理时间

    http blog vsharing com itdays A908850 html 原创 不要错过项目汇报的合理时间 今天想谈谈项目管理中经常要写的项目汇报的问题 项目汇报可以是给老板看的 也可以是给用户看的 不管给谁看的 报告的及时性是
  • 上海万得信息技术 2014笔试题 性格测试 武汉

    看清前面的A B C D哦 后面19题开始都是D C B A 把选好的写下 看哪个选的多 最终就偏向什么性格 比如A选的最多就是A性格 1 关于人生观 我的内心其实是 A 希望能够有尽量多的人生体验 所以会有非常多样化的想法 B在小心合理的
  • 使用DBeaver加载自定义连接驱动jar

    使用DBeaver加载自定义驱动jar 点击数据库 驱动管理器 新建
  • C++ Vector用法(带例程)

    介绍 vector是可变大小数组的序列容器 vector是连续存储的 与数组存储相同 区别是大小是动态改变的 可随机访问 因此vector访问速度快 vector在末尾删除添加元素时相对高效 若在其他任意位置添加删除元素则效率更低 使用 1
  • Window系统下如何生成ssh key以及如何在码云中添加公钥

    前言 本篇文章是以window系统和码云为例讲解如何在window系统下生成ssh key 然后在码云中添加公钥 然后可以远程仓库的ssh地址克隆远程git仓库代码 一 首先在window下生成ssh key 1 首先要在我们的电脑下安装g
  • 码字必备:18 款优秀的 Markdown 写作工具

    现在是 2015 年底 自 2004 年 John Gruber1创造 Markdown 语言以来 已经过去了 11 年 在这 11 年里 Markdown 语言从程序员圈子中逐渐扩散开来 成为了越来越多的电脑写作者第一选择 随着使用人群的
  • go-zero&go web集成redis实战

    前言 上一篇 go zero go web集成JWT和cobra命令行工具实战 从零开始基于go zero搭建go web项目实战 03集成redis实战 源码仓库地址 源码 https gitee com li zheng treasur