【 學習筆記 】memcached基礎知識

源地址:http://kb.cnblogs.com/page/42731/linux

仔細學習了下,如下是記錄的筆記備忘內容。web

1、memcached是什麼?
    memcached是高性能的分佈式內存緩存服務器。
    通常使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態web應用的速度、提升可擴展性算法

 

    memcached的特徵:
        1. 協議簡單
        2. 基於libevent的事件處理
        3. 內置內存存儲方式
        4. memcached不互相通訊的分佈式數據庫

        協議簡單:
            memcached使用簡單文本行的協議,所以經過telnet也能在memcached上保存數據,取得數據。

        基於libevent的事件處理
            libevent是一個程序庫,它將linux的epoll、BSD類操做系統的kqueue等事件處理功能封裝成統一的接口。
            memcached使用這個libevent庫,所以在linux、BSD等操做系統上發揮高性能。

        內置內存存儲方式
            memcached中保存的數據都存儲在memcached內置的內存存儲空間中。因爲數據僅存儲在內存中,所以重啓memcached、重啓操做系統會致使所有數據的丟失。內容容量達到指定值以後,就基於LRU算法自動刪除不使用的緩存。memcached自己是爲緩存而設計的服務器,所以沒有考慮數據的永久性問題。

        memcached不互相通訊的分佈式
            各個memcahced不會互相通訊已共享信息,如何進行分佈式,是由客戶端來實現的緩存

    memcached安裝
        在安裝memcahced以前,首先要安裝libevent庫bash

            # tar xf libevent-2.0.21-stable.tar.gz
            # cd libevent-2.0.21
            # ./configure --prefix=/usr/local/libevent
            # make && make install

            # echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf
            # ldconfig 

            # 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

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="memcached"
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  $OPTIONS
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success && touch $lockfile || failure
        echo
        return $RETVAL
}

stop() {
        echo -n $"Shutting down $desc (memcached): "
        killproc $prog
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success && rm -f $lockfile || failure
        echo
        return $RETVAL
}

restart() {
        stop
        start
}

reload() {
        echo -n $"Reloading $desc ($prog): "
        killproc $prog -HUP
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success || failure
        echo
        return $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
            主配置文件:/etc/sysconfig/memcached
                PORT="11211"        # memcached端口
                USER="memcached"    # 啓動用戶    
                MAXCONN="1024"        # 最大鏈接數
                CACHESIZE="64"        # 內存緩存空間大小,單位:M
                OPTIONS=""            # 其餘選項
    memcached客戶端鏈接
        telnet ip:port

    保存數據

        向memcached保存數據的方法有:
            add、replace、set
            my $add = $memcached->add( '鍵', '值', '期限' );
            my $replace = $memcached->replace( '鍵', '值', '期限' );
            my $set = $memcached->set( '鍵', '值', '期限' );            
        向memcached保存數據時能夠指按期限(秒)。不指按期限memcached按照LRU算法保存數據。上面三個方法的區別:
            add:         僅當存儲空間中不存在鍵相同的數據時才保存
            replace:     僅當存儲空間中存在鍵相同的數據時才保存
            set:        與add和replace不一樣,不管什麼時候都保存

    獲取數據分佈式

        獲取數據使用get 和 get_multi 方法
        一次獲取多條數據時使用get_multi,能夠非同步的同時取得多個鍵值,速度要比循環調用get快數十倍
            my $val = $memcached->get('鍵');
            my $val = $memcached->get_multi('鍵1', '鍵2', '鍵3', '鍵4', '鍵5');        

    刪除數據

        刪除數據使用delete方法

            $memcached->delete('鍵', '阻塞時間(秒)');

            刪除第一個參數指定鍵的數據,第二個參數指定一個時間值,能夠禁止使用一樣的鍵保存新數據。此功能能夠用於防止緩存數據的不完整。注意:set函數忽視該阻塞,照常保存數據增一和減一操做

2、memcahced的內存存儲機制memcached

    slab Allocation機制:整理內存以便重複使用
        slab allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定的塊,以徹底解決內存碎片問題。
        slab Allocation 將分配的內存分割成各類尺寸的塊(chunk),並把尺寸相同的塊分紅組(chunk的集合)
        slab allocator 能重複使用已分配的內存目的。也就是說,分配到的內存不會釋放,並且重複利用。函數

    slab Allocation的主要術語
        Page: 內存分配給slab的內存空間,默認是1MB,分配給slab以後根據slab的大小切分紅chunk,一個page爲4kb
        Chunk:用於緩存記錄的內存空間
        slab class:特定大小chunk的組

    在slab中緩存數據的原理:
        memcached根據收到數據的大小,選擇最適合數據大小的slab,memcached中保存着slab內空閒的chunk的列表,根據該列表選擇chunk,而後將數據緩存於其中。

    slab Allocator的缺點:
        slab allocator 分配的是特定長度的內存所以沒法有效利用分配的內存。例如:將100字節的數據緩存到128字節上,剩餘的28字節就浪費掉了。

使用Growth Factor進行調優

    memcached在啓動時指定Growth Factor因子(選項-f),就能夠在某種程度上控制slab之間的差別,默認是1.25

    設置命令:memcached -f 2 -vv

查看memcahced的內部狀態

    # telnet 127.0.0.1 11211
    stats

查看slabs的使用情況
    # memcached-tool 127.0.0.1
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      96B        30s       1       1      no        0        0    0

      各項含義:
          #             slab class編號
          Item_Size     chunk大小
          Max_age        LRU內最舊的記錄的生存時間
          Pages        分配給Slab的頁數
          Count        slab內的記錄數
          Full?        Slab內是否含有空閒chunk

    這部分不是特別徹底,後期補充,這個腳本對調優很是方便。

3、memcached的刪除機制

    memcached在數據刪除方面有效利用資源,數據不會真正從memcached中消失

    lazy Expiration
        memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。這種技術被成爲lazy(惰性) expiration,所以memcached不會在過時監視上耗費cpu時間

    LRU: 從緩存中有效刪除數據的原理
        當memcached的內存空間不足時,就從最近未使用的記錄中搜索,並將其空間分配給新的記錄。新的記錄覆蓋掉使用最少的chunk
        # memcached -M 禁止LRU,通常狀況下是很是推薦使用LRU

4、memcached的分佈式算法

    memcached的分佈式
        memcached的分佈式是由客戶端程序庫來實現的,這種分佈式是memcached最大的特色。

        set方法:
            首先向memcached中添加'tokyo' 將'tokyo'傳給客戶端程序庫後,客戶端實現的算法就會根據'鍵'來決定保存數據的memcached服務器。

        get方法:
            獲取時也要將要獲取的鍵「tokyo」傳遞給函數庫。 函數庫經過與數據保存時相同的算法,根據「鍵」選擇服務器。 使用的算法相同,就能選中與保存時相同的服務器,而後發送get命令。 只要數據沒有由於某些緣由被刪除,就能得到保存的值。

    Cache::Memcached的分佈式方法        hash-type主要有兩種方法:            1. 取模法:這種算法不適用於memcached分佈式,當一臺memcached服務器故障,將會形成全部memcached緩存失效。            2. 一致性hash算法:首先求出memcached服務器的哈希值,並將其配置到1-2^32的圓上,而後用一樣的方法求出存儲數據的鍵的哈希值,並映射到圓上,而後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。

相關文章
相關標籤/搜索