ProtoBuf、Grpc、GORM、Go-redis 入门基础

一、ProtoBuf、Grpc

ProtoBuf定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

说白了,可以将ProtoBuf文件 当作支持语言的代码交换工具

Grpc定义:gRPC 是一个高性能、跨平台、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。

说白了Grpc就是服务、客户端的接口通信标准之一

ProtoBuf、Grpc 的示例

//指定protobuf版本信息,目前最新的版本就是proto3

syntax = "proto3";  //syntax关键词定义使用的是proto3语法版本

//定义消息体包名

package app.service.book;

// 单独为go定义包名

option go_package=".;book" ; // option关键字后面的 go_package 表示为go重新定义包名

//单独为php类文件配置命名空间

option php_namespace="./app/service/book";//php_namespace 表示生成php类文件配置命名空间

//单独为php元数据文件配置命名空间

option php_metadata_namespace="./app/service/book";//php_metadata_namespace 表示生成php元数据配置命名空间

//当然上面除了java和php外 还支持很多语言的特殊配置,有兴趣的可以百度查询

//生成消息体 -通常用作接口传参和返回值定义

message DataRequest { //message是关键字  DataRequest是消息名

        //[数据类型] [数据名称] = [数据标识号]  //标识号和数据名称不能重复

        int32   dataId32 = 1; //定义一个 int32 类型的数据,名称是 dataId32 标识号为1

        int64   dataId64 = 2; //定义一个 int64 类型的数据,名称是 dataId64 标识号为2

        string  dataName = 3;//下面的我就不一一说明,大致意思都是一样的

        bool    dataBool = 4;

        double dataDouble = 5;

        float    dataFloat = 6;

        DataType  type = 7 // DataType 是下面定义的枚举类型

        DataNew dataNew = 8;//DataNew 是下面定义的消息体

        map<string,string> dataMap = 9;//定义map类型的数据 map<key类型,value类型>

        repeated string dataNameList = 10;// repeated关键字 表示声明一个数组数据

        repeated DataNew dataNewList = 11;//repeated也可以用于消息体、map等

 }

//定义一个枚举消息类型 DataType

enum  DataType 

{

        hello = 0; //在proto3版本中,首成员必须为0,成员不应有相同的值

        word = 1;

}

//定义一个新消息体

message DataNew{

        int32 dataChildId = 1;

        string dataChildName = 2;

}

//除了定义消息外,proto还可以定义服务(rpc)

service dataService { //service关键字 用于定义一个服务

       [rpc 服务关键字] [方法名称](方法传参) [returns 关键字] [方法返回值]

        rpc  GetDataInfo(DataRequest ) returns (DataNew);

}

 上面记录了ProtoBuf文件的定义示例,至于通过protoc将.proto文件生成相应的代码,大家各自百度就行。

下面我简单的记录一下 php 在windows下的调用:

protoc.exe --php_out=./ --grpc_out=./  --plugin=protoc-gen-grpc=E:\\grpc_php_plugin.exe ./book.proto

--php_out=   //指定php文件生成的路径

--grpc_out= //如果需要通过php调用grpc 则需要指定生成php_grpc的文件路径

--plugin=protoc-gen-grpc=  //指定生成grpc文件对应的插件,大家可以上百度查找

如果大家是windows版本,且不会打包grpc_php_plugin.exe文件的话,我给提供一个大佬打包好的地址:

GitHub - lifenglsf/grpc_for_windows: grpc windows protobuf

如果命令运行过程中报缺少VCRUNTIME140_1.dll,MSVCP140.dll 等文件的话,在电脑上装个visual Studio 软件选中 C++桌面开发模块即可。

二、Gorm

Gorm定义:GORM是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单,使用上主要就是把struct类型和数据库表记录进行映射

Gorm示例:

首先通过go命令 安装mysql和Gorm相关驱动包

//安装MySQL驱动

go get -u gorm.io/driver/mysql

//安装gorm包

go get -u gorm.io/gorm

安装完驱动后,则开始连接sql 和 进行 sql 语句执行

package main   //定义包名

//引入相应包

