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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章