一、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進行事件處理的,所以我們需要先安裝libevent
[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
2、安裝memcache
# 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 install3、爲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 $CACHESIZERETVAL=$? [ $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成爲系統服務
# chmod +x /etc/rc.d、init.d/memcached # chkconfig --add memcached # service memcached start
使用 telnet命令測試 memcached 的使用
[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