GoFrame避坑指南和实践干货(2)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河

用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河~


Redis Setex


首先我们要知道这个概念:Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。


在goframe中是支持这么操作的:


_, err = g.Redis().Do("SETEX", redisKey, 86400, res)


rune的使用


首先我们要知道rune是int32的别名:


type rune = int32


golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。


len([]rune("王中阳"))的长度,一个中文返回一个长度,而不是返回3个字符长度。


gvalid数据校验


在goframe中,我们可以在结构体中设置校验规则,不需要在业务逻辑中进行判断,这样能使我们的代码更清晰。


示例


//校验地址
if err := gvalid.CheckStruct(ctx, data.Address, nil); err != nil {
   response.ParamErr(r, err)
}


其中:data.Address 是需要校验的数据。在执行校验地址之前已经把传入的数据赋值到了对应的结构体:


var data *define.OrderServiceCreateReq
if err := r.Parse(&data); err != nil {
   response.ParamErr(r, err)
}


其中:define.OrderServiceCreateReq 的定义如下:


type OrderServiceCreateReq struct {
   SellerId       uint                    `json:"sellerId"`
   AppId          int                     `json:"appId"`
   ChannelId      int                     `json:"channel_id"`
   OrderSn        string                  `p:"orderSn" v:"orderSn@required#orderSn 必须传递"`
   Spu            []*OrderServiceSkuReq   `p:"spu" v:"spu@required#请输入spu"`
   Address        *OrderServiceAddressReq `p:"address" v:"address@required#请输入address"`
   StrictMode     bool                    `json:"strictMode"`
   PayType        int                     `p:"payType" v:"payType@integer|in:0,1,2"` //0 余额 1 支付宝 2 微信
   Rate           int                     `json:"rate"`
   IsSplitMoney   int                     `json:"is_split_money"`
   AccountBalance int                     `json:"account_balance"`
   ErrId          int                     `json:"errId"`
   AccountPhone   string                  `json:"account_phone"`
   AppKey         string
   SiteId         uint `json:"site_id"`
}


其中:Address 对应的是结构体类型:OrderServiceAddressReq

我们在看一下OrderServiceAddressReq是怎么定义的?校验规则就是在这里定义的:


type OrderServiceAddressReq struct {
   Consignee   string `v:"required|length:2,15#请输入consignee|收货人长度:min到:max位"`
   Phone       string `v:"phone@required|phoneNew#请输入phone"`
   Province    string `v:"required#address.province 必须传递"`
   City        string `v:"required#address.city 必须传递"`
   Area        string `v:"required#address.area 必须传递"`
   Street      string
   Description string `v:"required|max-length:50#请输入description|详细地址最大长度不超过:max个字"`
}


其中:#的后面写的就是校验提示


redis锁 避免重复请求


思路非常简单:因为redis相较于关系型数据库,读写性能更高;

这种加锁的思路简单高效:


func (s *orderApi) Create(r *ghttp.Request) {
   var data *define.OrderServiceCreateReq
   if err := r.Parse(&data); err != nil {
      response.ParamErr(r, err)
   }
   key := "order:"
   key += r.GetString("appId")
   key += ":"
   key += gmd5.MustEncryptString(r.GetBodyString())
   val, err := g.Redis().DoVar("GET", key)
   if err != nil {
      response.ApiResponse(r, tools.Code{}.BackErr())
      return
   }
   if val.Int() > 0 {
      response.ApiResponse(r, tools.Code{}.BackErrMsg("请勿重复请求"))
      return
   }
   _, _ = g.Redis().DoVar("SETEX", key, 3, 1)
}


查文档


对了,goframe的文档做的真心不错,对开发者非常友好。

说实话,作为有几年工作经验的程序员,换一门语言进行开发难度并不大。

实现业务逻辑的思路是相通的,差别就是实现语法上,或者是语言对某些场景的支持:比如go对高并发的支持、Java对锁的支持、PHP对数组集合的支持。

我的习惯是这样:在确定了业务逻辑之后,整理好实现思路,先写伪代码,避免陷入切换语言(从PHP到Go)的不适(总是会陷入想优化代码的细枝末节里);伪代码写完后,再开始撸业务逻辑,遇到不清楚的语法直接查文档,这样做,思路就会很清晰。

比如:我要做城市信息匹配,输入参数是“北京”或者“唐山市”(直辖市不带市),但是我的数据库中存储的是“北京市”,匹配不到。

