日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Memcache存储大数据的问题(大于1m)

發(fā)布時(shí)間:2024/10/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Memcache存储大数据的问题(大于1m) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Memcached存儲(chǔ)單個(gè)item最大數(shù)據(jù)是在1MB內(nèi),如果數(shù)據(jù)超過1M,存取set和get是都是返回false,而且引起性能的問題。

我們之前對(duì)排行榜的數(shù)據(jù)進(jìn)行緩存,由于排行榜在我們所有sql select查詢里面占了30%,而且我們排行榜每小時(shí)更新一次,所以必須對(duì)數(shù)據(jù)做緩存。為了清除緩存方便,把所有的用戶的數(shù)據(jù)放在同一key中,由于memcached:set的時(shí)候沒有壓縮數(shù)據(jù)。在測(cè)試服測(cè)試的時(shí)候,沒發(fā)現(xiàn)問題,當(dāng)上線的時(shí)候,結(jié)果發(fā)現(xiàn),在線人數(shù)剛剛490人的時(shí)候,服務(wù)器load average飄到7.9。然后我們?nèi)サ艟彺?#xff0c;一下子就下降到0.59。


所以Memcahce不適合緩存大數(shù)據(jù),超過1MB的數(shù)據(jù),可以考慮在客戶端壓縮或拆分到多個(gè)key中。大的數(shù)據(jù)在進(jìn)行l(wèi)oad和uppack到內(nèi)存的時(shí)候需要花很長(zhǎng)時(shí)間,從而降低服務(wù)器的性能。

Memcached支持最大的存儲(chǔ)對(duì)象為1M。這個(gè)值由其內(nèi)存分配機(jī)制決定的。

memcached默認(rèn)情況下采用了名為Slab Allocator的機(jī)制分配、管理內(nèi)存。在該機(jī)制出現(xiàn)以前,內(nèi)存的分配是通過對(duì)所有記錄簡(jiǎn)單地進(jìn)行malloc和free來進(jìn)行的。但是,這種方式會(huì)導(dǎo)致內(nèi)存碎片,加重操作系統(tǒng)內(nèi)存管理器的負(fù)擔(dān),最壞的情況下,會(huì)導(dǎo)致操作系統(tǒng)比memcached進(jìn)程本身還慢。Slab Allocator就是為解決該問題而誕生的。Slab Allocator的基本原理是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊,以完全解決內(nèi)存碎片問題.

今天(2012-03-16)我們重新測(cè)試了memcached ::set的數(shù)據(jù)大小??赡苁俏覀冇胮hp的memcached擴(kuò)展是最新版,set數(shù)據(jù)的時(shí)候是默認(rèn)壓縮的。set 數(shù)據(jù):

$ac?=?new?memcahed();??
$data?=?str_repeat('a',?1024*?1024);?//1M的數(shù)據(jù)??
$r??=??$ac->set('key',?$data,?9999);??
//或者??
$data?=?str_repeat('a',?1024*?1024*100);//100M的數(shù)據(jù)??
$r??=??$ac->set('key',?$data,?9999);??
不論是1M的數(shù)據(jù)還是100M的數(shù)據(jù),都能set成功。后來我發(fā)現(xiàn),memcachedset數(shù)據(jù)的時(shí)候是默認(rèn)壓縮的。由于這個(gè)這個(gè)是重復(fù)的字符串,壓縮率高達(dá)1000倍。因此100M的數(shù)據(jù)壓縮后實(shí)際也就100k而已。

當(dāng)我設(shè)置:

$ac->setOption(memcahed::OPT_COMPRESSION,0);?//不壓縮存儲(chǔ)數(shù)據(jù)。??
$data?=?str_repeat('a',?1024*?1024);?//1M數(shù)據(jù)??
$r??=??$ac->set('key',?$data,?9999);//1M的數(shù)據(jù)set不成功。??
也就是說memcached server不能存儲(chǔ)超過1M的數(shù)據(jù),但是經(jīng)過客戶端壓縮數(shù)據(jù)后,只要小于1M的數(shù)據(jù)都能存儲(chǔ)成功。

memcached相關(guān)知識(shí):

1、memcached的基本設(shè)置
1)啟動(dòng)Memcache的服務(wù)器端
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d選項(xiàng)是啟動(dòng)一個(gè)守護(hù)進(jìn)程,
-m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB,我這里是10MB,
-u是運(yùn)行Memcache的用戶,我這里是root,
-l是監(jiān)聽的服務(wù)器IP地址,如果有多個(gè)地址的話,我這里指定了服務(wù)器的IP地址192.168.0.200,
-p是設(shè)置Memcache監(jiān)聽的端口,我這里設(shè)置了12000,最好是1024以上的端口,
-c選項(xiàng)是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024,我這里設(shè)置了256,按照你服務(wù)器的負(fù)載量來設(shè)定,
-P是設(shè)置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid,

