大数据实战:你还在只用json协议吗?试试高效的pb协议吧!

2023-12-27 17:55:31

大数据实战:你还在只用json协议吗?试试高效的pb协议吧!

在这里插入图片描述

当在大数据场景下进行数据存储的时候,多数时候,随着数据量的增加,将会导致机器的负载升高以及数据交换的实践成本增加。这种情况下,要么硬件的扩容;要么就要进行存储结构的优化。很明显,硬件的成本是巨大的,同时也不可能无限增加,所以,有必要进行一定的存储结构和数据压缩优化了。目前常用的两种数据存储和交换方式是:json协议和pb协议。

pb协议简介

Protocol Buffers(简称PB)是一种轻量级、高效的数据序列化协议,由Google开发。它可以用于结构化数据的存储、通信和跨语言传输。

  1. PB协议的特点
    a. 简洁高效: PB使用二进制编码,相比于文本格式的数据序列化协议,PB在数据存储和传输方面更高效、更紧凑。
    b. 跨语言支持: PB定义数据结构的.proto文件可以通过编译器生成多种编程语言的代码,支持跨语言的数据传输和解析。
    c. 可扩展性: PB支持向前和向后兼容性,可以在不破坏现有功能的情况下扩展或修改数据结构。
    d. 高效的序列化和反序列化: PB提供高速的序列化和反序列化操作,适用于对性能要求较高的场景。

  2. PB的使用方式
    a. 定义消息类型: 使用.proto文件定义消息类型和字段,包括字段名称、类型、标识符等信息。
    b. 编译.proto文件: 使用PB编译器将.proto文件编译为目标语言的代码文件。
    c. 序列化与反序列化: 在编程语言中,使用生成的代码进行消息的序列化和反序列化操作。
    d. 数据传输和存储: 使用PB序列化后的数据进行网络传输、存储或持久化操作。

  3. Go语言中的PB示例
    a. 定义.proto文件: 创建一个example.proto文件,定义消息类型和字段,例如定义一个Person消息类型,包含name和age字段。
    b. 编译.proto文件: 使用protoc命令将example.proto文件编译为Go语言的代码文件。
    c. 使用生成的Go代码:

    • 导入生成的Go代码包。
    • 创建一个Person消息对象,设置字段的值。
    • 使用proto.Marshal函数将消息对象序列化为字节流。
    • 使用proto.Unmarshal函数将字节流反序列化为消息对象。
    • 访问消息对象的字段值。
  4. Go语言示例代码
    a. 示例的example.proto文件定义:

    syntax = "proto3";
    
    message Person {
      string name = 1;
      int32 age = 2;
    }
    

    b. 生成Go代码:

    protoc --go_out=. example.proto
    

    c. Go语言示例代码:

    package main
    
    import (
      "fmt"
      "github.com/golang/protobuf/proto"
      pb "your-generated-package-name"
    )
    
    func main() {
      person := &pb.Person{
        Name: "John",
        Age:  30,
      }
    
      // 序列化
      data, err := proto.Marshal(person)
      if err != nil {
        fmt.Println("序列化失败:", err)
        return
      }
    
      // 反序列化
      newPerson := &pb.Person{}
      err = proto.Unmarshal(data, newPerson)
      if err != nil {
        fmt.Println("反序列化失败:", err)
        return
      }
    
      fmt.Println("Name:", newPerson.Name)
      fmt.Println("Age:", newPerson.Age)
    }
    ```
    
    **PB协议是一种高效的数据序列化协议,具有简洁、跨语言和可扩展的特点。在Go语言中,可以通过定义.proto文件、使用PB编译器和生成的Go代码来实现PB的使用。通过示例代码,展示了如何在Go语言中进行PB消息的序列化和反序列化操作。**
    
    
    

json协议简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于跨平台数据传输和存储。它具有简洁、可读性强的特点,易于处理和解析。

  1. JSON协议的特点
    a. 简洁易读: JSON使用文本格式表示数据,采用键值对的形式,易于人类阅读和编写。
    b. 跨平台兼容: JSON是一种与语言和平台无关的数据格式,可以在不同的编程语言和操作系统之间进行数据传输和解析。
    c. 支持复杂数据结构: JSON支持多层次的嵌套数据结构,可以表示复杂的对象和数组。
    d. 可扩展性: JSON允许在数据中添加自定义的字段,具有较好的扩展性。

  2. JSON的使用方式
    a. 数据表示: 使用键值对的形式表示数据,键是字符串,值可以是字符串、数字、布尔值、对象、数组等。
    b. 序列化与反序列化: 在编程语言中,使用库函数将数据对象序列化为JSON字符串,或将JSON字符串反序列化为数据对象。
    c. 数据传输和存储: 使用JSON字符串作为数据的传输格式,可以进行网络通信、存储到文件或数据库等操作。

  3. Go语言中的JSON示例
    a. 序列化: 将Go语言中的数据结构序列化为JSON字符串。
    b. 反序列化: 将JSON字符串反序列化为Go语言中的数据结构。

  4. Go语言示例代码
    a. Go语言序列化示例:

    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type Person struct {
      Name string `json:"name"`
      Age  int    `json:"age"`
    }
    
    func main() {
      person := Person{
        Name: "John",
        Age:  30,
      }
    
      // 序列化为JSON字符串
      data, err := json.Marshal(person)
      if err != nil {
        fmt.Println("序列化失败:", err)
        return
      }
    
      fmt.Println(string(data))
    }
    ```
    
    b. Go语言反序列化示例:
    ````go
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type Person struct {
      Name string `json:"name"`
      Age  int    `json:"age"`
    }
    
    func main() {
      jsonStr := `{"name":"John","age":30}`
    
      // 反序列化为Go对象
      var person Person
      err := json.Unmarshal([]byte(jsonStr), &person)
      if err != nil {
        fmt.Println("反序列化失败:", err)
        return
      }
    
      fmt.Println("Name:", person.Name)
      fmt.Println("Age:", person.Age)
    }
    ```
    
    **JSON协议是一种简洁且易于解析的数据交换格式,在跨平台数据传输和存储方面具有广泛应用。在Go语言中,可以使用标准库中的json包来实现JSON的序列化和反序列化操作。通过示例代码,展示了如何在Go语言中处理JSON数据。**
    
    
    

pb协议和jso协议适用场景

  • Pb 是一种由 Google 开发的序列化数据格式,它具有高效、紧凑和快速的特点。Pb 采用了二进制编码,因此在序列化和反序列化过程中可以达到更高的效率,尤其在对性能要求较高的场景下,如网络传输和实时数据处理。
  • 相比之下,JSON 是一种轻量级的数据交换格式,它采用了文本形式的表示方式,易于阅读和编写。JSON 具有良好的跨平台性和兼容性,几乎被所有的编程语言所支持。因此,JSON 在 Web 应用、移动应用和 API 开发中得到了广泛的应用。
  • 在数据大小方面,Pb 通常比 JSON 更小。这是因为 Pb 采用了二进制编码,可以更高效地表示数据,从而减少了数据的体积。对于大量数据的传输和存储,Pb 可以显著节省带宽和存储空间。
  • 然而,JSON 在可读性和易维护性方面具有优势。JSON 的文本形式使得它更容易阅读和理解,方便人工编辑和调试。此外,JSON 拥有丰富的生态系统和工具支持,使得它在数据共享和协作方面更加便利。

综上所述,Pb 和 JSON 各有优劣。在选择数据格式时,需要根据具体的应用场景和需求进行考虑。如果对性能要求较高,且数据量较大,Pb 可能是更好的选择;而如果需要更好的可读性和跨平台支持,JSON 则更为适合。当然,在实际应用中,也可以根据需要将两种数据格式结合使用,以达到最佳的效果。

文章来源:https://blog.csdn.net/weixin_41296877/article/details/135249632
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。