高性能內存對象緩存——Memcached

認識 Memcached

 

Memcached 簡介

Memcached 是一套開源的高性能分佈式內存對象緩存系統,它將全部的數據都存儲在內存中,由於在內存中會統一維護一張巨大的 Hash 表,因此支持任意存儲類型的數據。不少網站經過使用 Memcached 提升網站的訪問速度,尤爲是對於大型的須要頻繁訪問數據的網站。
 
Memcached 是典型的 C/S 架構,所以須要安裝 Memcached 服務端與 Memcached API 客戶端。Memcached 服務端是用 C 語音編寫的,而 Memcached API 客戶端能夠用任何語言來編寫,如PHP、Python、Perl 等,並經過 Memcached 協議與 Memcached 服務端進行通訊。php

存儲方式與數據過時方式

 

Memcached 具備獨特的存儲方式和數據過時方式
 mysql

  1. 數據存儲方式:Slab Allocationc++

    Slab Allocation 即按組分配內存,每次先分配一個 Slab ,至關於一個大小爲1MB的頁,而後在1MB的空間里根據數據劃分大小相同的 Chunk 。該方法能夠有效解決內存碎片問題,但可能會對內存空間有所浪費。
     算法

  2. 數據過時方式:LRU、Laxzy Expiration

    LRU是指追加的數據空間不足時,會根據LRU的狀況淘汰最近不多使用的記錄。Laxzy Expiration即惰性過時,是指使用get時查看記錄時間,從而檢查記錄是否已通過期。
     sql

Memcached 緩存機制

緩存是常駐在內存的數據,可以快速進行讀取。而 Memcached 就是這樣一款很是出色的緩存軟件,當程序寫入緩存數據請求時,Memcached 的 API 接口將 Key 輸入路由算法模塊路由到集羣中一臺服務器,以後由 API 接口與服務器進行通訊,完成一次分佈式緩存寫入。數據庫

Memcached 分佈式

Memcached 分佈式部署主要依賴於 Memcached 的客戶端來實現,多個 Memcached 服務器是獨立的。分佈式數據如何存儲是由路由算法所決定的。
 
當數據達到客戶端程序庫時,客戶端的算法就依據路由算法來決定保存的 Memcached 服務器。讀取數據時,客戶端依據保存數據時的路由算法選中和存儲數據時相同的服務器來讀取數據。緩存

Memcached 路由算法

  1. 求餘數 hash 算法

    求餘數 hash 算法是先用 key 作 hash 運算獲得一個整數,再去作 hash 算法,根據餘數進行路由。這種算法適合大多數據需求,可是不適合用在動態變化的環境中,好比有大量機器添加或者刪除時,會致使大量對象的存儲位置失效。
     服務器

  2. 一致性 hash 算法

    一致性 hash 算法適合在動態變化的環境中使用。原理是按照 hash 算法把對應的 key 經過必定的 hash 算法處理後,映射造成一個首尾相接的閉合循環,而後經過使用與對象存儲同樣的 hash 算法將機器也映射到環中,按順時針方向將全部對象存儲到離本身最近的機器中。架構

安裝 Memcached 案例

  • 本案例使用兩臺 CentOS 7.4 系統完成,一臺是 Memcached 服務器,一臺是基於 LAMP 架構進行 Memcached 拓展的 Memcached API 客戶端,能夠根據企業需求進行架構調整。
  • 案例環境
主機 IP地址 主要軟件包
Memcached 服務器 192.168.100.201 memcached-1.5.6.tar.gz、libevent-2.1.8-stable.tar.gz
Memcached API客戶端 192.168.100.202 memcached-2.2.7.tgz 、httpd、mysql、php