一个解决思路就是:校验一下输入参数,如果不包括“市”,就在原有的输入参数后追加一个“市”。



微信图片_20221112190254.jpg


微信图片_20221112190258.jpg


一查文档果然封装好了方法,拿来就用喽:


city := address.City
if !gstr.Contains(city, "市") {
   city = city + "市"
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
监控 前端开发 应用服务中间件
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽(2)
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽
85 1
|
5月前
|
负载均衡 前端开发 应用服务中间件
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽(1)
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽
181 1
|
6月前
|
SQL 存储 分布式计算
Kylin使用心得:从入门到进阶的探索之旅
【5月更文挑战第2天】Apache Kylin是开源大数据分析平台,提供亚秒级OLAP查询。本文深入解析Kylin的工作原理,包括预计算模型Cube、构建过程和查询引擎。常见问题涉及Cube设计、查询性能和资源管理,解决方案涵盖合理设计、性能监控和测试验证。文中还分享了Cube创建的JSON示例,并探讨了Cube构建优化、查询优化、与其他组件集成、监控维护及生产环境问题解决。通过学习和实践,读者能有效提升数据洞察力和决策效率。
407 5
|
敏捷开发 架构师 Java
GitHub上线重量级分布式架构原理设计笔记,开源的东西看着就是爽
在分布式系统中,一次业务处理可能需要多个应用来实现,比如用户发送一次下单请求,就涉及到订单系统创建订单,库存系统减库存,而对于一次下单,订单创建与减库存应该是要同时成功或者同时失效,但在分布式系统中,如果不做处理,就很有可能订单创建成功,但是减库存失败,那么解决这类问题,就需要用到分布式事务……
GitHub程序调优「黑马」!阿里大牛的Java性能优化实战笔记已上线
作为一个平台,JVM虚拟机起着举足轻重的作用。除了Java语言,任何一种能够被编译成字节码的计算机语言都属于Java这个平台。Groovy、Scala和JRuby等都是Java平台的一部分,它们依赖于JVM虚拟机,同时,Java平台也因为它们而变得更加丰富多彩。
|
缓存 监控 Java
从零到一构建完整知识体系,阿里最新SpringBoot原理最佳实践真香
Spring Boot不用多说,是咱们Java程序员必须熟练掌握的基本技能。工作上它让配置、代码编写、部署和监控都更简单,面试时互联网企业招聘对于Spring Boot这个系统开发的首选框架也是考察的比较严苛,如果你不是刚入行,只是停留在会用的阶段,那是远远不够的。 虽然Spring Boot易上手,但很多小伙伴也是时不时会跟我反映,Spring Boot技术体系太庞杂了,包含了太多的技术组件,不知道到底该如何高效学习,建立起全面且完整的Spring Boot技术体系和实践技巧,这个时候站在巨人的肩膀上学习就变得非常有必要了,汲取大佬们的学习经验,避免工作面试踩坑,轻松构建Spring Bo
|
安全 Java Serverless
65w字!阿里分布式开发小册Github新开源!原理实践双飞
我们都知道传统的集中式系统已无法满足当今的互联网三高需求,所以现在的系统架构都是向着分布式系统不断演进。同时,越来越多的企业选择通过云的方式发布和部署应用,这也大大促进了分布式系统的发展。未来将是分布式系统“爆发”的时代。
|
JavaScript Shell 开发工具
使用vuepress从零开始搭建我的技术文档|已部署到线上
几天前为了深入学习JS我手写了一个JS工具库,并且发布到了npm上 我把具体步骤,从零搭建再到发布上线的全部细节都写在这这一片文章上了:手写了一个JS工具库并发布到npm 既然已经写了JS工具库,那必须要有文档呀,要不然谁知道怎么使用!!! 所以今天这篇文章就介绍一下怎么使用vuepress2.x搭建一个文档,内容不深,小白也能看懂,因为我只是小小的写了一下 ^_^嘿嘿 文档效果可以点击此处查看☞:LearnJTs文档
664 1
使用vuepress从零开始搭建我的技术文档|已部署到线上
|
SQL Java 关系型数据库
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第五节)
在上一节中,我们成功将数据从前台的JSP页面传递到了controller层,但是还没有写service层,老实说还有很多工作没有,尤其是和数据库的链接方面的,所以,这一节,我们专门来处理一下关于数据库连接方面的东西。
104 0
|
JSON JavaScript 前端开发
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)
117 0
下一篇
无影云桌面