天天看點

memcache

一、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 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成為系統服務      
# 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