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