Key/Value之王Memcached初探:1、掀起Memcached的蓋頭來

1、Memcached是何方神聖?

Memcached

  在數據驅動的Web開發中,常常要重複從數據庫中取出相同的數據,這種重複極大的增長了數據庫負載。緩存是解決這個問題的好辦法。可是ASP.NET中的HttpRuntime.Cache雖然已經能夠實現對頁面局部進行緩存,但仍是不夠靈活,此時Memcached或許是你想要的。html

  Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。通過多年的發展,目前已經有不少知名的互聯網應用使用到了Memcached,好比:Wikipedia、Flickr、Youtube、Wordpress等等。算法

2、爲何要使用Memcached?

memcached   

  上圖展現了Memcached的通常性用途:分佈式緩存。當瀏覽器首次請求訪問數據時,應用服務器會先從數據庫服務器中取得返回給用戶,並將其以Key/Value鍵值對的形式存入Memcached服務器中。當用戶第二次訪問上次請求的數據時,應用服務器經過在Memcached服務器中查找是否有緩存,若是有則直接從Memcached中讀取。因爲Memcached服務器是部署在網站機房內網中的,並且數據時存儲在服務器的內存空間中的,因此訪問速度比數據庫的磁盤IO要快一些,也就提升了服務響應速度,而且在高峯時間減輕了數據庫服務器的負載壓力。數據庫

  (1)Memcached做爲高速運行的分佈式緩存服務器,具備如下的特色:瀏覽器

  • 協議簡單:使用簡單的基於文本行的協議,沒有使用複雜的XML協議。所以,經過telnet也能在memcached上保存數據、取得數據;
  • 基於libevent的事件處理:memcached使用這個libevent庫,所以能在Linux、BSD、Solaris等操做系統上發揮其高性能;
libevent是個程序庫,它將Linux的epoll、BSD類操做系統的kqueue等事件處理功能 封裝成統一的接口。即便對服務器的鏈接數增長,也能發揮O(1)的性能。

libevent: http://www.monkey.org/~provos/libevent/緩存

  • 內置內存存儲方式:爲了提升性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中;

因爲數據僅存在於內存中,所以重啓memcached、重啓操做系統會致使所有數據消失。 另外,內容容量達到指定值以後,就基於LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached自己是爲緩存而設計的服務器,所以並無過多考慮數據的永久性問題服務器

NoSQL中比較優秀的一款產品:Redis,比較好地解決了數據持久化的這個問題,重啓Redis不會致使數據丟失。分佈式

  • 不互相通訊的分佈式:儘管是「分佈式」緩存服務器,但服務器端並無分佈式功能,這徹底取決於客戶端的實現。咱們會很驚奇的發現memcached的集羣很是easy,簡單得甚至只須要在客戶端的配置文件中添加服務器IP與端口號;換句話說,咱們的應用程序只須要將數據請求給memcached客戶端,在memcached客戶端中會經過一個分佈式算法(一致性Hash算法)從memcached服務器列表中計算一個memcached服務器的地址(若是是讀請求,則根據Key在分佈式算法中獲得緩存有該Key的memcached服務器信息),而後客戶端將數據(Key/Value對)傳遞給計算出來的memcached服務器(若是是讀請求,則從計算出來的memcached服務器中讀取含有指定Key的數據);

memcachedcluster  

PS:正由於memcached緩存服務器之間互不通訊,於是集羣規模能夠輕易地擴容,具備良好的伸縮性memcached

  (2)Memcached與Redis的對比性能

  ①沒有必要過多的關心性能,由於兩者的性能都已經足夠高了。因爲Redis只使用單核,而Memcached可使用多核,因此在比較上,平均每個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,可是比起Memcached,仍是稍有遜色。說了這麼多,結論是,不管你使用哪個,每秒處理請求的次數都不會成爲瓶頸。(好比瓶頸可能會在網卡)學習

  ②若是要說內存使用效率,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而若是Redis採用hash結構來作key-value存儲,因爲其組合式的壓縮,其內存利用率會高於Memcached。固然,這和你的應用場景和數據特性有關。

  ③若是你對數據持久化和數據同步有所要求,那麼推薦你選擇Redis,由於這兩個特性Memcached都不具有。即便你只是但願在升級或者重啓系統後緩存數據不會丟失,選擇Redis也是明智的。

  所以,咱們能夠得出一個結論:在簡單的Key/Value應用場景(例如緩存),Memcached擁有更高的讀寫性能;而在數據持久化和數據同步場景,Redis擁有更增強大的功能和更爲豐富的數據類型;

