1. 程式人生 > >高性能內存對象緩存——Memcached

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

裏根 對象存儲 所有 可能 數據請求 語音 依據 force 緩存機制

認識 Memcached

 

Memcached 簡介

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

存儲方式與數據過期方式

 

Memcached 具有獨特的存儲方式和數據過期方式
 

  1. 數據存儲方式:Slab Allocation

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

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

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

     

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 為正常工作
     
     

  • 安裝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數據庫操作和管理非常簡單,安裝使用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       //清空統計數據

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