MC支持的key的最大長度是250個(gè)字節(jié)魂贬,推薦使用使用較短的key栅炒,因?yàn)榭梢怨?jié)省內(nèi)存和帶寬三椿。支持的Value的最大上限為1M字節(jié)(具體可查看拙作MC不能寫入超過1M項(xiàng)實(shí)踐)庆械,但太大的對(duì)象沃疮,會(huì)占用較大的內(nèi)存和帶寬盒让,導(dǎo)致較小的QPS,所以通常情況下建議value的大小在10K以下為宜司蔬。這要求應(yīng)用在存儲(chǔ)數(shù)據(jù)的時(shí)候邑茄,需要更多地考慮數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),比如不存儲(chǔ)實(shí)際的業(yè)務(wù)數(shù)據(jù)俊啼,改為存儲(chǔ)索引數(shù)據(jù)等肺缕。
說明一點(diǎn),這里的value大小是針對(duì)用戶傳入MC時(shí)序列化以后的大小授帕,而不是在MC中實(shí)際存儲(chǔ)的value大小同木,因此業(yè)務(wù)方只需對(duì)傳入數(shù)據(jù)大小進(jìn)行預(yù)估即可。
那么當(dāng)所存的業(yè)務(wù)數(shù)據(jù)確實(shí)無法再精簡時(shí)跛十,要怎么處理已獲取更好的性能呢彤路?以下總結(jié)幾種常用的優(yōu)化方式:
1. 實(shí)現(xiàn)輕量級(jí)序列化方式
這種方式從根本上減小了value的大小,但是從實(shí)現(xiàn)角度上來說會(huì)復(fù)雜一些芥映,需要應(yīng)用方自己做序列化和反序列化洲尊。java客戶端對(duì)基本數(shù)據(jù)類型采用java默認(rèn)的序列化方式远豺,占用空間較大。因此可以選擇輕量級(jí)的數(shù)據(jù)存儲(chǔ)方式做序列化坞嘀,比如使用json或者google protocal buffer進(jìn)行序列化和反序列化躯护。序列化后,數(shù)據(jù)bytes[]數(shù)組丽涩,然后寫入MC棺滞。讀出時(shí),得到byte[]數(shù)組矢渊,然后再反序列化继准。
2. 拆分?jǐn)?shù)據(jù)
這種方式主要從業(yè)務(wù)邏輯上去考慮,對(duì)大value進(jìn)行拆分昆淡。假設(shè)一個(gè)key對(duì)應(yīng)了多項(xiàng)業(yè)務(wù)數(shù)據(jù)锰瘸,就可以把這個(gè)key拆分成多個(gè)key刽严。這里key的名稱可以通過加前綴來標(biāo)識(shí)昂灵。拆分后如果需要讀取這些數(shù)據(jù),可以用批量讀取接口完成(比如mget)舞萄。這樣拆分后雖然增多了網(wǎng)絡(luò)交互眨补,可以把key的訪問壓力分散到多臺(tái)機(jī)器上,總體性能上會(huì)優(yōu)于單key存儲(chǔ)倒脓。
如果這些數(shù)據(jù)不需要每次都全部取出的時(shí)候撑螺,也可以用prefix的方式存儲(chǔ),把業(yè)務(wù)數(shù)據(jù)分多類來存儲(chǔ)崎弃,但是一個(gè)prefix下所有數(shù)據(jù)都存儲(chǔ)在一臺(tái)機(jī)器上甘晤,壓力還是會(huì)集中在單機(jī)上。
3. 壓縮數(shù)據(jù)
在數(shù)據(jù)傳入MC之前饲做,先使用壓縮算法進(jìn)行數(shù)據(jù)壓縮线婚,減小數(shù)據(jù)大小。當(dāng)使用壓縮算法的方式時(shí)盆均,建議用戶可以先對(duì)數(shù)據(jù)進(jìn)行測試塞弊,避免用壓縮算法后反而增大了數(shù)據(jù)的大小。