開始部署

 

  • Memcached 服務器
    # tar zxvf memcached-1.5.6.tar.gz -C /opt/
    # tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
    # yum install gcc gcc-c++ make -y
    # cd /opt/libevent-2.1.8-stable
    # ./configure --prefix=/usr/local/libevent
    # make && make install
     
    # cd /opt/memcached-1.5.6
    # ./configure \
    --prefix=/usr/local/memcached \
    --with-libevent=/usr/local/libevent/
    # make && make install
     
    # ln -s /usr/local/memcached/bin/* /usr/local/bin/
    # memcached -d -m 32m -p 11211 -u root    //   開啓服務(-d守護進程  -m緩存大小32M  -p端口11211)
    # netstat -anpt | grep memc      //查看端口 11211/tcp端口
    # systemctl stop firewalld.service 
    # setenforce 0
  • Memcached API 客戶端
  • 手工編譯安裝LAMP架構:見以前的博文,在此很少敘述
  • 測試數據庫工做是否正常
    # mysql -u root -p
     
    > CREATE DATABASE sky;
    > GRANT all ON sky.* TO 'skyuser'@'%' IDENTIFIED BY 'admin123';
    > flush privileges; 
     
    # vi /usr/local/httpd/htdocs/index.php
     
    <?php
    $link=mysql_connect('192.168.100.202','skyuser','admin123');
    if($link) echo "<h1>Success!!</h1>";
    else echo "Fail!!";
    mysql_close();
    ?>
  • 添加測試主頁後在訪問"http://192.168.100.202/index.php"
  • 顯示 Success 爲正常工做
     
     app

  • 安裝Memcached API 客戶端

    # yum install autoconf -y
    # tar xf memcached-2.2.7.tgz -C /opt/
    # cd /opt/memcached-2.2.7
     
    //使用PHP的phpize腳本生成配置腳本configure   再進行配置編譯
    # /usr/local/php5/bin/phpize         
    # ./configure \
    --enable-memcache \
    --with-php-config=/usr/local/php5/bin/php-config
    # make && make install
    ............
    /usr/local/php5/lib/php/extensions/no-debug-zts-20131226/         //記錄此行(共享組件的位置)  下面用到

     

  • 配置PHP,添加Memcached組件

    # vi /usr/local/php5/php.ini //搜索並修改下面一行,再新增一行
     
    extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/" 
    extension = memcache.so

     

  • 編寫測試頁面,測試Memcached是否正常工做
    # vi /usr/local/httpd/htdocs/index.php
    <?php
    $memcache = new Memcache();
    $memcache->connect('192.168.100.202',11211);
    $memcache->set('key','Memcache test Successfull!',0,60);
    $result = $memcache->get('key');
    unset($memcache);
    echo $result;
    ?>
    # service httpd restart

    高性能內存對象緩存——Memcached
     
     
     

Memcached 數據庫操做與管理

  • Memcached數據庫操做和管理很是簡單,安裝使用telnet鏈接11211端口就能夠
    # yum install telnet -y
    # telnet 127.0.0.1 11211
  • 新建數據
    add username 0 0 7 //不進行壓縮和序列化標識   數據過時時間爲永不過時  標識號是7就須要輸入7位數。
    example //輸入數據
  • 獲取數據
    get username //獲取數據
    VALUE username 0 7
    example
     
    gets username
    VALUE username 0 7 1     //最後一位是更新因子會自增1
    example
  • 更新數據
    set username 0 0 10    //更新信息,若鍵名不存在,則自行添加
    everything
     
    replace username 0 0 8    //更新信息,若鍵名不存在,則報錯
    12345678
  • 檢查更新
    gets username
    VALUE username 0 8 4
    12345678
    cas username 0 0 7 4       //檢查更新,更新因子相等則更新不然返回EXISTS
    lodging
    STORED
  • 追加數據
    append username 0 0 7       //鍵值後追加數據
    example
    STORED
     
    prepend username 0 0 2     //鍵值前追加數據
    un
    STORED
  • 清除數據
    delete username   //清除指定的鍵值數據
    flush_all                  //清除全部緩存數據
    OK
  • 查看服務器統計信息
    stats                //顯示狀態信息
    stats items       //返回全部鍵值對的統計信息
    stats cachedump 1 0    //返回指定存儲空間的鍵值對 
    stats slabs       //顯示各個slab的信息,包括chunk的大小、數目、使用狀況等
    stats sizes       //輸出全部item的大小和個數
    stats reset       //清空統計數據
  • 退出
    quit
相關文章
相關標籤/搜索