import (

        "gorm.io/driver/mysql"  //引入mysql驱动包

        "gorm.io/gorm"             //引入gorm驱动包

        "fmt"                             //引入fmt包

        "time"                           //引入time包

        "errors"                        //引入errors包

)

//定义User模型,绑定users表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应

//在这里User类型可以代表mysql users表

type User struct {

        ID int64 // 主键

        //`gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username

        Username string `gorm:"column:username"`

        Password string `gorm:"column:password"` //注意设定gorm:"column:" 后 mysql映射的列就只和column指定的字符串有关,和前面的变量名无关。

        //创建时间,时间戳

        CreateTime int64 `gorm:"column:createtime"`

}

//设置表名,可以通过给struct类型定义 TableName函数,返回当前struct绑定的mysql表名是什么

func (u User) TableName() string {

        return "users"    //绑定MYSQL表名为users

}

func main() {

        //配置MySQL连接参数

        username := "root"    //账号

        password := "123456"  //密码

        host := "127.0.0.1" //数据库地址,可以是Ip或者域名

        port := 3306  //数据库端口

        Dbname := "test" //数据库名

        

        //通过前面的数据库参数,拼接MYSQL DSN, 其实就是数据库连接串(数据源名称)

        //MYSQL dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local

        //类似{username}使用花括号包着的名字都是需要替换的参数

        dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)

        //连接MYSQL

        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

        //err 用来接收gorm连接失败信息,连接成功则为nil

        if err != nil { panic("连接数据库失败, error=" + err.Error()) }

        //定义一个用户,并初始化数据

        u := User{

                Username:"tizi365",

                Password:"123456",

                CreateTime:time.Now().Unix(),

         }

        //下面代码会自动生成SQL语句:INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('tizi365','123456','1540824823')

        if err := db.Create(&u).Error; err != nil {

                fmt.Println("插入失败", err)

                 return

        }

 上面只列举了gorm针对于mysql的inster使用方法,如果想看其他的搜gorm的中文文档即可。

文档借鉴地址:golang基础教程 - 梯子教程网

三、Go-Redis

Redis示例

安装redis依赖包

go get -u github.com/go-redis/redis

 安装完redis后,进行redis连接调用

package main

import (
    "fmt"
    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
       Addr:     "127.0.0.1:6379", // redis地址
       Password: "",               // redis密码,没有则留空
       DB:       0,                // 默认数据库,默认是0
    })

    // 设置一个key,过期时间为0,意思就是永远不过期
    err := client.Set("key", "value", 0).Err()

    // 检测设置是否成功
    if err != nil {
       panic(err)
    }

    // 根据key查询缓存,通过Result函数返回两个值
    //  第一个代表key的值,第二个代表查询错误信息
    val, err := client.Get("key").Result()

    // 检测,查询是否出错
    if err != nil {
       panic(err)
    }
    fmt.Println("key", val)

    /**
       Set - 设置一个key的值
       Get - 查询key的值
       GetSet - 设置一个key的值,并返回这个key的旧值
       SetNX - 如果key不存在,则设置这个key的值
       MGet - 批量查询key的值
       MSet - 批量设置key的值
       Incr,IncrBy,IncrByFloat - 针对一个key的数值进行递增操作
       Decr,DecrBy - 针对一个key的数值进行递减操作
       Del - 删除key操作,可以批量删除
       Expire - 设置key的过期时间
       HSet - 根据key和field字段设置,field字段的值
       HGet - 根据key和field字段,查询field字段的值
       HGetAll - 根据key查询所有字段和值
       HIncrBy - 根据key和field字段,累加数值。
       HKeys - 根据key返回所有字段名
       HLen - 根据key,查询hash的字段数量
       HMGet - 根据key和多个字段名,批量查询多个hash字段值
       HMSet - 根据key和多个字段名和字段值,批量设置hash字段值
       HSetNX - 如果field字段不存在,则设置hash字段值
       HDel - 根据key和字段名,删除hash字段,支持批量删除hash字段
       HExists - 检测hash字段名是否存在。
       LPush - 从列表左边插入数据
       LPushX - 跟LPush的区别是,仅当列表存在的时候才插入数据
       RPop - 从列表的右边删除第一个数据,并返回删除的数据
       RPush - 从列表右边插入数据
       RPushX - 跟RPush的区别是,仅当列表存在的时候才插入数据
       LPop - 从列表左边删除第一个数据,并返回删除的数据
       LLen - 返回列表的大小
       LRange - 返回列表的一个范围内的数据,也可以返回全部数据
       LRem - 删除列表中的数据
       LIndex - 根据索引坐标,查询列表中的数据
       LInsert - 在指定位置插入数据
       SAdd - 添加集合元素
       SCard - 获取集合元素个数
       SIsMember - 判断元素是否在集合中
       SMembers - 获取集合中所有的元素
       SRem - 删除集合元素
       SPop,SPopN - 随机返回集合中的元素,并且删除返回的元素
       ZAdd - 添加一个或者多个元素到集合,如果元素已经存在则更新分数
       ZCard - 返回集合元素个数
       ZCount - 统计某个分数范围内的元素个数
       ZIncrBy - 增加元素的分数
       ZRange,ZRevRange - 返回集合中某个索引范围的元素,根据分数从小到大排序
       ZRangeByScore,ZRevRangeByScore - 根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页。
       ZRem - 删除集合元素
       ZRemRangeByRank - 根据索引范围删除元素
       ZRemRangeByScore - 根据分数范围删除元素
       ZScore - 查询元素对应的分数
       ZRank, ZRevRank - 查询元素的排名
    */
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工作流JBPM操作API启动实例查询任务

