• 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 dataMap = 9;//定义map类型的数据 map

            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 - 查询元素的排名
        */
    }
    

  • 相关阅读:
    Eigen库的配置方法
    服务器的维护是如何操作
    您的Vue3学习指南,请查收!!!
    基于Spark的电影推荐系统实现
    天梯赛 L2-047 锦标赛
    NoSQL之Redis配置与优化
    云计算 3月14号 (TCP三次握手和四次挥手)
    win10环境下PCL安装和配置回顾(一)
    ubuntu下yolox tensorrt模型部署
    新零售O2O 电商模式解析
  • 原文地址:https://blog.csdn.net/qq_39376608/article/details/137912326