go-kratos 学习笔记(8) redis的使用

redis的在项目中的使用是很常见的,前面有了mysql的使用redis的也差不多;也是属于在data层的操作,所以需要新建一个 NewRedisCmd方法

在internal/data/data.go中新增NewRedisCmd 方法,注入到ProviderSet

package dataimport ("context""github.com/go-kratos/kratos/contrib/registry/nacos/v2""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/registry""github.com/go-kratos/kratos/v2/transport/grpc""github.com/google/wire""github.com/nacos-group/nacos-sdk-go/clients""github.com/nacos-group/nacos-sdk-go/common/constant""github.com/nacos-group/nacos-sdk-go/vo""github.com/redis/go-redis/v9""gorm.io/driver/mysql""gorm.io/gorm""time""xgs_kratos/gen/config/users""xgs_kratos/gen/orders"
)// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewDiscovery, CreateRegister, NewOrderServiceClient, NewUserRepo, NewRedisCmd)// Data .
type Data struct {// TODO wrapped database clientdb          *gorm.DBlog         *log.HelperorderClient orders.OrderClientredisCli    redis.Cmdable
}// NewData .
func NewData(c *conf.Data, logger log.Logger, client orders.OrderClient, redisCli redis.Cmdable) (*Data, func(), error) {db, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{})if err != nil {log.Fatalf("failed to connect database: %v", err)panic(err)}d := &Data{db:          db,log:         log.NewHelper(logger),orderClient: client,redisCli:    redisCli,}cleanup := func() {log.NewHelper(logger).Info("closing the data resources")}return d, cleanup, nil
}// NewDiscovery 服务发现
func NewDiscovery(conf *conf.Data) registry.Discovery {sc := []constant.ServerConfig{{IpAddr: conf.Nacos.Addr,Port:   conf.Nacos.Port,},}cc := constant.ClientConfig{NamespaceId: conf.Nacos.NamespaceId,TimeoutMs:   5000,}client, err := clients.NewNamingClient(vo.NacosClientParam{ClientConfig:  &cc,ServerConfigs: sc,},)if err != nil {panic(err)}r := nacos.New(client)return r
}// NewOrderServiceClient orders 服务客户端
func NewOrderServiceClient(r registry.Discovery) orders.OrderClient {conn, err := grpc.DialInsecure(context.Background(),grpc.WithEndpoint("discovery:///orders-xgs.grpc"),grpc.WithDiscovery(r),grpc.WithTimeout(time.Second*2),grpc.WithMiddleware(recovery.Recovery(),),)if err != nil {panic(err)}c := orders.NewOrderClient(conn)return c
}// NewRedisCmd redis的链接
func NewRedisCmd(conf *conf.Data) redis.Cmdable {client := redis.NewClient(&redis.Options{Addr:         conf.Redis.Addr,ReadTimeout:  conf.Redis.ReadTimeout.AsDuration(),WriteTimeout: conf.Redis.WriteTimeout.AsDuration(),DialTimeout:  time.Second * 2,PoolSize:     10,})timeout, cancelFunc := context.WithTimeout(context.Background(), time.Second*2)defer cancelFunc()err := client.Ping(timeout).Err()if err != nil {log.Fatalf("redis connect error: %v", err)}return client
}

执行 wire 生成依赖

在业务层使用 data/user.go 中的ListUser 方法做个缓存

