一般情况下,我们会对 Redis 的数据进行 JSON 格式序列化,但是二般情况下,我们可以使用 Protobuf 格式来优化存储。
使用 Protobuf 格式有明显的优缺点:
优点:
- 存储和读取速度更快;
- 占用空间更小。
缺点:
-
内容不可读;(有的redis客户端可以转成可读内容)
-
代码结构更复杂。
下面演示如何在 Java 和 Go 中使用 Protobuf 进行 Redis 数据序列化和反序列化。
1. 创建一个简单的 Web 项目
首先创建一个简单的 Web 项目,并在 Java 目录同级下创建 proto 目录。
2. 定义一个复杂的 User 结构
为了展示 Protobuf 序列化的性能,我们创建一个 user.proto 文件来定义一个复杂的 User 结构。这个文件是通用语言的文件,稍后可以在 Go 中使用。
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.haowen.protobuf.proto";
option java_outer_classname = "UserProto";
message User {
int64 id = 1; // 用户ID
string name = 2; // 用户名
string email = 3; // 邮箱
bool is_active = 4; // 用户是否激活
float account_balance = 5; // 账户余额
double rewards_points = 6; // 奖励积分
bytes avatar = 7; // 头像(二进制)
Address address = 8; // 地址(自定义类型)
repeated PhoneNumber phone_numbers = 9; // 电话号码列表(用户可以有多个电话号码)
}
message Address {
string street = 1; // 街道
string city = 2; // 城市
string state = 3; // 州/省
string country = 4; // 国家
string postal_code = 5; // 邮政编码
}
message PhoneNumber {
string number = 1; // 电话号码
Type phone_type = 2; // 电话类型
enum Type {
MOBILE = 0; // 移动电话
HOME = 1; // 住宅电话
WORK = 2; // 工作电话
}
}
// protoc --java_out=..