文章目录 8.5 启动实例8.5.1 按照key启动(不加参数)8.5.2 按照key启动(加入参数)8.5.3 启动流程实例的说明 8.6 查询任务8.6.1 查询所有未办理任务8.6.2 查询个人未办理任务8.6.3 查询个人的待办组任务 8.5 启动实例 8.5.1 按照key启动(不加参数) Test // 启动 -- 简单的启…

2024华中杯B题完整思路代码论文解析

2024华中杯B题思路论文汇总 https://www.yuque.com/u42168770/qv6z0d/xpkf6ax8udqq9lt2?singleDoc# 本文针对电子地图服务商利用车辆轨迹数据估计城市路口信号灯周期的问题,提出了一系列数学模型和算法。通过分析车辆行驶轨迹与信号灯的关联性,在不同的约束条件下,实现了对路…

谷歌量化白皮书—PTQ原理

本篇笔记摘抄的原文链接 量化方法 量化粒度 量化模拟 激活层的量化 量化硬件原理 量化范围的设置方法 基于BN的激活层量化范围设置 普通卷积 VS 深度可分离卷积 跨层均衡化 ReLU6比ReLU有什么优势 吸收高偏差、偏差校正、自适应取整 标准PTQ流程 量化模型精度的诊断和性能…

综合大实验

题目&#xff1a; 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#xff0c;其…

LeetCode in Python 1338. Reduce Array Size to The Half (数组大小减半)

数组大小减半思路简单&#xff0c;主要是熟悉python中collections.Counter的用法&#xff0c;采用贪心策略即可。 示例&#xff1a; 图1 数组大小减半输入输出示例 代码&#xff1a; class Solution:def minSetSize(self, arr):count Counter(arr)n, ans 0, 0for i, valu…

【ESP32 手机配网教程】

【ESP32 手机配网教程】 1. 前言2. 先决条件2.1 环境配置2.2 所需零件3.3 硬件连接步骤 3. Web热点手动配网3.1. 准备工作3.2. 编译上传程序3.3. 进行手动配网 4. BLE无线配网4.1. 准备工作**4.2. 编译上传程序4.3. 使用手机APP进行无线配网 5. 总结 1. 前言 欢迎使用ESP32进行…

JVM虚拟机(十一)CPU飙高的排查方案与思路

目录 一、排查方案与思路二、总结 一、排查方案与思路 1.一般我们查看 CPU 的使用情况&#xff0c;可以使用 TOP 命令&#xff1a; top执行结果如下所示&#xff0c;这里就可以按照 CPU 使用率进行排序。 2.通过 top 命令查看后&#xff0c;可以查看是哪一个 Java 进程占用 C…