2)如果要結(jié)束Memcache進(jìn)程,執(zhí)行:

# kill `cat /tmp/memcached.pid`

哈希算法將任意長(zhǎng)度的二進(jìn)制值映射為固定長(zhǎng)度的較小二進(jìn)制值,這個(gè)小的二進(jìn)制值稱為哈希值。哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式。如果散列一段明文而且哪怕只更改該

段落的一個(gè)字母,隨后的哈希都將產(chǎn)生不同的值。要找到散列為同一個(gè)值的兩個(gè)不同的輸入,在計(jì)算上是不可能的。

2、適用memcached的業(yè)務(wù)場(chǎng)景?

1)如果網(wǎng)站包含了訪問量很大的動(dòng)態(tài)網(wǎng)頁(yè),因而數(shù)據(jù)庫(kù)的負(fù)載將會(huì)很高。由于大部分?jǐn)?shù)據(jù)庫(kù)請(qǐng)求都是讀操作,那么memcached可以顯著地減小數(shù)據(jù)庫(kù)負(fù)載。

2)如果數(shù)據(jù)庫(kù)服務(wù)器的負(fù)載比較低但CPU使用率很高,這時(shí)可以緩存計(jì)算好的結(jié)果( computed objects )和渲染后的網(wǎng)頁(yè)模板(enderred templates)。

3)利用memcached可以緩存session數(shù)據(jù)、臨時(shí)數(shù)據(jù)以減少對(duì)他們的數(shù)據(jù)庫(kù)寫操作。

4)緩存一些很小但是被頻繁訪問的文件。

5)緩存Web 'services'(非IBM宣揚(yáng)的Web Services,譯者注)或RSS feeds的結(jié)果.。

3、不適用memcached的業(yè)務(wù)場(chǎng)景?

1)緩存對(duì)象的大小大于1MB

Memcached本身就不是為了處理龐大的多媒體(large media)和巨大的二進(jìn)制塊(streaming huge blobs)而設(shè)計(jì)的。

2)key的長(zhǎng)度大于250字符

3)虛擬主機(jī)不讓運(yùn)行memcached服務(wù)

???? 如果應(yīng)用本身托管在低端的虛擬私有服務(wù)器上,像vmware, xen這類虛擬化技術(shù)并不適合運(yùn)行memcached。Memcached需要接管和控制大塊的內(nèi)存,如果memcached管理 ? ? ?的內(nèi)存被OS或 hypervisor交換出去,memcached的性能將大打折扣。

4)應(yīng)用運(yùn)行在不安全的環(huán)境中

Memcached為提供任何安全策略,僅僅通過telnet就可以訪問到memcached。如果應(yīng)用運(yùn)行在共享的系統(tǒng)上,需要著重考慮安全問題。

5)業(yè)務(wù)本身需要的是持久化數(shù)據(jù)或者說需要的應(yīng)該是database

4、 不能能夠遍歷memcached中所有的item

? ? ?這個(gè)操作的速度相對(duì)緩慢且阻塞其他的操作(這里的緩慢時(shí)相比memcached其他的命令)。memcached所有非調(diào)試(non-debug)命令,例如add, set, get, fulsh等無論

memcached中存儲(chǔ)了多少數(shù)據(jù),它們的執(zhí)行都只消耗常量時(shí)間。任何遍歷所有item的命令執(zhí)行所消耗的時(shí)間,將隨著memcached中數(shù)據(jù)量的增加而增加。當(dāng)其他命令因?yàn)榈却?#xff08;遍歷所有item的命令執(zhí)行完畢)而不能得到執(zhí)行,因而阻塞將發(fā)生。

5、 ?memcached能接受的key的最大長(zhǎng)度是250個(gè)字符
memcached能接受的key的最大長(zhǎng)度是250個(gè)字符。需要注意的是,250是memcached服務(wù)器端內(nèi)部的限制。如果使用的Memcached客戶端支持"key的前綴"或類似特性,那么key(前綴+原始key)的最大長(zhǎng)度是可以超過250個(gè)字符的。推薦使用較短的key,這樣可以節(jié)省內(nèi)存和帶寬。

6、 ?單個(gè)item的大小被限制在1M byte之內(nèi)
因?yàn)閮?nèi)存分配器的算法就是這樣的。

詳細(xì)的回答:

1)Memcached的內(nèi)存存儲(chǔ)引擎,使用slabs來管理內(nèi)存。內(nèi)存被分成大小不等的slabs chunks(先分成大小相等的slabs,然后每個(gè)slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次從一個(gè)最小數(shù)開始,按某個(gè)因子增長(zhǎng),直到達(dá)到最大的可能值。如果最小值為400B,最大值是1MB,因子是1.20,各個(gè)slab的chunk的大小依次是:

slab1 - 400B;slab2 - 480B;slab3 - 576B ...slab中chunk越大,它和前面的slab之間的間隙就越大。因此,最大值越大,內(nèi)存利用率越低。Memcached必須為每個(gè)slab預(yù)先分配內(nèi)存,因此如果設(shè)置了較小的因子和較大的最大值,會(huì)需要為Memcached提供更多的內(nèi)存。

2)不要嘗試向memcached中存取很大的數(shù)據(jù),例如把巨大的網(wǎng)頁(yè)放到mencached中。因?yàn)閷⒋髷?shù)據(jù)load和unpack到內(nèi)存中需要花費(fèi)很長(zhǎng)的時(shí)間,從而導(dǎo)致系統(tǒng)的性能反而不好。如果確實(shí)需要存儲(chǔ)大于1MB的數(shù)據(jù),可以修改slabs.c:POWER_BLOCK的值,然后重新編譯memcached;或者使用低效的malloc/free。另外,可以使用數(shù)據(jù)庫(kù)、MogileFS等方案代替Memcached系統(tǒng)。

7、 ?memcached的內(nèi)存分配器是如何工作的?為什么不適用malloc/free!?為何要使用slabs?
實(shí)際上,這是一個(gè)編譯時(shí)選項(xiàng)。默認(rèn)會(huì)使用內(nèi)部的slab分配器,而且確實(shí)應(yīng)該使用內(nèi)建的slab分配器。最早的時(shí)候,memcached只使用malloc/free來管理內(nèi)存。然而,這種方式不能與OS的內(nèi)存管理以前很好地工作。反復(fù)地malloc/free造成了內(nèi)存碎片,OS最終花費(fèi)大量的時(shí)間去查找連續(xù)的內(nèi)存塊來滿足malloc的請(qǐng)求,而不是運(yùn)行memcached進(jìn)程。slab分配器就是為了解決這個(gè)問題而生的。內(nèi)存被分配并劃分成chunks,一直被重復(fù)使用。因?yàn)閮?nèi)存被劃分成大小不等的slabs,如果item的大小與被選擇存放它的slab不是很合適的話,就會(huì)浪費(fèi)一些內(nèi)存。

8、memcached對(duì)item的過期時(shí)間有什么限制?

item對(duì)象的過期時(shí)間最長(zhǎng)可以達(dá)到30天。memcached把傳入的過期時(shí)間(時(shí)間段)解釋成時(shí)間點(diǎn)后,一旦到了這個(gè)時(shí)間點(diǎn),memcached就把item置為失效狀態(tài),這是一個(gè)簡(jiǎn)單但obscure的機(jī)制。

9、什么是二進(jìn)制協(xié)議,是否需要關(guān)注?

二進(jìn)制協(xié)議嘗試為端提供一個(gè)更有效的、可靠的協(xié)議,減少客戶端/服務(wù)器端因處理協(xié)議而產(chǎn)生的CPU時(shí)間。根據(jù)Facebook的測(cè)試,解析ASCII協(xié)議是memcached中消耗CPU時(shí)間最多的

環(huán)節(jié)。

10、 memcached的內(nèi)存分配器是如何工作的?為什么不適用malloc/free!?為何要使用slabs?

實(shí)際上,這是一個(gè)編譯時(shí)選項(xiàng)。默認(rèn)會(huì)使用內(nèi)部的slab分配器,而且確實(shí)應(yīng)該使用內(nèi)建的slab分配器。最早的時(shí)候,memcached只使用malloc/free來管理內(nèi)存。然而,這種方式不能與OS的內(nèi)存管理以前很好地工作。反復(fù)地malloc/free造成了內(nèi)存碎片,OS最終花費(fèi)大量的時(shí)間去查找連續(xù)的內(nèi)存塊來滿足malloc的請(qǐng)求,而不是運(yùn)行memcached進(jìn)程。slab分配器就是為了解決這個(gè)問題而生的。內(nèi)存被分配并劃分成chunks,一直被重復(fù)使用。因?yàn)閮?nèi)存被劃分成大小不等的slabs,如果item的大小與被選擇存放它的slab不是很合適的話,就會(huì)浪費(fèi)一些內(nèi)存。

11、memcached是原子的嗎?