3、Memcached的安裝與簡單操做

  Memcached的安裝比較簡單,並且支持多平臺,包括:最經典的Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X以及咱們最熟悉的Windows。這裏咱們使用咱們平常最熟悉的Windows平臺來安裝Memcached服務,並進行簡單的配置和操做。

  (1)下載Memcached For Windows

  URL:http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip

  其對應的源碼地址:http://code.jellycan.com/files/memcached-1.2.6-win32-src.zip

  (2)在虛擬機中安裝Windows Server 2003 Enterprise Edition(非必要步湊,也能夠在本機進行),取名爲:MemcachedServer。另外,還要給虛擬機中的Windows Server設置好IP地址,確保宿主機和虛擬機可以互相ping通。

  (3)將下載的Memcached包拷貝到Windows中的一個指定文件夾中,例如個人Windows Server中的C:/MemcachedServer/

  (4)①在Windows中安裝Memcached服務:memcached.exe -d install(那麼,對應卸載命令爲:memcached.exe -d uninstall

    ②安裝完成後便可在Windows服務列表中查看到Memcached Server的服務,通常來講咱們要將其設爲開機啓動項:在屬性中設置啓動類型爲自動便可

    ③安裝好服務以後,就能夠啓動Memcached服務了,這裏有兩種方式來啓動:一是直接在Windows服務列表裏選中Memcached服務點擊啓動;二是在命令行中輸入:memcached -d start(對應的中止服務命令爲:memcached -d stop

  (5)檢測Memcached服務是否成功啓動:

  ①使用telnet命令鏈接到登陸臺:telnet 服務器IP地址 11211(11211是默認的Memcached服務端口號),我這裏輸入:telnet 192.168.80.10 11211(192.168.80.10是個人Windows Server虛擬機的IP地址)

  ②打印當前Memcache服務器狀態:stats

  能夠看到,經過stats命令列出了一系列的Memcached服務狀態信息,那麼這些信息又表明什麼意思呢?咱們能夠經過下圖來知道:

  (6)初步學習Memcached的數據讀寫命令操做:

    ①添加或更改命令:set KeyName 額外信息 存活時間 存儲字節數 [回車] 具體存儲的數據塊

 

    這裏額外信息爲0,表明無;存活時間爲0,表明永久;而具體的數據塊也就是咱們所說的Key/Value中的Value;  

PS:這裏也可使用add KeyName 額外信息 存活時間 存儲字節數 [回車] 具體存儲的數據塊。不過set顯然更爲強大,它會判斷keyname是否存在,不存在則新增,存在則修改;

    ②讀取命令:get KeyName,這裏咱們剛剛添加了一個key1的數據,因此咱們使用:get key1便獲取了key1這個key的緩存數據信息;

    ③更新命令:replace KeyName 額外信息 存活時間 存儲字節數 [回車] 具體存儲的數據塊

    ④刪除命令:delete KeyName

4、學習小結

  本篇咱們初步瞭解了什麼是Memcached,下載並安裝了Memcached,而且將其設爲Windows自啓動服務,經過telnet鏈接到Memcached登陸臺使用命令進行數據讀寫操做。整體來講,Memcached是一個高性能的Key/Value緩存系統,經過構建Memcached集羣,可以適應大型網站的分佈式緩存服務須要。下一篇,咱們將在.Net中鏈接並操做Memcached,最後以一個綜合案例來體現Memcached做爲分佈式緩存的重要做用。

  最後,若是親以爲個人文章不錯或者對你有用,麻煩幫我點個「推薦」,讓我更有動力繼續寫下去,謝謝!

參考文獻

  (1)傳智播客馬倫,《Memcached公開課》,http://bbs.itcast.cn/thread-14836-1-1.html

  (2)charlee,《Memcached徹底剖析》,http://kb.cnblogs.com/page/42731/

  (3)張釗,《Memcached介紹》,http://blog.csdn.net/zz198808/article/details/8032571

  (4)toxic,《memcached》,http://www.cnblogs.com/lost-1987/articles/3069460.html

 

相關文章
相關標籤/搜索