memcached介紹以及安裝

    今天學習瞭解到非關係型數據庫NoSQL。對於NoSQL想必大家也有所瞭解,不瞭解的可以上網搜一下其基本原理以及相對關係型數據庫有哪些優勢,在這裏我就不多說了。在接下來的幾篇文章中我會簡單講一下memcached、redis以及MongoDB的安裝及相關配置,相關文件內容都是我學習時從網上尋找的資料整理而成,希望能幫助有需要的人省去查找資料的時間,也歡迎大家評論留言互相指正互相學習。

    常見的Nosql數據庫有:

鍵值(Key-Value)數據庫  :redis、memcached、riak
面向文檔(Document-Oriented)數據庫  :MongoDB、CouchDB、RavenDB
列存儲(Wide Column Store/Column-Family)數據庫  :Cassandra、HBase
圖(Graph-Oriented)數據庫  :Neo4J、Infinite Graph、OrientDB


在這裏我先簡單介紹一下memcached。

memcached
是國外社區網站LiveJournal團隊開發,通過緩存數據庫查詢結果,減少數據庫訪問次數,從而提高動態web站點性能。官方站點 http://memcached.org/

memcached運行流程圖

memcached特點
基於C/S架構,協議簡單
基於libevent 的事件處理
自主內存存儲處理
存儲方式爲slab allocation   
Slab Allocation的原理——將分配的內存分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱爲slab。
Memcached的內存分配以Page爲單位,Page默認值爲1M,可以在啓動時通過-I參數來指定。
Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。其結構圖如下:
  

Growth Factor
memcached在啓動時通過-f選項可以指定 Growth Factor因子。該值控制slab之間的差異,chunk大小的差異。默認值爲1.25。


Slab Allocation的缺點:
Slab Allocation可以有效的解決內存碎片問題,但是在如下情況下,會導致內存的浪費:
每個slab的chunk大小是固定的,當item的佔用空間實際小於chunk大小時,會出現內存浪費
每個slab的大小是固定的(因爲page是固定的),當slab不能被他所擁有的chunk整除時,會出現內存浪費
按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用時,會出現內存浪費

通過memcache添加tem的時候:
1.Memcache計算item的大小(key+value+flags),選取合適的slab(剛好能放下該item的slab)
2.如果這個item對應的slab未出現過,則申請1個page(注意,這1M空間不論是否達到memcached使用內存都可以申請成功)並加該item存入slab中的chunk
3.如果item對應的slab出現過,則在該slab中優先選擇expired(free_chunks)和delete(在1.2.2中delete的chunk存在着不能被重複利用的問題)的chunk進行存儲,其次將選擇未使用過的chunk(free_chunks_end)進行存儲。</p>
4.如果item對應的slab出現過,但是對應的slab已經存儲滿了,那麼會申請一個新的page,這個page被分爲對應大小的chunk,繼續存儲。
5. 如果item對應的slab出現過,但是對應的slab已經存儲滿了並且memcache也達到了最大內存使用。將使用lru算法,清除item(可能將未過期的item清除)此時會有eviction++

數據過期方式:
Lazy Expiration 
memcached 內部不會監視記錄是否過期,而是在get時查看記錄的時間戳,檢查記錄是否過期。這種技術被稱爲lazy(惰性)expiration。因此,memcached不會在過期監視上耗費CPU時間。
LRU
memcached會優先使用已超時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名爲Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除“最近最少使用”的記錄的機制。因此,當內存空間不足時(無法從slab class slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。


適用memcached的業務場景:

1)如果網站包含了訪問量很大的動態網頁,因而數據庫的負載將會很高。由於大部分數據庫請求都是讀操作,那麼memcached可以顯著地減小數據庫負載。

2)如果數據庫服務器的負載比較低但CPU使用率很高,這時可以緩存計算好的結果( computed objects )和渲染後的網頁模板(enderred templates)。

3)利用memcached可以緩存session數據、臨時數據以減少對他們的數據庫寫操作。

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

5)緩存Web ‘services’(非IBM宣揚的Web Services,譯者注)或RSS feeds的結果.。


不適用memcached的業務場景:

1)緩存對象的大小大於1MB

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

2)key的長度大於250字符

3)虛擬主機不讓運行memcached服務

如果應用本身託管在低端的虛擬私有服務器上,像vmware, xen這類虛擬化技術並不適合運行memcached。Memcached需要接管和控制大塊的內存,如果memcached管理的內存被OS或 hypervisor交換出去,memcached的性能將大打折扣。

4)應用運行在不安全的環境中

Memcached爲提供任何安全策略,僅僅通過telnet就可以訪問到memcached。如果應用運行在共享的系統上,需要着重考慮安全問題。

5)業務本身需要的是持久化數據或者說需要的應該是database


接下來就是安裝memcached,在這裏我用yum安裝,在後面的redis我用源碼包安裝。

yum install -y libevent  memcached  libmemcached 

啓動:
/etc/init.d/memcached start
查看進程:
ps aux |grep memcached

查看memcached運行狀態
memcached-tool 127.0.0.1:11211  stats


默認監聽127.0.0.1:11211,默認使用內存64M,我們也可以調節 /etc/sysconfig/memcached這個文件中的一些參數

-d選項是啓動一個守護進程
-m是分配給Memcache使用的內存數量,單位是MB,這裏是200MB 
-u是運行Memcache的用戶,如果當前爲 root 的話,需要使用此參數指定用戶。 
-l是監聽的服務器IP地址 
-p是設置Memcache監聽的端口,默認是11211 
-c選項是最大運行的併發連接數,默認是1024 
-P是設置保存Memcache的pid文件 

命令行用法:
telnet  127.0.0.1 11211

set key1 0 60 3     //設置key1鍵,0是標識位,60表示過期時間爲60秒,3表示value爲3字節
abc
STORED
get key1
VALUE key1 0 3
abc
END

語法規則  
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
注:\r\n表示回車
a) <command name> 可以是”set”, “add”, “replace”,“delete”。
“set”表示按照相應的<key>存儲該數據,沒有的時候增加,有的覆蓋。
“add”表示按照相應的<key>添加該數據,但是如果該<key>已經存在則會操作失敗。
“replace”表示按照相應的<key>替換數據,但是如果該<key>不存在則操作失敗。

“delete”會刪除一個key值。
b) <key> 客戶端需要保存數據的key。
c) <flags> 是一個16位的無符號的整數(以十進制的方式表示)。
該標誌將和需要存儲的數據一起存儲,並在客戶端get數據時返回。
客戶可以將此標誌用做特殊用途,此標誌對服務器來說是不透明的。
d) <exptime> 過期的時間。
若爲0表示存儲的數據永遠不過時(但可被服務器算法:LRU 等替換)。
如果非0(unix時間或者距離此時的秒數),當過期後,服務器可以保證用戶得不到該數據(以服務器時間爲標準)。
e) <bytes> 需要存儲的字節數,當用戶希望存儲空數據時<bytes>可以爲0
f) <data block>需要存儲的內容,輸入完成後,最後客戶端需要加上”\r\n”(windows直接點擊Enter)作爲”命令頭”的結束標誌。


下一篇文章會講解php結合memcached。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章