Memcached介紹及簡單的使用

      網友投稿 940 2025-03-31

      1???????Memcached介紹


      1.1?????概述

      Memcached是一個開源的高性能的分布式內存對象緩存系統,在Web應用中用于減輕數據庫負載。我們可以將使用頻率較高,且要求時效性不嚴格的數據緩存到memcached中,以減少讀取數據庫的次數,從而減低數據庫壓力。另外,在集群環境下,也可以通過memcached緩存session,以達到session數據共享的目的。

      1.2?????特點

      memcached作為高速運行的分布式緩存服務器,具有以下的特點。

      · 協議簡單

      · 基于libevent的事件處理

      · 內置內存存儲方式

      · memcached不互相通信的分布式

      Memcached是否支持數據持久化?

      沒有,memcached不具備數據持久化功能,當memcached重啟時,保存在里面的數據會全部丟失;

      Memcached的各節點是否能夠進行數據同步共享?

      不能,memcached的各節點是相互獨立的,無法共享數據;

      Memcached是否會產生內存碎片?

      不會,memcached使用SlabAllocation的內存預分配機制,不會產生內存碎片。

      正是因為以上幾點,memcached的CPU使用率是非常低的,所以如果服務器上有空閑的內存,不妨利用起來,作為緩存使用。

      1.3?????原理

      1)???? 數據存儲方式-Slab Allocation機制

      名詞解釋:

      Chunk:用于緩存記錄的內存空間。

      Page:分配給Slab的內存空間,默認是1MB。分配給Slab之后根據切分成大小相同的chunk。

      Slab Class:特定大小的chunk的組。

      Growth Factor:增長因數,默認為1.25

      Memcached在啟動時,會根據配置的起始chunk大小、增長因子Growth Factor、page的大小,生成Slab。例如chunk size是88B,page為1M,Growth Factor是1.25,則會生成88、112、144、184……1M等39組Slab。每個slab保存固定尺寸的chunk,由此不難發現,slab的chunk越大,其中的每個page包含的chunk數量就越少。

      圖1 Slab Allocation的構造圖

      當有新的對象放入memcached時,memcached會根據對象的大小匹配到對應的slab上,比如100KB的對象,根據最小空間損失原則,會被放入到slab2(size:112B)對應的page下,如下圖

      Memcached介紹及簡單的使用

      圖2選擇存儲記錄的組的方法

      綜上,不難發現SlabAllocation存儲方式的缺點:

      A.?? 啟動時直接生成了slabs,如果在實際應用中沒有被使用,則會造成內存浪費

      B.??由于分割成特定長度的chunck,因此保證有效的內存利用。例如,將100字節的數據緩存到128字節的chunk里,將會造成28字節的內存浪費

      2???????Memcached安裝

      2.1??準備工作

      下載memcached與libevent的安裝文件

      http://memcached.googlecode.com/files/memcached-1.4.16.tar.gz(memcached-)

      https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz(libevent-)

      2.2??具體安裝步驟

      1)???????由于memcached依賴于libevent,因此需要安裝libevent。由于linux系統可能默認已經安裝libevent,執行命令:

      rpm -qa|grep libevent

      查看系統是否帶有該安裝軟件,如果有執行命令:

      rpm -e libevent-1.4.13-4.el6.x86_64--nodeps(由于系統自帶的版本舊,忽略依賴刪除)

      2)???????安裝libevent命令:

      tar zxvf libevent-2.0.21-stable.tar.gz

      cdlibevent-2.0.21-stable

      ./configure--prefix=/usr/local/libevent

      make

      make install

      至此libevent安裝完畢;測試libevent是否安裝成功:

      3)???????安裝memcached命令:

      tar zxvf memcached-1.4.2.tar.gz

      cd memcached-memcached-1.4.2

      ./configure--prefix=/usr/local/memcached--with-libevent=/usr/local/libevent/

      make

      make install

      至此memcached安裝完畢;測試是否成功安裝memcached:

      [root@linux memcached]# ls -al /usr/local/bin/mem*

      -rwxr-xr-x 1 root root 245919 12-10 19:03/usr/local/bin/memcached

      4)???????啟動memcached

      /usr/local/memcached/bin/memcached -d -m256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid

      啟動參數說明:

      -d 選項是啟動一個守護進程。

      -u root 表示啟動memcached的用戶為root。

      -m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。

      -M return error on memory exhausted(rather than removing items)。

      -u 是運行Memcache的用戶,如果當前為root 的話,需要使用此參數指定用戶。

      -l 是監聽的服務器IP地址,默認為所有網卡。

      -p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。

      -c 選項是最大運行的并發連接數,默認是1024。

      -P 是設置保存Memcache的pid文件。

      -f chunk size growthfactor (default: 1.25)。

      -I Override the size ofeach slab page. Adjusts max item size(1.4.2版本新增)。? 也可以啟動多個守護進程,但是端口不能重復

      查看進程

      [root@linuxmemcached]# ps aux | grep memcached

      5)???????停止memcached

      找到進程號,直接kill掉

      6)???????可能存在的錯誤以及解決方案

      如果出現客戶端連接不上memcached的情況,請將防火墻關閉或將防火墻中的memcached端口(11211端口)打開。

      開啟對外訪問的網絡端口(以11211為例):

      iptables -A INPUT-p tcp --dport 11211 -j ACCEPT

      iptables -A OUTPUT-p tcp --sport 11211 -j ACCEPT #開啟11211端口

      service iptablessave #保存配置

      /etc/rc.d/init.d/iptablesrestart #重啟服務

      查看端口是否開放

      /etc/init.d/iptablesstatus 或/e

      注意:make的時候報錯

      memcached.c: 在函數‘add_iov’中:

      memcached.c:696:30: 錯誤: ‘IOV_MAX’未聲明(在此函數內第一次使用)

      memcached.c:696:30: 附注: 每個未聲明的標識符在其出現的函數內只報告一次

      make[2]: *** [memcached-memcached.o] 錯誤 1

      需要修改 memcached.c 文件:

      /* FreeBSD 4.x doesn't have IOV_MAX exposed. */

      #ifndef IOV_MAX

      #if defined(__FreeBSD__) || defined(__APPLE__)

      # define IOV_MAX 1024

      #endif

      #endif

      改成:

      /* FreeBSD 4.x doesn't have IOV_MAX exposed. */

      #ifndef IOV_MAX

      # define IOV_MAX 1024

      #endif

      再make&&make install,編譯之后退出root用戶。tc/init.d/iptables –Ln

      3 Memcached使用

      3.1??命令模式下

      memcached 查看方法

      格式: telnet ip port

      例如 telnet localhost 11211

      退出命令:quit

      存儲命令格式:

      參數說明:

      1).set??無論如何都存儲,數據不存在時存儲,數據存在時更新。

      set?mykey?0?0?3 123 STORED set?mykey?0?0?3 456 STORED

      2).add?當數據不存在時存儲。

      add?mykey?0?0?3 123 STORED add?mykey?0?0?3 456 NOT_STORED

      3).replace?當數據存在時存儲

      set?mykey?0?0?3 123 STORED replace?mykey?0?0?3 456 STORED delete?mykey DELETED replace?mykey?0?0?3 678 NOT_STORED

      讀取命令

      1).get?key 可以一個或多個,用空格格開。

      set?mykey?0?0?3 123 STORED set?mykey1?0?0?3 456 STORED get?mykey?mykey1 VALUE?mykey?0?3 123 VALUE?mykey1?0?3 456 END

      2).gets?與 get 一樣,但會返回多一個數字,這個數字用來檢查數據是否被修改過,如修改過,這個數字回改變

      set?mykey?0?0?3 123 STORED gets?mykey VALUE?mykey?0?3?7 123 END replace?mykey?0?0?3 888 STORED gets?mykey VALUE?mykey?0?3?8 888 END

      3).cas?cas即checked and set?,當最后一個參數與gets返回的數字一致時才存儲,否則返回EXISTS。

      set?mykey?0?0?3 123 STORED gets?mykey VALUE?mykey?0?3?9 123 END cas?mykey?0?0?3?8 456 EXISTS cas?mykey?0?0?3?9 456 STORED

      追加與清除命令

      1).append?將數據追加到當前緩存數據的之后,當緩存數據存在時才存儲。

      set?mykey?0?0?3 123 STORED append?mykey?0?0?3 456 STORED get?mykey VALUE?mykey?0?6 123456 END append?notexists?0?0?3 456 NOT_STORED

      2).prepend?將數據追加到當前緩存數據的之前,當緩存數據存在時才存儲。

      set?mykey?0?0?3 123 STORED prepend?mykey?0?0?3 456 STORED get?mykey VALUE?mykey?0?6 456123 END prepend?notexists?0?0?3 456 NOT_STORED

      3).delete?刪除緩存數據,數據存在返回DELETED,數據不存在返回NOT_FOUND

      set?mykey?0?0?3 123 STORED delete?mykey DELETED delete?mykey NOT_FOUND

      4).flush_all?將當前所有緩存數據設置為過期,但不會釋放內存。

      flush_all OK

      狀態命令

      1).stats?查看memcached運行狀態

      pid?????????????????????Memcached?進程ID?? ?? uptime??????????????????Memcached?運行時間,單位:秒?? ?? time????????????????????Memcached?當前的UNIX時間?? ?? version?????????????????Memcached?的版本號?? ?? rusage_user?????????????該進程累計的用戶時間,單位:秒?? ?? rusage_system???????????該進程累計的系統時間,單位:秒?? ?? curr_items??????????????Memcached?當前存儲的內容數量?? ?? total_items?????????????Memcached?啟動以來存儲過的內容總數?? ?? bytes???????????????????Memcached?當前存儲內容所占用的字節數(*/1024/1024=mb)?? ?? curr_connections????????當前連接數量?? ?? total_connections???????Memcached?運行以來接受的連接總數?? ?? connection_structures???Memcached?分配的連接結構的數量?? ?? cmd_get?????????????????查詢請求總數?? ?? cmd_set?????????????????存儲(添加/更新)請求總數?? ?? get_hits????????????????查詢成功獲取數據的總次數?? ?? get_misses??????????????查詢成功未獲取到數據的總次數?? ?? bytes_read??????????????Memcached?從網絡讀取到的總字節數?? ?? bytes_written???????????Memcached?向網絡發送的總字節數?? ?? limit_maxbytes??????????Memcached?在存儲時被允許使用的字節總數

      2).stats items

      執行stats items,可以看到STAT items行,如果memcached存儲內容很多,那么這里也會列出很多的STAT items行。

      3).stats cachedump slabs_id limit_num

      slabs_id:由stats items返回的結果(STAT items后面的數字)決定的

      limit_num:返回的記錄數,0表示返回所有記錄

      通過stats items、stats cachedump slab_id limit_num配合get命令可以遍歷memcached的記錄。

      stats?cachedump?1?0 ITEM?mykey?[3?b;?1362880145?s] END

      4).stats slabs?顯示各個slab的信息,包括chunk的大小、數目、使用情況等

      5).stats sizes?輸出所有item的大小和個數

      6).stats reset?清空統計數據

      3.2??Java代碼中

      1.1. 3.2.1配置XMemcached客戶端的jar包

      xmemcached-1.2.3.jar

      3.2.2 java代碼段舉例

      MemcachedClientBuilder?builder?=?new?XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.4.151:11211"));//通過連接地址及端口獲取builder對象MemcachedClient?memcachedClient?=?null;try?{ ?????memcachedClient?=?builder.build(); ?????memcachedClient.set("key",?0,?“value”);//?設置鍵為key的內容,0代表生存周期為無限 ?????Object?obj?=?memcachedClient.get("key");//獲取鍵為key的內容 ?????memcachedClient.delete("key");//刪除鍵為key的內容}?catch?(MemcachedException?e)?{ ???System.err.println("MemcachedClient?operation?fail"); ???e.printStackTrace(); }?catch?(TimeoutException?e)?{ ???System.err.println("MemcachedClient?operation?timeout"); ???e.printStackTrace(); }?catch?(InterruptedException?e)?{ ???e.printStackTrace(); }?catch?(IOException?e)?{ ???e.printStackTrace(); }try?{ ????memcachedClient.shutdown(); }?catch?(IOException?e)?{ ????System.err.println("Shutdown?MemcachedClient?fail"); ????e.printStackTrace(); }

      附:

      以上內容相關的安裝包及jar如下:

      http://download.csdn.net/detail/keyingbo2008/6943287

      xme

      Memcached 緩存 存儲

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:生產作業管理系統(生產作業管控平臺)
      下一篇:36個絕對不能錯過的excel使用技巧大全
      相關文章
      中文字幕亚洲天堂| 国产精品亚洲精品爽爽| 亚洲av无码av在线播放| 亚洲综合久久1区2区3区| 日韩精品一区二区亚洲AV观看| 亚洲日韩欧洲乱码AV夜夜摸| 国产亚洲美日韩AV中文字幕无码成人 | 亚洲欧洲精品一区二区三区| 亚洲AV综合色一区二区三区| 久久久亚洲精品无码| 亚洲成人免费在线| 亚洲人成网站影音先锋播放| 亚洲成a人片在线观看中文动漫| 亚洲Av无码专区国产乱码DVD | 亚洲午夜成人精品无码色欲| 亚洲中文字幕久久精品无码VA | 久久亚洲国产精品成人AV秋霞| 久久青青草原亚洲av无码app| 亚洲AV本道一区二区三区四区 | 亚洲人成网亚洲欧洲无码| 亚洲精品V天堂中文字幕| 国产AV无码专区亚洲AV麻豆丫| 国产亚洲男人的天堂在线观看| 亚洲Av无码国产情品久久| 亚洲一级特黄无码片| 中文亚洲成a人片在线观看| 国产亚洲无线码一区二区| 亚洲av日韩av无码黑人| 久久99亚洲网美利坚合众国| 亚洲欧洲另类春色校园小说| 亚洲国色天香视频| 亚洲熟女综合色一区二区三区| 亚洲AV成人片无码网站| 国产av无码专区亚洲国产精品| 亚洲人成色77777| 亚洲一区二区三区电影| 亚洲一区二区三区免费在线观看| 一本天堂ⅴ无码亚洲道久久| 国产精品亚洲综合天堂夜夜| 亚洲熟女一区二区三区| 亚洲国产综合专区电影在线|