memcache

Memcached

分佈式,內存緩存,服務器php

 

內存緩存:web

提供將數據緩存到內存中服務。數據在內存中,爲一個臨時的存儲器,一般做爲緩存服務器來使用,而不是數據服務器來使用。算法

緩存:將中間結果臨時存儲,就是緩存技術。數據庫

Memcache是緩存服務器,僅僅提供存儲緩存數據,而不決定什麼樣的數據存儲於緩存中。windows

 

分佈式:數組

多臺memcache服務器,組成memcache集合。緩存

 

 

安裝

Windows

下載,解壓,並拷貝到指定目錄安全

官網:http://memcached.org/服務器

Memcached的服務器端程序。網絡

 

Linux

 

Memcached服務器安裝完畢。

 

管理memcached服務器

方案一:基於CMD(命令行)的程序

經過CMD命令行,進行管理:

 

所有使用默認參數,便可開啓memcached服務器:

此時,該memcached服務器,監放任意網卡(IP),11211端口上的請求。

 

典型的選項:

-p 所監聽的端口

-l 所監聽的網卡接口

若是一臺電腦存在多個網絡鏈接,能夠指定監聽哪一個網絡的請求

 

 

方案二:針對windows

經過訪問的方式,管理memcached

選擇–d 來控制該守護進程(deamon

以管理員權限運行cmd

 

-d install安裝服務

 

-d uninstall卸載服務

 

使用Memcached

基於C/SClient-Server

剛剛memcached是服務器端軟件。

須要提供客戶端軟件。

Memcached的數據交互協議,基於文本的。所以只要可向目標服務器發送文本,便可memcached客戶端使用。例如:telnet

 

經過客戶端軟件 secureCRT來發送telnet協議,鏈接memcached服務器:

puttywindows自帶的telnet均可以)

 

Memcached數據存儲KEY-Value

一個KEY,對應一個值。

 

 

操做命令

設置

Set

Set KEY 是否壓縮 有效期 長度

 

Key                具備獨立標誌功能的字符串,長度在250個字節以內。

是否壓縮         是否將數據壓縮後進行存到服務器端。節省存儲空間(須要壓縮與解壓時間)。

有效期:             數據在服務器端存儲的有效時間。有效期的表示方式存在2種,時間間隔,時間戳。其判斷使用哪一種方式,依據有效期整數值的大小。臨界值爲: 30*24*3600 = 2592000

測試獲取:

發現e3過時,由於:超過2592000看成時間戳來處理。

 

若是須要設置超過30天的數據,則使用時間戳的形式:

Time()+間隔

長度              數據佔用的空間,單位字節。與字符集相關。

 

 

存在則替換,不存在則建立。

Add

添加

使用方式與參數與set一致。

僅僅能夠完成添加,若是key已經存在,則add失敗。

Replace

替換

使用方式與參數與set一致。

僅僅完成存在時替換。

 

Incr

Increment,遞增

將已有值,遞增N個數

get+set

Decr

Decrement,遞減

get-set

獲取

Get KEY

刪除

Delete key

刪除某個key

Flush_all

刪除所有

 

Stats

獲取當前服務器狀態信息

 

PHP操做memcached

PHP做爲memcached服務器的客戶端來使用。

加載memcached操做擴展:memcache

將擴展文件:php_memcached.dll 看拷貝到PHP的擴展目錄

修改PHP.ini增長開啓該擴展指令:

 

 

該擴展提供面向對象的操做語法:

實例化memcache對象

創建鏈接

Connect

 

設置

$mem->set(KEY, VALUE, 是否壓縮, 有效期)

$mem->add(KEY, VALUE, 是否壓縮, 有效期);

$mem->replace(KEY, VALUE, 是否壓縮, 有效期);

若是須要壓縮存儲,將flag標誌設置爲

MEMCACHE_COMPRESSED

$mem->increment();

$mem->decrement();

獲取

$mem->get(KEY);

刪除

得到統計信息

 

PHP不一樣數據類型

分紅兩類進行處理:

標量類型:

整型,浮點型,布爾型,字符串

以字符串的形式進行存儲:

非標量類型:

數組,對象,  NULL

數據類型能夠被保存,得到原始數據。可見,set方法,在判斷當前的數據爲非標量類型時,自動進行序列化存儲,獲取時完成反序列化返回。

 

分佈式的memcached

各個memcached服務器間互不通信的分佈式算法。

要求,分佈式算法(一個key 對應哪臺memcached服務器)是由客戶端決定(實現)的。

 

Memcached默認實現的是:

取模(求餘):依據服務器的數量,計算餘數,對應某臺memcached服務器。

 

使用:

 

後續的使用與基本操做是相同的:

 

 

 

注意,因爲分佈式算法是求餘算法,致使:

設置與獲取時:服務器的數量,與服務器的順序,應該匹配才能夠。

 

 

附:典型KEY求餘的實現:

經過crc32冗餘校驗算法得到一個字符串的整型冗餘值。

 

 

失效的問題討論

Memcached緩存項什麼時候會失效?(未命中)

 

狀況一:有效期控制失效。

 

須要注意:懶惰模式

當緩存項失效時(過有效期),memcached不會主動刪除該緩存項。

而是在get該緩存項時判斷是否失效,則刪除。

 

 

狀況二:刪除最近最少使用的緩存項

須要:LRU( Least Recently USE)

-m 指定使用的N兆字節

 

當新加緩存項時,空間不足,將最近最少使用的緩存項刪除,釋放空間。

 

不須要考慮的memcached問題

不是數據庫,而是緩存。

不須要作:數據持久化;數據的備份恢復。

緩存不會影響項目的業務邏輯,僅僅會影響處理速度。

 

 

 

常見的問題?

 

安全性問題?

Memcached自己沒有提供認證機制。

一般,memcached服務器都是局域網內服務器。

若是memcached服務器能夠被訪問到,經過系統上其餘軟件進行控制:

Firewall

Iptables

 

 

使用

Sessionmemcached

Session處理很是頻繁,爲了高速存儲session數據,將session數據存儲於內存中。

 

擴展memcache中,已經提供好了  memcache session存儲處理器(session.save_handler

將其設置爲 memcache就可使用session入內存了。

 

經過配置項:session.save_path 就能夠配置session數據的存儲位置,包括所使用的memcached服務器信息(集合信息)

 

 

常規使用session便可:

 

 

Tip

Memcached存儲的session數據,以session-IDKEY,序列化的數據爲值一種格式

 

總結:

存儲方式:

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



相關文章
相關標籤/搜索