Memcached 是一套開源的高性能分佈式內存對象緩存系統,它將全部的數據都存儲在內存中,由於在內存中會統一維護一張巨大的 Hash 表,因此支持任意存儲類型的數據。不少網站經過使用 Memcached 提升網站的訪問速度,尤爲是對於大型的須要頻繁訪問數據的網站。
Memcached 是典型的 C/S 架構,所以須要安裝 Memcached 服務端與 Memcached API 客戶端。Memcached 服務端是用 C 語音編寫的,而 Memcached API 客戶端能夠用任何語言來編寫,如PHP、Python、Perl 等,並經過 Memcached 協議與 Memcached 服務端進行通訊。php
Memcached 具備獨特的存儲方式和數據過時方式
mysql
數據存儲方式:Slab Allocationc++
Slab Allocation 即按組分配內存,每次先分配一個 Slab ,至關於一個大小爲1MB的頁,而後在1MB的空間里根據數據劃分大小相同的 Chunk 。該方法能夠有效解決內存碎片問題,但可能會對內存空間有所浪費。
算法
LRU是指追加的數據空間不足時,會根據LRU的狀況淘汰最近不多使用的記錄。Laxzy Expiration即惰性過時,是指使用get時查看記錄時間,從而檢查記錄是否已通過期。
sql
緩存是常駐在內存的數據,可以快速進行讀取。而 Memcached 就是這樣一款很是出色的緩存軟件,當程序寫入緩存數據請求時,Memcached 的 API 接口將 Key 輸入路由算法模塊路由到集羣中一臺服務器,以後由 API 接口與服務器進行通訊,完成一次分佈式緩存寫入。數據庫
Memcached 分佈式部署主要依賴於 Memcached 的客戶端來實現,多個 Memcached 服務器是獨立的。分佈式數據如何存儲是由路由算法所決定的。
當數據達到客戶端程序庫時,客戶端的算法就依據路由算法來決定保存的 Memcached 服務器。讀取數據時,客戶端依據保存數據時的路由算法選中和存儲數據時相同的服務器來讀取數據。緩存
求餘數 hash 算法是先用 key 作 hash 運算獲得一個整數,再去作 hash 算法,根據餘數進行路由。這種算法適合大多數據需求,可是不適合用在動態變化的環境中,好比有大量機器添加或者刪除時,會致使大量對象的存儲位置失效。
服務器
一致性 hash 算法適合在動態變化的環境中使用。原理是按照 hash 算法把對應的 key 經過必定的 hash 算法處理後,映射造成一個首尾相接的閉合循環,而後經過使用與對象存儲同樣的 hash 算法將機器也映射到環中,按順時針方向將全部對象存儲到離本身最近的機器中。架構
主機 | 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 |
# 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
# 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(); ?>
顯示 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
# 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
# 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