使用memcache 心得和注意事項

2022-07-19 01:27:12 字數 2519 閱讀 1923

記憶體分配機制:首先要說明的是memcached支援最大的儲存物件為1m。它的記憶體分配比較特殊,但是這樣的分配方式其實也是對於效能考慮的,簡單的分配機制可以更容易**再分配,節省對於cpu的使用。這裡用乙個酒窖比喻來說明這種記憶體分配機制,首先在memcached起來的時候可以通過引數設定使用的總共的memory,當你第一次往memcached儲存資料時, memcached會去申請1mb的記憶體, 把該塊記憶體稱為乙個slab, 也稱為乙個page, 如果可以儲存這個資料的最佳的chunk大小為128b,那麼memcached會把剛申請的slab以128b為單位進行分割成8192塊. 當這頁slab的所有chunk都被用完時,並且繼續有資料需要儲存在128b的chunk裡面時,如果已經申請的記憶體小於最大可申請記憶體10mb 時,memcached繼續去申請1m記憶體,繼續以128b為單位進行分割再進行儲存;如果已經無法繼續申請記憶體,那麼memcached會先根據lru 演算法把佇列裡面最久沒有被使用到的chunk進行釋放後,再將該chunk用於儲存. 這個就是建造乙個酒窖,然後在有酒進入的時候,首先申請(通常是1m)的空間,用來建酒架,酒架根據這個酒瓶的大小分割酒架為多個小格仔安放酒瓶,將同樣大小範圍內的酒瓶都放置在一類酒架上面。例如20cm半徑的酒瓶放置在可以容納20-25cm的酒架a上,30cm半徑的酒瓶就放置在容納25-30cm的酒架b上。**機制也很簡單,首先新酒入庫,看看酒架是否有可以**的地方,如果有直接使用,如果沒有申請新的地方,如果申請不到,採用配置的過期策略。這個特點來看,如果要放的內容大小十分離散,同時大小比例相差梯度很明顯,那麼可能對於使用空間來說不好,可能在酒架a上就放了一瓶酒,但占用掉了乙個酒架的位置。

為了避免使用memcached時出現異常, 使用memcached的專案需要注意:

1. 不能往memcached儲存乙個大於1mb的資料.

2. 往memcached儲存的所有資料,如果資料的大小分布於各種chunk大小區間,從64b到1mb都有,可能會造成記憶體的極大浪費以及memcached的異常.

優化可以從以下幾個方面進行:

1. 命中率.

對於快取服務而言,命中率是至關重要的.命中率的提公升可以通過多種方案實現.其一,提高服務獲取的記憶體總量.這無疑是增加命中的最直接的辦法,將快取資料完全放入資料池中.只要連線不失效,就一定命中.其二,提高空間利用率,這實際上也是另一種方式的增加記憶體總量.具體實現在下乙個方面給出.其三,對於一些很特別的memcache應用,可以採用多個memcache服務進行偵聽,分開處理,針對服務提供的頻繁度劃分服務記憶體,相當於在應用一級別上再來一次lru.其四,對於整體命中率,可以採取有效的冗餘策略,減少分布式服務時某個server發生服務抖動的情況.如,14臺機器實現分布式memcache,劃分兩組服務,其中一組13臺做乙個分布式的memcache,一組1臺做整個的memcache備份.對於update操作,需要進行兩邊,get操作只需要一遍,一旦訪問失效,則訪問備份伺服器.這樣,對於備份伺服器需要記憶體比較大,而且只適應於讀操作大於寫操作的應用中.這可以認為是raid3,當然,也可以採用raid1完全映象.

2. 空間利用率.

對於使用memcache做定長資料快取服務而言,是可以在空間利用率上進行優化.甚至最簡單的辦法可以不用更改memcache的原始碼遍可以完成由-f和-n引數的配合可以做到定長優化,不過極可能需要浪費掉預分配的199m記憶體空間.當然前提是memcache的版本是1.2,同時如果使用的是1.2.0和1.2.1的話,需要更改掉乙個bug,那就是getopt時將opt串中最後乙個」s」改成」n」,希望memcache能在以後的版本發現這個bug.例如,如果key是乙個定長id(如乙個8位的流水號00000001),value是乙個定長的串(如16位的任意字串),對應於乙個chunk_size可以這麼計算:chunk_size = sizeof(item) + nkey + nsuffix + nbytes = 32 + 8 + (flag長度 + (16 - 2)的長度 + 2) + 16 = 40 + 5 + 16 = 61,那麼可以通過-f 1.000001 -n 61來啟動memcache.這種情況下,會浪費掉memcache預先分配的200m空間中的199m.從第2個預分配等級到第200個預分配等級將不會用到.然而,存在解決辦法,那就是在編譯memcache是加入編譯引數-ddont_prealloc_slabs,或者在源**中加入#define dont_prealloc_slabs即可,只是會去除memcache的預分配記憶體機制.

4. 安全效能.

memcache還存在乙個比較顯著的問題,那就是其安全效能.只要了解memcache監聽的埠,對於能夠使用分布式memcache進行資料通訊的網路環境的機器,都可以通過memcache協議於memcache伺服器進行通訊,獲取或種植資料.不能保證種植進記憶體裡的資料不會被別有心意的人再利用.也不能保證伺服器的記憶體不被漫天遍地的垃圾資料所堆積,造成命中極低.

memcache的設計理念在乙個輕字,如果對每次client的通訊需要校驗身份,那麼恐怕memcache也就達不到其想要的效果了.存在解決辦法緩解這個問題,一般而言,需要使用memcache服務的機器,可以在server維持一張紅色列表.這張表上的機器便可以獲取服務.很顯然,memcache並非任意client都能訪問,只有信任的機器訪問,那麼為什麼不將這些信任的機器放在乙個/etc/mem_passwd下呢.

Memcache 配置和使用

1,ubuntu下配置 memcached 2,memcache使用方法 1 安裝memcache客戶端 php5為示例 sudo apt get install php5 memcache 安裝完以後我們需要在php.ini裡進行簡單的配置,開啟 etc php5 apache2 php.ini檔...

memcache 安裝 注意事項

本人實驗目標機器 sun unix 預設使用的編譯器為cc 使用此預設編譯器並不成功,需改為gcc 1.安裝memcache之前需要安裝libevent庫。注意需要安裝對應支援的版本。我使用的是兩個分別是 2.安裝 libevent的步驟 tar zxvf libevent 1.4.9 stable...

小白談memcache和memcached的區別

用了段時間的memcache和memcached總結下認識,看很多人在用cache的時候,剛剛都沒有搞清楚memcache和memcached的區別,還有就是使用的時候基本都是 get set 用了memcached之後其實可以發現getmulti setmulti 是多麼好用,這篇寫個那些剛剛使用...