package dataimport ("context""encoding/json""fmt""github.com/go-kratos/kratos/v2/log""github.com/redis/go-redis/v9""time""xgs_kratos/app/users/internal/biz""xgs_kratos/app/users/internal/data/dal""xgs_kratos/gen/orders""xgs_kratos/gen/users"
)//data 层处理数据的存储和读取type userRepo struct {data *Datalog  *log.Helper
}// NewUserRepo . r registry.Discovery,
func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {return &userRepo{data: data,log:  log.NewHelper(logger),}
}// CreateUser 创建用户
func (r *userRepo) CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error) {user := dal.UserMo{Age:   req.Age,Name:  req.Name,Email: req.Email,}result := r.data.db.Create(&user)if result.Error != nil {return nil, result.Error}return &users.CreateUserReply{Id: user.Id,}, nil
}func (r *userRepo) ListUser(ctx context.Context, req *users.ListUserRequest) ([]*users.UserData, error) {//获取order服务的clientclient := r.data.orderClientorder, err := client.CreateOrder(ctx, &orders.CreateOrderRequest{OrderNo: 1,})if err != nil {return nil, err}fmt.Println(order)var redisKey = "user_list"//获取redis的数据redisData, err := r.data.redisCli.Get(ctx, redisKey).Result()if err == redis.Nil {redisData = ""} else if err != nil {return nil, err}var results []dal.UserMo//缓存没有查询到查询数据库if redisData == "" {fmt.Println("查询了数据库。。。。。。")res := r.data.db.Find(&results)if res.Error != nil {return nil, res.Error}//把数据转换成jsonresByte, err := json.Marshal(results)if err != nil {return nil, err}//设置redis数据err = r.data.redisCli.Set(ctx, redisKey, string(resByte), 30*time.Second).Err()if err != nil {return nil, err}} else {fmt.Println("查询的缓存。。。。。。")//查到之后 把数据转换回去err = json.Unmarshal([]byte(redisData), &results)if err != nil {return nil, err}}var userDatas []*users.UserDatafor _, result := range results {userDatas = append(userDatas, &users.UserData{Id:    result.Id,Name:  result.Name,Age:   result.Age,Email: result.Email,})}return userDatas, nil
}

 然后启动项目 kratos run 看redis的缓存

项目的代码  码云 https://gitee.com/gebilaoxie/xgs_kratos.git

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

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

相关文章

Windows linux环境下操作redis数据库

在Windows系统安装redis下载一步一步即可安装。上设置Redis密码的过程与Linux系统类似,但需注意几个关键步骤以确保正确配置,这篇文章主要给大家介绍环境下查看、添加、修改redis数据库的密码两种方式,需要的朋友可以参考下 windows开始之前先启动redis服务,然后再…

正则采集器之五——商品匹配规则

需求设计 实现分析 系统通过访问URL得到html代码,通过正则表达式匹配html,通过反向引用来得到商品的标题、图片、价格、原价、id,这部分逻辑在java中实现。 匹配商品的正则做成可视化编辑,因为不同网站的结构不同,同…

论文阅读:A Survey on Evaluation of Large Language Models-鲁棒性相关内容

