一、memcached簡介
Memcached是一款開源、高性能、分布式記憶體對象緩存系統,可應用各種需要緩存的場景,其主要目的是通過降低對Database的通路來加速web應用程式。它是一個基于記憶體的“鍵值對”存儲,用于存儲資料庫調用、API調用或頁面引用結果的直接資料,如字元串、對象等。
memcached是高性能的分布式記憶體緩存伺服器。 一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态Web應用的速度、 提高可擴充性
Memcached是一款開發工具,它既不是一個代碼加速器,也不是資料庫中間件。其設計哲學思想主要反映在如下方面:
- 簡單key/value存儲:伺服器不關心資料本身的意義及結構,隻要是可序列化資料即可。存儲項由“鍵、過期時間、可選的标志及資料”四個部分組成;
- 功能的實作一半依賴于用戶端,一半基于伺服器端:客戶負責發送存儲項至伺服器端、從服務端擷取資料以及無法連接配接至伺服器時采用相應的動作;服務端負責接收、存儲資料,并負責資料項的逾時過期;
- 各伺服器間彼此無視:不在伺服器間進行資料同步;
- O(1)的執行效率
- 清理超期資料:預設情況下,Memcached是一個LRU緩存,同時,它按事先預訂的時長清理超期資料;但事實上,memcached不會删除任何已緩存資料,隻是在其過期之後不再為客戶所見;而且,memcached也不會真正按期限清理緩存,而僅是當get指令到達時檢查其時長;
memcached 基于libevent的事件處理
libevent是個程式庫,它将Linux的epoll、BSD類作業系統的kqueue等事件處理功能封裝成統一的接口。即使對伺服器的連接配接數增加,也能發揮O(1)的性能。memcached使用這個libevent庫,是以能在Linux、BSD、Solaris等作業系統上發揮其高性能。
為了提高性能,memcached中儲存的資料都存儲在memcached内置的記憶體存儲空間中。由于資料僅存在于記憶體中,是以重新開機memcached、重新開機作業系統會導緻全部資料消失。另外,内容容量達到指定值之後,就基于LRU(Least Recently Used)算法自動删除不使用的緩存。memcached本身是為緩存而設計的伺服器,是以并沒有過多考慮資料的永久性問題
二、memcache的安裝與配置
1、安裝libevent、 memcache是基于libevent進行事件處理的,是以我們需要先安裝libevent2、安裝memcache[root@node2 ~]# tar xf libevent-2.0.21-stable.tar.gz [root@node2 ~]# cd libevent-2.0.21-stable [root@node2 libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent [root@node2 libevent-2.0.21-stable]# make && make install
# tar xf memcached-1.4.15.tar.gz # cd memcached-1.4.15 # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make && make install
3、為memcache提供開機啟動腳本:建立 /etc/rc.d/init.d/memcached
#!/bin/bash # # Init file for memcached # # chkconfig: - 86 14 # description: Distributed memory caching daemon # # processname: memcached # config: /etc/sysconfig/memcached . /etc/rc.d/init.d/functions ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS="" RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached" start() { echo -n $"Starting $desc (memcached): "daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE
RETVAL=$? [ $RETVAL -eq 0 ] && success && touch $lockfile || failure echoreturn $RETVAL } stop() { echo -n $"Shutting down $desc (memcached): "killproc $prog RETVAL=$? [ $RETVAL -eq 0 ] && success && rm -f $lockfile || failure echoreturn $RETVAL } restart() { stop start } reload() { echo -n $"Reloading $desc ($prog): "killproc $prog -HUP RETVAL=$? [ $RETVAL -eq 0 ] && success || failure echoreturn $RETVAL } case"$1"in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e $lockfile ] && restart RETVAL=$? ;; reload) reload ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}"RETVAL=1 esac exit $RETVAL
4、配置memcached成為系統服務
使用 telnet指令測試 memcached 的使用# chmod +x /etc/rc.d、init.d/memcached # chkconfig --add memcached # service memcached start
[root@node2 ~]# service memcached start Starting Distributed memory caching (memcached): [ OK ] [root@node2 ~]# !te telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is'^]'. add key 0 10 5 hello STORED get key VALUE key 0 5 hello END
5、提供配置檔案
由于memcached的記憶體大小是手動設定的,有的時候需要随時去修改它,總不能每次都去修改memcached腳本吧,是以下面我們為memcached提供配置檔案
①:為memcached腳本提供配置檔案[root@memcache ~]# vim /etc/sysconfig/memcached PORT="11211"USER="nobody"MAXCONN="1024"CACHESIZE="128" 這裡就是我們要為其配置設定的記憶體OPTIONS=""②:修改/etc/rc.d/init.d/memcached 加入一條
. /etc/rc.d/init.d/functions ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="128" OPTIONS=""[ -f /etc/sysconfig/memcached ] && . /etc/sysconfig/memcached 因為這個檔案裡面寫的内容和上面定義的參數相同,是以以這個檔案中的為準 RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached"
我們來修改下記憶體。改成64MB,如下:
PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" 修改成64 OPTIONS=""
我們用telnet 127.0.0.1 11211 驗證下:
STAT bytes_read 33 STAT bytes_written 2050 STAT limit_maxbytes 67108864 變成了64M STAT accepting_conns 1 STAT listen_disabled_num 0
memcache中各狀态的意義:
[root@memcache ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is'^]'. stats STAT pid 8279 #程序ID STAT uptime 8000 #伺服器運作秒數 STAT time 1378284623 #伺服器目前unix時間戳 STAT version 1.4.15 #伺服器版本 STAT libevent 2.0.21-stable #libevent版本号 STAT pointer_size 64 #作業系統指針大小(這台伺服器是64位的) STAT rusage_user 0.000999 #程序累計使用者時間 STAT rusage_system 0.003999 #程序累計系統時間 STAT curr_connections 10 #目前打開連接配接數 STAT total_connections 11 #曾打開的連接配接總數 STAT connection_structures 11 #伺服器配置設定的連接配接結構數 STAT reserved_fds 20 #内部使用的FD數 STAT cmd_get 0 #執行get指令總數 STAT cmd_set 0 #執行set指令總數 STAT cmd_flush 0 #執行flush指令總數 STAT cmd_touch 0 #執行touch指令總數 STAT get_hits 0 #get命中次數 STAT get_misses 0 #get未命中次數 STAT delete_misses 0 #delete未命中次數 STAT delete_hits 0 #delete命中次數 STAT incr_misses 0 #incr未命中次數 STAT incr_hits 0 #incr命中次數 STAT decr_misses 0 #decr未命中次數 STAT decr_hits 0 #decr命中次數 STAT cas_misses 0 #cas未命中次數 STAT cas_hits 0 #cas命中次數 STAT cas_badval 0 #使用擦拭次數 STAT touch_hits 0 #touch命中次數 STAT touch_misses 0 #touch未命中次數 STAT auth_cmds 0 #認證處理的次數 STAT auth_errors 0 #認證失敗次數 STAT bytes_read 7 #讀取位元組總數 STAT bytes_written 0 #寫入位元組總數 STAT limit_maxbytes 134217728 #現在的記憶體大小為128M STAT accepting_conns 1 #目前接受的新接數 STAT listen_disabled_num 0 #失效的監聽數 STAT threads 4 #目前線程數 STAT conn_yields 0 #連接配接操作主支放棄數目 STAT hash_power_level 16 #hash等級 STAT hash_bytes 524288 #目前hash表等級 STAT hash_is_expanding 0 #hash表擴充大小 STAT bytes 0 #目前存儲占用的位元組數 STAT curr_items 0 #目前存儲資料總數 STAT total_items 0 #啟動以來存儲的資料總數 STAT expired_unfetched 0 #已過期但未擷取的對象數目 STAT evicted_unfetched 0 #已驅逐但未擷取的對象數目 STAT evictions 0 #LRU釋放的對象數目 STAT reclaimed 0 #用已過期的資料條目來存儲新資料的數目 END