采用protobuf下降redis的内存使用

     Redis的当前数据存储在内存中,因为内存并不象硬盘同样有着很大的空间,对于服务器来讲通常只会提供16G或32G内存。因此让Redis使用这些内存存储更多的数据是比较重要的。在使用redis的samples中通常都是使用string,而对象则用json方式来存储。但显然json所占用的空间是比较大的,在实际业务中通常对象成员都定义得比较长,而这些每每占用着不少空间;还有就是json对于数字的存储也是以字符方式表过,没法象二进制存储那样节省空间。 redis

    其实在对象写入redis的时候能够采用一些更节省空间对象序列化方式,这里推荐的是protobuf.主要这种序列化方式是以K-V的方式来序列化属性成员,能够节省大量属性名在josn下的开销。protobuf还使用了7bit方式来存储数值,在数据值存储上比起json有着更大的势优。 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 ui

     能够看到protobuf节省的空间仍是很是可观的,除了考虑节省空间还固然也须要考虑其通用性,在这方面protobuf也不会差于json,毕竟protobuf是google提出的产物大部分语言平台下都有其实现。 google

相关文章
相关标签/搜索