所有的被發(fā)送到memcached的單個(gè)命令是完全原子的。如果您針對(duì)同一份數(shù)據(jù)同時(shí)發(fā)送了一個(gè)set命令和一個(gè)get命令,它們不會(huì)影響對(duì)方。它們將被串行化、先后執(zhí)行。即使在多線程模式,所有的命令都是原子的。然是,命令序列不是原子的。如果首先通過get命令獲取了一個(gè)item,修改了它,然后再把它set回memcached,系統(tǒng)不保證這個(gè)item沒有被其他進(jìn)程(process,未必是操作系統(tǒng)中的進(jìn)程)操作過。memcached 1.2.5以及更高版本,提供了gets和cas命令,它們可以解決上面的問題。如果使用gets命令查詢某個(gè)key的item,memcached會(huì)返回該item當(dāng)前值的唯一標(biāo)識(shí)。如果客戶端程序覆寫了這個(gè)item并想把它寫回到memcached中,可以通過cas命令把那個(gè)唯一標(biāo)識(shí)一起發(fā)送給memcached。如果該item存放在memcached中的唯一標(biāo)識(shí)與您提供的一致,寫操作將會(huì)成功。如果另一個(gè)進(jìn)程在這期間也修改了這個(gè)item,那么該item存放在memcached中的唯一標(biāo)識(shí)將會(huì)改變,寫操作就會(huì)失敗。
---------------------
作者:fredy_yang
來源:CSDN
原文:https://blog.csdn.net/u011386690/article/details/9316545?utm_source=copy
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

轉(zhuǎn)載于:https://www.cnblogs.com/ExMan/p/9800814.html

總結(jié)

以上是生活随笔為你收集整理的Memcache存储大数据的问题(大于1m)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 农村村妇真实偷人视频 | 国产午夜视频在线 | 嫩草影院在线观看视频 | 黄色免费网站在线 | 毛片毛片毛片毛片 | 久久精品国产露脸对白 | 久久人人爽人人人人片 | 国产aaa级片| 男女啪啪软件 | 久久偷看各类女兵18女厕嘘嘘 | yy111122少妇光屁股影院 | 奇米四色7777 | 亚洲激情网 | 国产精品乱码久久久久 | 91丝袜国产在线播放 | 色播综合网| 色婷婷在线播放 | 中文字幕免费一区 | 欧美综合亚洲图片综合区 | 国产黄色91 | 欧美一级鲁丝片 | 亚洲第一天堂久久 | 久久精品网 | 青娱乐最新地址 | 国产成人精品综合久久久久99 | 大陆女明星乱淫合集 | 中文字幕国产专区 | 扶她futa粗大做到怀孕 | 国产观看 | 中文字幕欧美人妻精品 | 老司机在线永久免费观看 | 欧美视频福利 | 国产免费自拍 | 91网站永久免费看nba视频 | 精品国产a线一区二区三区东京热 | 久久久国产精品免费 | 亚洲欧美日韩精品一区 | 国产不卡视频在线观看 | 抽插丰满内射高潮视频 | 91桃色免费视频 | 已满十八岁免费观看全集动漫 | 超污巨黄的小短文 | 国产男女无遮挡猛进猛出 | 国产露出视频 | 蜜臀国产AV天堂久久无码蜜臀 | 日韩无码精品一区二区三区 | 中文字幕看片 | 五月色婷 | 白丝校花扒腿让我c | 成人精品久久久 | 国产精品免费电影 | 海量av | 蜜桃av噜噜一区二区三区网址 | 日本加勒比一区二区 | 成人免费va视频 | 黄频在线| 国产精品久久久久久久久动漫 | 日本一区二区欧美 | 国产精品久久久久久久久久免费看 | 老司机在线永久免费观看 | 三年中文免费观看大全动漫 | 欧美怡红院视频 | 日本免费网址 | 叶山小百合av一区二区 | 亚洲一区二区三区蜜桃 | 久久99精品久久久久久园产越南 | 手机看片久久 | 久久97久久97精品免视看 | 中文在线观看视频 | 综合精品久久久 | 日韩五码电影 | 中文字幕乱码亚洲无线三区 | 亚洲欧美一区二区三区 | 日本精品视频在线观看 | 亚洲国产综合av | 动漫av一区二区三区 | 国产视频亚洲 | 精品深夜av无码一区二区老年 | 国产激情网| 蜜桃av成人永久免费 | 一级性生活毛片 | 91久久精品国产91性色tv | 91视频你懂的 | 国产人成在线观看 | 日韩一区二区三区在线看 | 体内精69xxxxx | 中文精品视频 | 婷婷免费| 国产一二三 | 成片免费观看视频 | 伊人久久成人 | 亚洲人一区二区三区 | 欧美大片免费播放器 | 国产成人精品片 | 久久久综合视频 | 欧美性猛交xxxx乱大交hd | 涩涩视频网站 | 国产精品swag| 91精品视频免费在线观看 |