分佈式,內存緩存,服務器php
內存緩存:web
提供將數據緩存到內存中服務。數據在內存中,爲一個臨時的存儲器,一般做爲緩存服務器來使用,而不是數據服務器來使用。算法
緩存:將中間結果臨時存儲,就是緩存技術。數據庫
Memcache是緩存服務器,僅僅提供存儲緩存數據,而不決定什麼樣的數據存儲於緩存中。windows
分佈式:數組
多臺memcache服務器,組成memcache集合。緩存
下載,解壓,並拷貝到指定目錄安全
官網:http://memcached.org/服務器
Memcached的服務器端程序。網絡
Linux:
Memcached服務器安裝完畢。
方案一:基於CMD(命令行)的程序
經過CMD命令行,進行管理:
所有使用默認參數,便可開啓memcached服務器:
此時,該memcached服務器,監放任意網卡(IP),11211端口上的請求。
典型的選項:
-p 所監聽的端口
-l 所監聽的網卡接口
若是一臺電腦存在多個網絡鏈接,能夠指定監聽哪一個網絡的請求
方案二:針對windows:
經過訪問的方式,管理memcached。
選擇–d 來控制該守護進程(deamon)
以管理員權限運行cmd
-d install安裝服務
-d uninstall卸載服務
剛剛memcached是服務器端軟件。
須要提供客戶端軟件。
Memcached的數據交互協議,基於文本的。所以只要可向目標服務器發送文本,便可memcached客戶端使用。例如:telnet。
經過客戶端軟件 secureCRT來發送telnet協議,鏈接memcached服務器:
(putty,windows自帶的telnet均可以)
一個KEY,對應一個值。
Set KEY 是否壓縮 有效期 長度
值
Key: 具備獨立標誌功能的字符串,長度在250個字節以內。
是否壓縮: 是否將數據壓縮後進行存到服務器端。節省存儲空間(須要壓縮與解壓時間)。
有效期: 數據在服務器端存儲的有效時間。有效期的表示方式存在2種,時間間隔,時間戳。其判斷使用哪一種方式,依據有效期整數值的大小。臨界值爲: 30*24*3600 = 2592000
測試獲取:
發現e3過時,由於:超過2592000看成時間戳來處理。
若是須要設置超過30天的數據,則使用時間戳的形式:
Time()+間隔
長度: 數據佔用的空間,單位字節。與字符集相關。
存在則替換,不存在則建立。
添加
使用方式與參數與set一致。
僅僅能夠完成添加,若是key已經存在,則add失敗。
替換
使用方式與參數與set一致。
僅僅完成存在時替換。
Increment,遞增
將已有值,遞增N個數
(get,+,set)
Decrement,遞減
(get,-,set)
Get KEY
刪除某個key
刪除所有
獲取當前服務器狀態信息
PHP做爲memcached服務器的客戶端來使用。
將擴展文件:php_memcached.dll 看拷貝到PHP的擴展目錄
修改PHP.ini增長開啓該擴展指令:
該擴展提供面向對象的操做語法:
Connect
$mem->set(KEY, VALUE, 是否壓縮, 有效期)
$mem->add(KEY, VALUE, 是否壓縮, 有效期);
$mem->replace(KEY, VALUE, 是否壓縮, 有效期);
若是須要壓縮存儲,將flag標誌設置爲
MEMCACHE_COMPRESSED
$mem->increment();
$mem->decrement();
$mem->get(KEY);
分紅兩類進行處理:
標量類型:
整型,浮點型,布爾型,字符串
以字符串的形式進行存儲:
非標量類型:
數組,對象, NULL
數據類型能夠被保存,得到原始數據。可見,set方法,在判斷當前的數據爲非標量類型時,自動進行序列化存儲,獲取時完成反序列化返回。
各個memcached服務器間互不通信的分佈式算法。
要求,分佈式算法(一個key 對應哪臺memcached服務器)是由客戶端決定(實現)的。
Memcached默認實現的是:
取模(求餘):依據服務器的數量,計算餘數,對應某臺memcached服務器。
使用:
後續的使用與基本操做是相同的:
注意,因爲分佈式算法是求餘算法,致使:
設置與獲取時:服務器的數量,與服務器的順序,應該匹配才能夠。
附:典型KEY求餘的實現:
經過crc32冗餘校驗算法得到一個字符串的整型冗餘值。
Memcached緩存項什麼時候會失效?(未命中)
狀況一:有效期控制失效。
須要注意:懶惰模式。
當緩存項失效時(過有效期),memcached不會主動刪除該緩存項。
而是在get該緩存項時判斷是否失效,則刪除。
狀況二:刪除最近最少使用的緩存項
須要:LRU( Least Recently USE)
-m 指定使用的N兆字節
當新加緩存項時,空間不足,將最近最少使用的緩存項刪除,釋放空間。
不是數據庫,而是緩存。
不須要作:數據持久化;數據的備份恢復。
緩存不會影響項目的業務邏輯,僅僅會影響處理速度。
安全性問題?
Memcached自己沒有提供認證機制。
一般,memcached服務器都是局域網內服務器。
若是memcached服務器能夠被訪問到,經過系統上其餘軟件進行控制:
Firewall
Iptables
Session處理很是頻繁,爲了高速存儲session數據,將session數據存儲於內存中。
擴展memcache中,已經提供好了叫 memcache 的session存儲處理器(session.save_handler)
將其設置爲 memcache就可使用session入內存了。
經過配置項:session.save_path 就能夠配置session數據的存儲位置,包括所使用的memcached服務器信息(集合信息)
常規使用session便可:
Tip:
Memcached存儲的session數據,以session-ID爲KEY,序列化的數據爲值一種格式
總結:
存儲方式:
1文件(默認)
2數據庫表(user)
3內存(memcached)
除了速度快,session入數據庫服務器,session入內存服務器,另外的一個優點(很重要):
多臺web服務器共享session。
例如:項目中無限分類(樹狀分類)的獲取:
獲取時過程複雜:須要遞歸完成。
分類的更新頻率:低
將獲取好的分類數據,存儲在memcached中,須要查詢時,先判斷是否已經緩存了,若是存在則完成從緩存中獲取,若是不存在,則完成從數據表中獲取,並更新緩存。
一旦緩存數據源(分類數據)變化,更新(刪除)緩存
完成該例子:
列表頁:
TP中,函數M,D
S()能夠快捷的操做緩存。
好友列表登陸狀態顯示
User_status表
User_id, is_login
23 1
45 0
Memcache:
User_23=>1
User_45=>0