Redis的当前数据存储在内存中,由于内存并不象硬盘一样有着很大的空间,对于服务器来说一般只会提供16G或32G内存。所以让Redis使用这些内存存储更多的数据是比较重要的。在使用redis的samples中一般都是使用string,而对象则用json方式来存储。但显然json所占用的空间是比较大的,在实际业务中一般对象成员都定义得比较长,而这些往往占用着很多空间;还有就是json对于数字的存储也是以字符方式表过,无法象二进制存储那样节省空间。
其实在对象写入redis的时候可以采用一些更节省空间对象序列化方式,这里推荐的是protobuf.主要这种序列化方式是以K-V的方式来序列化属性成员,可以节省大量属性名在josn下的开销。protobuf还使用了7bit方式来存储数值,在数据值存储上比起json有着更大的势优。
到底protobuf在一般情况下会比json节省多少空间呢,以一个Order对象为例:
[ProtoContract]
public class Order
{
[ProtoMember(1)]
public int OrderID { get; set; }
[ProtoMember(2)]
public string CustomerID { get; set; }
[ProtoMember(3)]
public int EmployeeID { get; set; }
[ProtoMember(4)]
public DateTime OrderDate { get; set; }
[ProtoMember(5)]
public DateTime RequiredDate { get; set; }
[ProtoMember(6)]
public DateTime ShippedDate { get; set; }
[ProtoMember(7)]
public int ShipVia { get; set; }
[ProtoMember(8)]
public double Freight { get;set;}
[ProtoMember(9)]
public string ShipName { get; set; }
[ProtoMember(10)]
public string ShipAddress { get; set; }
[ProtoMember(11)]
public string ShipCity { get; set; }
[ProtoMember(12)]
public string ShipPostalCode { get; set; }
[ProtoMember(13)]
public string ShipCountry { get; set; }
}
830条记录
Json序列化的长度:270693
protobuf序列化长度:88867
可以看到protobuf节省的空间还是非常可观的,除了考虑节省空间还当然也需要考虑其通用性,在这方面protobuf也不会差于json,毕竟protobuf是google提出的产物大部分语言平台下都有其实现。