1 回答

TA貢獻1757條經(jīng)驗 獲得超7個贊
Memcached存儲單個item最大數(shù)據(jù)是在1MB內(nèi),如果數(shù)據(jù)超過1M,存取set和get是都是返回false,而且引起性能的問題。
我們之前對排行榜的數(shù)據(jù)進行緩存,由于排行榜在我們所有sql select查詢里面占了30%,而且我們排行榜每小時更新一次,所以必須對數(shù)據(jù)做緩存。為了清除緩存方便,把所有的用戶的數(shù)據(jù)放在同一key中,由于memcached:set的時候沒有壓縮數(shù)據(jù)。在測試服測試的時候,沒發(fā)現(xiàn)問題,當上線的時候,結(jié)果發(fā)現(xiàn),在線人數(shù)剛剛490人的時候,服務(wù)器load average飄到7.9。然后我們?nèi)サ艟彺妫幌伦泳拖陆档?.59。
所以Memcahce不適合緩存大數(shù)據(jù),超過1MB的數(shù)據(jù),可以考慮在客戶端壓縮或拆分到多個key中。大的數(shù)據(jù)在進行l(wèi)oad和uppack到內(nèi)存的時候需要花很長時間,從而降低服務(wù)器的性能。
Memcached支持最大的存儲對象為1M。這個值由其內(nèi)存分配機制決定的。
memcached默認情況下采用了名為Slab Allocator的機制分配、管理內(nèi)存。在該機制出現(xiàn)以前,內(nèi)存的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是,這種方式會導致內(nèi)存碎片,加重操作系統(tǒng)內(nèi)存管理器的負擔,最壞的情況下,會導致操作系統(tǒng)比memcached進程本身還慢。Slab Allocator就是為解決該問題而誕生的。Slab Allocator的基本原理是按照預先規(guī)定的大小,將分配的內(nèi)存分割成特定長度的塊,以完全解決內(nèi)存碎片問題.
今天(2012-03-16)我們重新測試了memcached ::set的數(shù)據(jù)大小??赡苁俏覀冇胮hp的memcached擴展是最新版,set數(shù)據(jù)的時候是默認壓縮的。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ù)的時候是默認壓縮的。由于這個這個是重復的字符串,壓縮率高達1000倍。因此100M的數(shù)據(jù)壓縮后實際也就100k而已。
當我設(shè)置:
$ac->setOption(memcahed::OPT_COMPRESSION,0); //不壓縮存儲數(shù)據(jù)。
$data = str_repeat('a', 1024* 1024); //1M數(shù)據(jù)
$r = $ac->set('key', $data, 9999);//1M的數(shù)據(jù)set不成功。
也就是說memcached server不能存儲超過1M的數(shù)據(jù),但是經(jīng)過客戶端壓縮數(shù)據(jù)后,只要小于1M的數(shù)據(jù)都能存儲成功。
memcached相關(guān)知識:
1、memcached的基本設(shè)置
1)啟動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選項是啟動一個守護進程,
-m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB,我這里是10MB,
-u是運行Memcache的用戶,我這里是root,
-l是監(jiān)聽的服務(wù)器IP地址,如果有多個地址的話,我這里指定了服務(wù)器的IP地址192.168.0.200,
-p是設(shè)置Memcache監(jiān)聽的端口,我這里設(shè)置了12000,最好是1024以上的端口,
-c選項是最大運行的并發(fā)連接數(shù),默認是1024,我這里設(shè)置了256,按照你服務(wù)器的負載量來設(shè)定,
-P是設(shè)置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid,
2)如果要結(jié)束Memcache進程,執(zhí)行:
# kill `cat /tmp/memcached.pid`
哈希算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式。如果散列一段明文而且哪怕只更改該
段落的一個字母,隨后的哈希都將產(chǎn)生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。
2、適用memcached的業(yè)務(wù)場景?
1)如果網(wǎng)站包含了訪問量很大的動態(tài)網(wǎng)頁,因而數(shù)據(jù)庫的負載將會很高。由于大部分數(shù)據(jù)庫請求都是讀操作,那么memcached可以顯著地減小數(shù)據(jù)庫負載。
2)如果數(shù)據(jù)庫服務(wù)
- 1 回答
- 0 關(guān)注
- 215 瀏覽
添加回答
舉報