当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OpenCV 图像基础
  • 养宠空气净化器哪家好?养宠空气净化器质量好的牌子推荐
  • Ubuntu一键导入openVPN配置文件
  • PHP多功能投票系统源码小程序
  • 用来跳转的<a> 标签,原来还有这么多强大又实用的功能
  • 通信原理-思科实验五:家庭终端以太网接入Internet实验
  • 征服 Docker 镜像访问限制:KubeSphere v3.4.1 成功部署全攻略
  • 【Redis进阶】集群
  • cf960(div2)
  • Gogs搭建免费好用的Git服务器
  • 力扣面试题(一)
  • 大语言模型系列——Transformer 介绍与使用
  • Dav_笔记11:SQL Tuning Overview-sql调优 之 3
  • springboot整合 knife4j 接口文档
  • uniapp的h5,读取本地txt带标签的文件
  • 「面试题」如何实现一个圣杯布局?
  • AHK 中 = 和 == 等比较运算符的用法
  • java2019面试题北京
  • js算法-归并排序(merge_sort)
  • js写一个简单的选项卡
  • Laravel核心解读--Facades
  • Node项目之评分系统(二)- 数据库设计
  • Protobuf3语言指南
  • quasar-framework cnodejs社区
  • 大整数乘法-表格法
  • 力扣(LeetCode)22
  • 使用common-codec进行md5加密
  • 消息队列系列二(IOT中消息队列的应用)
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 云大使推广中的常见热门问题
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #vue3 实现前端下载excel文件模板功能
  • #单片机(TB6600驱动42步进电机)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)http-server应用
  • (转)Linux整合apache和tomcat构建Web服务器
  • *Django中的Ajax 纯js的书写样式1
  • .ai域名是什么后缀?
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 获取url的方法
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net连接MySQL的方法
  • .NET企业级应用架构设计系列之技术选型
  • .NET中两种OCR方式对比
  • ??javascript里的变量问题
  • ??在JSP中,java和JavaScript如何交互?
  • @Transactional 详解