Memcached介紹
是國外社區網站LiveJournal團隊開發,經過緩存數據庫查詢結果,減小數據庫訪問次數,從而提升動態web站點性能。官方站點 http://memcached.org/
基於c/s架構,協議簡單
基於libevent的事件處理
自主內存存儲處理(slab allowcation)
數據過時方式:Lazy Expiration 和 LRU
memcached數據流
![Memcached存儲session](http://static.javashuo.com/static/loading.gif)
Slab allocation
- Slab Allocation的原理——將分配的內存分割成各類尺寸的塊(chunk), 並把尺寸相同的塊分紅組(chunk的集合),每一個chunk集合被稱爲slab。
- Memcached的內存分配以Page爲單位,Page默認值爲1M,能夠在啓動時經過-I參數來指定。
- Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。其結構如圖
Memcached安裝啓動
- yum install -y epel-release
- centos6
- yum install -y libevent memcached libmemcached
- 啓動 /etc/init.d/memcached start
- centos7
- yum install -y memcached-devel libevent-devel libmemcached-devel
- 啓動 /etc/init.d/memcached start
- ps aux |grep memcached
- memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid
- 相關的參數在/etc/init.d/memcached和/etc/sysconfig/memcached中定義
Growth factor
- memcached在啓動時經過-f選項能夠指定 Growth Factor因子。該值控制chunk大小的差別。默認值爲1.25。
- 經過memcached-tool查看指定memcached實例的不一樣slab狀態,能夠看到各Item所佔大小(chunk大小)差距爲1.25
- 命令:#memcached-tool 127.0.0.1:11211 display
Memcached數據過時方式
- Lazy Expiration
memcached 內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。這種技術被稱爲lazy(惰性)expiration。所以,memcached不會在過時監視上耗費CPU時間。
- LRU
memcached會優先使用已超時的記錄的空間,但即便如此,也會發生追加新記錄時空間不足的狀況,此時就要使用名爲Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除「最近最少使用」的記錄的機制。所以,當內存空間不足時(沒法從slab class獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。
Memcached啓動時參數
- -d選項是啓動一個守護進程
- m是分配給Memcache使用的內存數量,單位是MB,這裏是200MB
- -u是運行Memcache的用戶,若是當前爲 root 的話,須要使用此參數指定用戶。
- -l是監聽的服務器IP地址
- -p是設置Memcache監聽的端口,默認是11211
- -c選項是最大運行的併發鏈接數,默認是1024
- -P是設置保存Memcache的pid文件
查看memcached運行狀態
- memcached-tool 127.0.0.1:11211 stats
- 或者echo stats |nc 127.0.0.1 11211 須要安裝nc工具 yum install -y nc
- 若安裝libmemcached後,可使用命令
- memstat --servers=127.0.0.1:11211 查看memcached服務狀態
php鏈接memcached
先安裝php的memcache擴展
# wget http://www.lishiming.net/data/attachment/forum/memcache-2.2.3.tgz
# tar zxf memcache-2.2.3.tgz
# cd memcache-2.2.3
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
安裝完後會有相似這樣的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
memcache.so opcache.a opcache.so redis.so
把這個記住,而後修改php.ini,把 extension_dir = "./" 修改成extension_dir = "/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20090626/"
並添加一行
extension="memcache.so"
添加以後檢查對不對
/usr/local/php/bin/php -m看看有沒有memcache
PHP鏈接Memcached 檢驗
/usr/local/php/bin/php -m |grep memcache
下載測試php腳本
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
/usr/local/php/bin/php 1.php
或者將1.php放到某個虛擬主機根目錄下面,在瀏覽器訪問,便可看到效果
最終能夠看到數據以下:
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
Memcached 實現session共享
本實例是在lamp/lnmp環境下實現
編輯php.ini添加兩行
session.save_handler = memcache
session.save_path = "tcp://192.168.0.9:11211"
或者httpd.conf中對應的虛擬主機中添加
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.0.9:11211"
或者php-fpm.conf對應的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.0.9:11211 "
Memcached session測試
wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /usr/local/apache2/htdocs/session.php
curl localhost/session.php
相似於1443702394<br><br>1443702394<br><br>i44nunao0g3o7vf2su0hnc5440
telnet 127.0.0.1 11211
get i44nunao0g3o7vf2su0hnc5440