A Survey on Evaluation of Large Language Models 只取了鲁棒性相关的内容 LLMs:《A Survey on Evaluation of Large Language Models大型语言模型评估综述》理解智能本质(具备推理能力)、AI评估的重要性(识别当前算法的局限性设 对抗鲁棒性是衡量大型语言模型&…

C++参悟:accumulate 累加器

accumulate 累加器 一、概述二、快速代码版1. 简单的容器求和2. 带自定义求和器去求和3. 重载 运算符号 一、概述 accumulate 有两个参数版本如下&#xff1a; template< class InputIt, class T > T accumulate( InputIt first, InputIt last, T init );template<…

ComfyUI 、ComfyUI-Manager、ComfyUI-Translation语言包、Insightface、Crystools资源监测器安装

简单介绍ComfyUI、ComfyUI-Manager、ComfyUI-Translation语言包、Insightface、Crystools资源监测器安装&#xff0c;并通过ComfyUI-Manager安装缺失的节点。 1、ComfyUI安装 打开https://github.com/comfyanonymous/ComfyUI&#xff0c;找到Installing中 Direct link to do…

phpenv安装redis扩展

1、下载dll文件 https://pecl.php.net/package/redis 我的是php8.1, 安装最新版的 DLL文件 &#xff12;、将dll文件放到php安装目录的ext目录下 3、在php.ini中增加配置后重启服务 [Redis] extension php_redis.dll

VMware安装(有的时候启动就蓝屏建议换VM版本)

当你开始使用虚拟化技术来管理和运行多个操作系统时&#xff0c;VMware 是一个强大且广泛使用的选择。本篇博客将指导你如何安装 VMware Workstation Pro&#xff0c;这是一个功能强大的虚拟机软件&#xff0c;适用于个人和专业用户。 一、下载 VMware Workstation Pro 访问官网…

JavaScript青少年简明教程:函数及其相关知识(上)

JavaScript青少年简明教程&#xff1a;函数及其相关知识&#xff08;上&#xff09; 在JavaScript中&#xff0c;函数是一段可以重复使用的代码块&#xff0c;它执行特定的任务并可能返回结果。 内置函数&#xff08;Built-in Functions&#xff09; 内置函数是编程语言中预先…

ES里面常用的查询语句有哪些?

【编程电子书大全】链接: https://pan.baidu.com/s/1yhPJ9LmS_z5TdgIgxs9NvQ?pwdyyds > 提取码: yyds Elasticsearch&#xff08;ES&#xff09;中常用的查询语句包括以下几类&#xff1a; 1. Match 查询 用于全文搜索&#xff0c;匹配指定字段中的文本。 GET /index_na…

PLC网关:开启工业4.0时代的智能工厂之路

PLC即可编程逻辑控制器&#xff0c;是工业自动化领域的核心设备&#xff0c;广泛应用于各个工业领域。从PLC问世至今&#xff0c;一直表现出强大的生命力和高速增长态势&#xff0c;2020年全球PLC市场的销售量已经达到了百亿RMB级别。 随着行业智能化、数字化推广&#xff0c;…

【Vulnhub系列】Vulnhub_Seattle_003靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Seattle_003靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境准备 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

Nginx系列-12 Nginx使用Lua脚本进行JWT校验

背景 本文介绍Nginx中Lua模块使用方式&#xff0c;并结合案例进行介绍。案例介绍通过lua脚本提取HTTP请求头中的token字段&#xff0c;经过JWT校验并提取id和name信息&#xff0c;设置到http请求头中发向后段服务器。 默认情况下&#xff0c;Nginx自身不携带lua模块&#xff0…

Computer Analysis and Visualisation CITS2401

1. Outline In this project, we will continue from our Project 1 where we implemented a malicious credit card transaction detection system. But instead of iuww520iuww520​​​​​​​iuww520​​​​​​​iuww520​​​​​​​iuww520​​​​​​​iuww520​…

什么是海外云手机?海外云手机有什么用?

在跨境电商的浪潮中&#xff0c;如何高效引流成为了卖家们关注的焦点。近期&#xff0c;越来越多的卖家开始借助海外云手机&#xff0c;通过TikTok平台吸引流量&#xff0c;从而推动商品的海外销售。那么&#xff0c;究竟什么是海外云手机&#xff1f;海外云手机又能为跨境电商…

存储过程

1、概念 完成特定功能的sql语句的集合。把定义好的sql集合在一个特定的sql函数当中&#xff0c;每次执行调用函数即可&#xff0c;还可以实现传参的调用 2、作用 执行速度比sql语句执行速度更快&#xff0c;执行效率也更高 客户端可以随时调用发放&#xff0c;也可以随时修…

商家转账到零钱保姆级申请教程

大多数商家在申请微信支付的“商家转账到零钱”过程中都免不了遇到问题&#xff0c;更有不少商家因为屡次驳回严重耽误项目工期。为了帮助商户顺利开通该接口&#xff0c;根据我们上万次成功开通的经验整理这篇攻略以供参考&#xff1a; 一、前期准备 1. 确认主体资格&#xf…

跨境电商独立站术语盘点(一)独立站建站篇

跨境新手总是被一些跨境专业术语弄得头晕脑胀&#xff0c;不懂得查&#xff0c;查了又忘&#xff0c;忘了又得继续查…… 本期【跨境干货】&#xff0c;笔者特地为大家整理汇总了跨境电商独立站常用网站建站方面的专业术语&#xff0c;帮助你了解建站相关知识&#xff01;赶紧收…

安装python插件命令集合

安装python插件pyecharts库 pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple 安装python插件pandas库 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple PyCharm 中安装步骤&#xff1a;

数据结构之队列详解

1.队列的概念以及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFo(Frist in Frist out)的特性 入队列&#xff1a;进行插入才操作的一端称为队尾 出队列&#xff1a;进行删除操作的一…

谷粒商城实战笔记-编码经验积累

文章目录 1. 先理解需求&#xff0c;后写代码惨痛经历教训 2. 前后端都要校验惨痛经历教训 3&#xff0c;避免使用JOIN查询以提高性能4&#xff0c;用常量类代替魔法数字 1. 先理解需求&#xff0c;后写代码 惨痛经历 几年前&#xff0c;我所在的团队负责为开发一个在线预订系…