JS中的变量和数据类型及用户输入详解

源码 variate.html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…

详细分析Mysql常用函数(附Demo)

目录 前言1. 聚合函数2. 字符串函数3. 日期函数4. 条件函数5. 数值函数6. 类型转换函数 前言 由于实战中经常运用&#xff0c;索性来一个总结文 创建一个名为 employees 的表&#xff0c;包含以下字段&#xff1a; employee_id&#xff1a;员工ID&#xff0c;整数类型 first…

Redis几种常见的应用方式

1.登录认证 redis最常见的应用就是&#xff0c;登录认证把。再首次登录返回给前端token&#xff0c;把用户名和登录状态缓存到redis一段时间&#xff0c;每次其他请求进来过滤器那这token解析出来的用户名或其他关键的key值&#xff0c;再redis里面查询缓存&#xff0c;有则直…

驱动云创建保存自己的环境

驱动云创建保存自己的环境 制作镜像方法一方法二报错 上一篇link介绍了如何在驱动云上部署llama2以及驱动云在训练大模型的方便之处。也说到了可以直接使用驱动云现有的环境&#xff0c;免得自己配置环境。 但是有的时候免不了自己想要安装一些包。 驱动云的环境是这样的&…

华为手机p70即将上市,国内手机市场或迎来新局面?

4月15日&#xff0c;华为官宣手机品牌全新升级&#xff0c;p系列品牌升级为Pura。华为P70系列手机预计将于2024年第一季度末发布&#xff0c;而网友也纷纷表示期待p70在拍照、性能上的全新突破。 网友们对华为P70系列的热情高涨&#xff0c;也印证了国内高端手机市场的潜力巨大…

遥感图像分割 | 基于一种类似UNet的Transformer算法实现遥感城市场景图像的语义分割_适用于卫星图像+航空图像+无人机图像

项目应用场景 面向遥感城市场景图像语义分割场景&#xff0c;项目采用类似 UNet 的 Transformer 深度学习算法来实现&#xff0c;项目适用于卫星图像、航空图像、无人机图像等。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装依赖 conda create -n airs python3.8…

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测(Matlab实现)

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09; 目录 【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 差异创意搜索算法&…

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304)&#xff0c;但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下&#xff1a; 解决方案 PyCharm会自动识别出来flask项目&#xff08;即使你…

24位AD分辨率、256Ksps*16通道国产数据采集卡、uV级采集、支持IEPE

24位AD分辨率、256Ksps*16通道、uV级采集、USB数据传输、支持IEPE、C、LABVIEW、MATLAB、Python等多编程语言&#xff0c;提供例程&#xff0c;支持二次开发。 XM7016-以太网采集卡 XM7016是一款以太网型高速数据采集卡&#xff0c;具有16通道真差分输入&#xff0c;24位分辨率…

互联网技术底蕴探究 | 联网通信原理精析与网络协议通信机制

联网通信原理精析与网络协议入门导览 前提介绍网络网络结构与节点网络应用Sun公司的Jini技术 网络设备网卡&#xff08;Netword Card&#xff09;以太网卡 路由器&#xff08;Router&#xff09;处理数据模式安全控制访问 集线器&#xff08;Hub&#xff09;网关&#xff08;Ga…

CSS的语法规则——基础选择器

元素&#xff1a; 用法&#xff1a; 标签名&#xff1a;{style的内容} 特点&#xff1a; 全局性&#xff0c;使用后&#xff0c;所有的相同标签都是同一种样式。 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UT…

【Linux冯诺依曼体系结构】

目录 1.冯诺依曼体系结构原理 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 输入单元&#…

【个人博客搭建】(9)使用日志

net自带日志与Serilog。 1、比较。net 8 webapi使用自带的日志功能与Serilog日志的异同&#xff0c;性能上有多少差距 在.NET 8 WebAPI中&#xff0c;使用自带的日志功能与使用Serilog日志框架存在一些异同。性能上的差距取决于具体的使用场景和配置&#xff0c;但通常Serilog…
最新文章