如何處理MC kv數(shù)據(jù)過大的情況

MC支持的key的最大長(zhǎng)度是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í)無法再精簡(jiǎn)時(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)行測(cè)試,避免用壓縮算法后反而增大了數(shù)據(jù)的大小。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,246評(píng)論 8 265
  • 1、 性能調(diào)優(yōu) 1.1、 分配更多資源 1.1.1、分配哪些資源? Executor的數(shù)量 每個(gè)Executor所...
    Frank_8942閱讀 4,843評(píng)論 2 36
  • 1、memcache的概念? Memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,360評(píng)論 2 12
  • activity如何傳遞數(shù)據(jù): 打印出來的結(jié)果: 這是不是就是安卓清單文件定義的: 我們繼續(xù)添加第二個(gè)Activi...
    木頭石頭錘子閱讀 129評(píng)論 0 0

友情鏈接更多精彩內(nèi)容