採用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

相關文章
相關標籤/搜索