go-zero 使用 redis 作为 cache 的 2 种姿势
mhr18 2025-07-24 20:06 6 浏览 0 评论
在 go-zero 框架内,如在 rpc 的应用 service 中,其内部已经预置了 redis 的应用,所以我们只需要在配置中加入相关字段即可,另外,在 svcContext 声明 redis client 后即可在具体的业务逻辑处理中应用。
但这里有个问题,如我用的是 go-zero 1.5.0 版本,从源码分析来看,redis 的连接并没用到 连接池,虽然在 go-zero/redis 已经为我们声明了足够的 redis 操作接口,但如果你有 连接池 的需求,还有另外一条路径,自己在应用中声明 连接池,但是具体的操作,也需要自己去写。
下面就从上面说的两个方面分享下 redis 的两种使用姿势吧。
1.框架内置的 redis
我们假设你已经生成了 rpc 的应用,然后接下来就是这样的一些主要工作:
- 1.config.go 文件定义你的 redis 配置结构体并放入 config 结构体中, 由于 zrpc.RpcServerConf 含有 Redis 的定义,直接跳转下步
- 2.yaml配置文件中,声明你的配置
- 3.在 svcContext 加入 redisClient
- 4.业务逻辑处理中加入 redis 作为缓存
完成以上,你就完成了通过框架内置的 redis 接口的使用。
定义你的 redis 结构体
internal/config/config.go
type Config struct {
zrpc.RpcServerConf
}
go-zero/zrpc/config.go
// A RpcServerConf is a rpc server config.
type RpcServerConf struct {
service.ServiceConf
ListenOn string
Etcd discov.EtcdConf `json:",optional,inherit"`
Auth bool `json:",optional"`
Redis redis.RedisKeyConf `json:",optional"` // 这里就是预置的字段
StrictControl bool `json:",optional"`
// setting 0 means no timeout
Timeout int64 `json:",default=2000"`
CpuThreshold int64 `json:",default=900,range=[0:1000]"`
// grpc health check switch
Health bool `json:",default=true"`
Middlewares ServerMiddlewaresConf
}
go-zero/core/stores/redis/conf.go
type (
// A RedisConf is a redis config.
RedisConf struct {
Host string
Type string `json:",default=node,options=node|cluster"`
Pass string `json:",optional"`
Tls bool `json:",optional"`
}
// A RedisKeyConf is a redis config with key.
RedisKeyConf struct {
RedisConf
Key string `json:",optional"`
}
)
声明配置
结合上面的内容,你只需要在 yaml 文件中注明下面内容:
Redis:
Host: xx.xx.xx.xx:6379
Type: node
Tls: false
在 svcContext 加入 redisClient
直接看代码
package svc
import (
"userrpcv1/internal/config"
zeroRds "github.com/zeromicro/go-zero/core/stores/redis"
)
type ServiceContext struct {
Config config.Config
// claim ur redis client in here
RedisClient *zeroRds.Redis
}
func NewServiceContext(c config.Config) *ServiceContext {
//conf := c.Redis
redisClient := zeroRds.MustNewRedis(conf.Redis)
return &ServiceContext{
Config: c,
RedisClient: redisClient,
}
}
业务逻辑应用
你的某个接口业务逻辑处理
//logx.Info("Set Redis cache now")
//err := l.svcCtx.RedisClient.Setex(fmt.Sprintf("Sum:%d:%d", in.A, in.B), fmt.Sprintf("Result:%d time:%v", sum, time.Now().Format(time.RFC3339)), ttl)
//if err != nil {
// logx.Errorf("Rpc A9Sum set cache error: %v", err)
//}
到这里你就成功了,直接拿去用吧。
2.通过自定义 redis 连接池
这里与上面有些不同,我们会自定义 redis 的结构体,自定义连接池的配置,自定义 client ,以及对应的一些操作,步骤如下:
- 自定义 redis 配置结构体
- yaml文件中声明配置信息
- 编写连接池等的初始化
- 编写连接池的接口
- 业务逻辑处理中使用连接池
自定义 redis 配置结构体
依然还是你的 config.py 中加入以下:
package config
import "github.com/zeromicro/go-zero/rest"
type Config struct {
rest.RestConf
CacheConf CacheConf
}
type CacheConf struct {
Password string `json:",optional"`
Host string `json:",optional"`
Port int64 `json:",optional"`
DBName int `json:",optional"`
MaxIdle int `json:",optional"`
MaxActive int `json:",optional"`
IdleTimeout int64 `json:",optional"`
}
yaml文件中声明配置信息
Name: limit
Host: 0.0.0.0
Port: 8888
MaxConns: 100000
CacheConf:
Password: ""
Host: 172.30.3.57
Port: 6379
DBName: 15
MaxIdle: 2
MaxActive: 5
IdleTimeout: 1000000000
编写连接池等的初始化
package redis
import (
"fmt"
"math"
"time"
"demo24/micro_svc/zero-limit/internal/config"
"github.com/gomodule/redigo/redis"
"github.com/zeromicro/go-zero/core/logx"
)
var (
pool *redis.Pool
client redis.Conn
)
func InitRedis(conf config.CacheConf) {
pool = &redis.Pool{
MaxActive: conf.MaxActive,
MaxIdle: conf.MaxIdle,
IdleTimeout: time.Duration(conf.IdleTimeout),
Dial: func() (redis.Conn, error) {
addr := fmt.Sprintf("%s:%s", conf.Host, conf.Port)
conn, err := redis.Dial("tcp", addr, redis.DialDatabase(conf.DBName))
if err != nil {
logx.Errorf("Create redis pool conn failed, err: %v", err)
return nil, err
}
return conn, nil
},
}
client = pool.Get()
_, err := redis.String(client.Do("ping"))
if err != nil {
logx.Errorf("redis conn pool init failed, err: %v.", err)
}
}
编写连接池的接口
func GetRDB() redis.Conn {
if pool == nil {
logx.Errorf("get redis instance failed, err: pool is nil.")
return nil
}
return pool.Get()
}
type Cache struct {
client redis.Conn
}
func NewCache() *Cache {
return &Cache{
client: GetRDB(),
}
}
func (cache *Cache) Set(key string, value interface{}, nx int) {
if nx == 0 {
nx = math.MaxInt32
}
_, err := cache.client.Do("SET", key, value, "NX", nx)
if err != nil {
logx.Errorf("set key failed, err: %v", err)
}
}
func (cache *Cache) Get(key string) (val interface{}, err error) {
value, err := cache.client.Do("GET", key)
if err != nil {
logx.Errorf("get cache err, err: %v", err)
return nil, err
}
return value, nil
}
// TODO, u can implement ur cache operations
业务逻辑处理中使用连接池
...
// redis pool
//cache := redis.NewCache()
//_, err = cache.Get(fmt.Sprintf("Sum:%d:%d", in.A, in.B))
//if err != nil {
// logx.Errorf("Rpc A9Sum get cache error: %v", err)
//}
...
通过以上流程,你可以实现这两种 go-zero 的使用 redis 作为缓存的方法,希望对你有用。
相关推荐
- 说说Redis的单线程架构(redis的单线程模型)
-
一句话总结Redis采用单线程处理命令请求,避免了多线程的上下文切换和锁竞争,保证原子性操作。其基于内存的高效执行和I/O多路复用模型支撑了高并发性能。网络I/O和持久化操作(如RDB/AOF)由后台...
- 答记者问之 - Redis 的高效架构与应用模式解析
-
问:极客程序员你好,请帮我讲一讲redis答:redis主要涉及以下核心,我来一一揭幕Redis的高效架构与应用模式解析Redis是一个开源的内存数据存储系统,因其高性能、丰富的数据结构和易用性...
- Redis的5种核心数据结构,及其最经典的“应用场景”
-
Redis凭什么稳坐缓存界头把交椅?全靠这五个“身怀绝技”的数据结构!在分布式系统的江湖里,Redis就像一位身怀绝技的武林高手,而它的五大核心数据结构正是克敌制胜的五套绝学。今天咱们就来拆解这些独门...
- 精准定位文件包含漏洞:代码审计中的实战思维
-
前言最近看到由有分析梦想cms的,然后也去搭建了一个环境看了一看,发现了一个文件包含漏洞的点,很有意思,下面是详细的复现和分析,以后代码审计又多了一中挖掘文件包含漏洞的新思路环境搭建下载https...
- ARDM:一款国产跨平台的Redis管理工具
-
ARDM(AnotherRedisDesktopManager)是一款免费开源的Redis桌面管理客户端,支持Windows、Mac、Linux跨平台。功能特性ARDM提供的主要功能如...
- SpringBoot的Web应用开发——Web缓存利器Redis的应用!
-
Web缓存利器Redis的应用Redis是目前使用非常广泛的开源的内存数据库,是一个高性能的keyvalue数据库,它支持多种数据结构,常用做缓存、消息代理和配置中心。本节将简单介绍Redis的使...
- Windows服务器部署CRMEB开源电商系统,详细教程来了!
-
安装PHP已经安装过PHP的可以跳过首先安装VC运行库下载地址https://docs.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi...
- Windows系统下Redis各个安装包介绍与选择指南
-
简介Redis作为高性能的键值数据库,广泛应用于缓存、消息队列等场景。在Windows系统中部署Redis时,用户可以选择多种安装包以满足不同的需求。本文将详细介绍以下Redis8.0.3版本的安装...
- 从面试题入手,深度剖析Redis Cluster原理
-
揭开RedisCluster的神秘面纱**在当今数字化浪潮中,数据量呈爆炸式增长,应用程序对数据存储和处理的要求也日益严苛。Redis作为一款高性能的内存数据库,凭借其出色的读写速度和丰富的数...
- 给大家推荐些好的c语言代码的网站
-
C语言,那就来推荐几个吧,部分含有C++:1、TheLinuxKernelArchives(kernel.org)Linux内核源码,仅限于C,但内核庞大,不太适合新手;2、redis(redi...
- Redis String 类型的底层实现与性能优化
-
RedisString是Redis中最基础也是应用最广泛的数据类型,它能存储文本、数字、二进制数据等多种形式的信息。深入理解其底层实现对构建高性能分布式系统至关重要。Redis字符串的底层结...
- 阿里面试问:Redis 为什么把简单的字符串设计成 SDS?
-
分享了一道面阿里的redis题,我看了以后觉得挺有意思。题目大致是这样的面试官:了解redis的String数据结构底层实现嘛?铁子:当然知道,是基于SDS实现的面试官:redis是用C语言开发的,那...
- 编程语言那么多,为何C语言能成为最成功的语言?
-
编程语言那么多,为何C语言能成为最成功的语言?2025年嵌入式岗位暴增47%,新人却还在问"C语言过时了吗"。真相是连机器人关节驱动都得靠它写,不会指针连芯片手册都看不懂。见过用Pyt...
- go-zero 使用 redis 作为 cache 的 2 种姿势
-
在go-zero框架内,如在rpc的应用service中,其内部已经预置了redis的应用,所以我们只需要在配置中加入相关字段即可,另外,在svcContext声明redisc...
- Redis事务深度解析:ACID特性、执行机制与生产实践指南
-
一、Redis事务的本质与核心机制Redis事务通过MULTI、EXEC、WATCH等命令实现,其本质是将多个命令序列化后一次性执行,而非传统数据库的严格事务模型。核心特点如下:命令队列化:MULT...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis 哨兵 (52)
- redis结构 (53)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)