Memcache講解

一.大型網站的優化方向

1.PHP+MySql的存儲缺點

在大部分的PHP的網站開發當中,咱們每每採用的數據存儲方式是php+mysql,所以就會產生以下圖所示的請求方式:php

 

 

以上的架構對通常對於訪問量不大的網站沒有任何問題,例如:我的博客網站,小公司的企業網站。然而當網站的數據量和訪問量增大以後,即便您的MySql數據庫作了很是完美的優化手段,這個架構的請求方式是不會有任何改變的。也就是說,該架構全部的讀寫操做都是實時發生的,就算你設定了讀寫分離其實也是把這一切的工做依然是實時的,所有由MySql數據庫來承受。因此這種請求方式的架構是有瓶頸的,雖說理論上你還能夠部署更多的數據庫讀寫分離來減輕壓力,就算是實時的請求也能扛得過去,但依然存在一個問題,更多的數據庫部署意味要添加更多的服務器,這個成本實際上是很高的,因此網站優化的另一個思惟就是在當前服務器中減輕數據庫的壓力,減輕訪問(鏈接)的次數,而並非不斷經過添加服務器來解決。html

2.大型網站的優化方向

1.增長服務器,設置讀寫分離(主從複製)。java

2.增長cpu,高速的IO讀寫硬盤等硬件和網絡帶寬。mysql

3.MySql層面作各項優化,如:索引優化,分表等linux

4.使用反向代理和負載均衡技術(Nginx,H3C,F5)面試

5.聘請可靠的開發技術團隊和優秀的運維團隊
6.使用NoSql做爲緩存中間層redis

 

3.NoSql的含義

NoSQL ,(Not Only SQL),泛指非關係型數據庫, 它是由一次叫「反Sql運動」的社區討論而誕生的體系。這個運動的發起最先源自於社區網站 LiveJournal的開發團隊,它們的初衷是爲了用於減小數據庫鏈接數,減輕數據庫的工做壓力,但發展至今有着其餘不一樣的應用領域,所以NoSQL處於一種所謂百家爭鳴的,各執一詞的時期。但咱們做爲NoSql的學習者和應用者,咱們不須要關心和糾結這些NoSql的爭論,也不須要參與到這些爭論當中。算法

 

NoSql的共同特色和優點:sql

NoSQL 一般是以key-value形式存儲的(如:Memcache,Redis,Mongodb) mongodb

不支持SQL語句,

沒有表結構

配置簡單

靈活、高效的操做與數據模型

低廉的學習成本

能很好地做爲MySql的中間層

能很好地支持PHP

 

NoSql的共同的缺點:

沒有統一的標準

安全性極差

沒有正式的官方支持

各類產品還不算成熟

權威支持的產品價格很高(如:阿里雲),但這個其實成本如今不少公司給得起,至少比你設置更多的讀寫分離的數據庫服務器成本仍是低了很多.

 

NoSql的產品分類:

ttServer

redis

mongodb

memcache

Aliyun MQ

KVCache(Memcache)

 

 

.Memcache的概述

1.Memcache的簡介

Memcache是國外社區網站 LiveJournal的開發團隊二次開發(加入了內置的分佈式算法) 高性能的分佈式內存緩存服務器。通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態 Web 應用的速度、提升可擴展性。

 

Memcache的優勢:

1.純內存的存儲機制,所以它是全部NoSql產品當中最簡單也是速度最快,可是同時也是功能最弱的

2.內置分佈式算法,使得開發者不須要本身去實現

3.它能把單項數據緩存的過時時間設置爲30天,也能使得單項數據常駐內存當中

4.完美支持PHP的調用

 

Memcache的缺點:

1.因爲memcache使用telnet協議進行傳輸,沒有數據加密的功能,安全性不好

2.Memcache最大的內存存儲空間(吞吐量)只有64M,若是64M的內存一旦爆滿,Memcache會指定重啓,並釋放當前全部的內存,在內存數據就是無情的丟失也不會保留。

3.因爲Memcache把數據置於內存中,因此服務器進行維護或者重啓,那麼數據就會丟失

4.數據零散,沒法遍歷,管理數據完整性很是通常.

 

 

 

Memcache的使用注意事項:

1.不要把安全性,敏感性,具備明文性太高的數據放到memcache當中

2.使用數據時候要注意壓縮,儘可能使用一些小型的數據進行存儲(產品分類,文章欄目,用戶登陸的信息,計數器的結果,用戶屬性)

Memcache的存儲格式:key=>value(鍵值對的存儲方式)

Memcache在國內職場中的使用場景:

 

 

 

2.PHP + Memcache + MySql的架構圖(lanmp):

lanmp = linux + apache + nosql + mysql + php

 

 

當前方式是客戶端(用戶瀏覽器)發起請求,這時這種架構的請求方式,咱們稱爲非實時請求,那麼每一次的請求必須經過中間的緩存層面進行,若是緩存中有數據,那麼數據庫就不會作出任何的響應,若是沒有緩存的數據,數據庫只會響應一次,並把響應的結果放到內存中等待用戶下一次的請求。

三.Memcache的安裝

1.安裝包介紹

memcached:這個表示memcache的rpm軟件包,用於實現memcache服務器安裝

telnet:這個表示telnet客戶端的rpm軟件包,這個包的安裝用於實現客戶端鏈接memcache服務器

telnet-server:這個表示telnet的服務器端rpm軟件包,這個包的安裝用於實現telnet客戶端的啓動

 

2.安裝說明

安裝memcache這3個包必須一塊兒安裝,而不能分開安裝,不然他們依賴關係你須要本身解決

3.使用yum進行memcache的安裝

安裝的命令: yum -y install memcached telnet telnet-server

使用(putty)執行命令安裝過程以下:

登陸完成後輸入yum -y install memcached telnet telnet-server

 

 

 

注意事項:putty操做memcache特別的好用,可是不是表明只能使用putty執行以上的安裝命令,你也可使用xshell或者其餘工具執行這個命令,然而xshell操做memcache不太好使。

.啓動Memcache的服務器

memcache服務器中,若是但願能正常的啓動memcache,而且能夠在客戶端正常的鏈接memcache服務器,那麼須要啓動memcached和xinetd的服務器。

memcached的說明:memcached是memcache服務器的守護進程,負責memcache服務器的啓動,重啓,關閉和狀態的監控。其管理命令以下:

#啓動memcache服務器

service memcached start

#重啓memcache服務器

service memcached restart

#中止memcache服務器

service memcached stop

#查看守護進程的狀態

service memceched status

#把memcached加入開機腳本

chkconfig memcached on

  

注意事項:若是重啓或者中止memcache服務器,那麼在memcache中存儲的數據就會立刻丟失,沒法恢復。

xinetd的說明: xinetd是telnet服務器的守護進程,負責telnet客戶端能夠正常鏈接memcache服務器,默認的狀況下佔據11211端口

#啓動telnet服務器

service xinetd start

#重啓telnet服務器

service xinetd restart

#中止telnet服務器

service xinetd stop

#查看守護進程的狀態 

service xinetd status

#把xinetd加入開機腳本

chkconfig xinetd on

 

注意事項:xinetd重啓或者中止,並不會致使memcache的數據丟失,但客戶端會沒法鏈接memcache服務器。因此若是想維護memcache服務器,那麼能夠中止telnet服務器

五.使用telnet鏈接Memcache

首先要清楚的知道,telnet和memcached必定要處於啓動的狀態,而且要知道當前的默認端口爲11211

 

2步:若是沒有啓動xinetd和memcache須要啓動,命令以下;

service memcached start

service xinetd start

 

2步:使用telnet客戶端進行memcache服務器的鏈接

命令格式: telnet [memcache的服務器地址] [端口]

 

 

注意事項:若是剛打開telnet客戶端敲入回車鍵,那麼會出現ERROR,這時並非表明鏈接失敗,而是由於memcache服務器在等待您輸入正確的指令,而回車鍵並非一個正確的指令,因此它會報出ERROR的錯誤

六.Memcacheget,add,set,delete命令

1.get命令

這個命令用於獲取memcache內存中的數據

命令格式: get [鍵名(key)]

好比:若是但願獲取一個爲name的鍵名,可使用命令: get name

 

 

若是key不存在那麼就會以END結束,若是key存在,那麼返回以下所示:

 

 

2.add命令

這個命令就是像memcache的內存當中的某一個值添加數據,然而它在現實開發當中不多用,通常咱們會用set直接取代它的操做,因此這個命令你只須要了解就能夠了,

命令格式:add 鍵名 標識符 過時時間 字節的大小

說明:

標識符:通常只會填入1,也能夠填寫2,也能夠999,也能夠填寫888,隨便亂填但不能夠是負數和0,也不能夠是中文和特殊字符,只能是正整數

過時時間:0表明永遠不過時,其他請求就是以秒做爲單位,如:設爲30,表明30秒後過時。

最大秒數能夠設置爲30*86400=30天

字節大小:就是打算添加的數據有多大,如:設爲3,表明輸入3個字節

使用add命令一個鍵名爲name的數據,鍵值爲php

命令的運行效果以下圖所示:

add name 1 0 3

 

 

3.set命令

這個命令在開發當中使用的頻率是100%,它做用很特別,若是一個鍵名已經存在那麼set命令會修改該鍵名的值,若是該鍵名不存在那麼set會建立這個鍵名的值,因此set既能夠添加也能夠修改,所以add就意義不大,由於add只能添加而不可以修改。

其命令格式: set 鍵名 標識符 過時時間 字節的大小

說明:

標識符:通常只會填入1

過時時間:0表明永遠不過時,其他請求就是以秒做爲單位,如:設爲30,表明30秒後過時

字節大小:就是打算添加的數據有多大,如:設爲3,表明輸入3個字節

命令的運行效果以下圖所示:

1.set修改一個已經存在的鍵名,如:name

 

 

執行結果以下:

 

 

若是使用set命令,在memcache中操做一個已經存在的key那麼就是修改的行爲

set name 1 0 4 : 修改一個已經存在的鍵名爲4個字節而且永遠不過時

java : 修改name中的值

STORED  : 表明寫入成功

 

2.set添加一個不存在的鍵名,如:project

 

 

執行結果以下:

 

 

發覺set命令若是操做一個不存在的key,那麼其就是建立的行爲

set project 1 0 6 : 添加不能存在的鍵名爲project,其實大小爲6個字節而且永遠不過時

lovely : 添加project中的值

STORED  : 表明寫入成功

面試題:add和set有啥區別?

若是add操做的key已經存在,那麼就會報錯

 

 

set不會報錯,而是修改爲功

 

 

所以咱們使用set概率是100%

 

4.delete命令

這個命令就是刪除 memcache在內存中的鍵,若是把鍵名刪除了,那麼對應的值也刪除了,內存所佔據大小呢也釋放了

命令格式:delete 鍵名(能夠存在也能夠不存在)

命令的運行效果以下:

若是刪除一個不存在的Key,那麼會報出NOT_FOUND

 

 

若是刪除成功就會釋放當前的內存空間大小,而且報出DELETED

 

 

 

總結:以上實現增刪查改的命令後,我發覺putty的界面很是飽滿,咱們可以清屏嗎?

 

 

另一個問題,若是我想退出memcache怎麼呢?沒法退出,因此只能關閉putty.

問題來了:那麼putty不能夠清屏也不能退出,那麼爲何還要使用Putty而不使用xshell,其實xshell比putty更難用,所以咱們通常使用putty.

 

 

關閉putty數據會被清空嗎?由於關閉ssh工具不會關閉memcached的服務,若是但願數據被清空,那麼若是咱們使用service memcached restart會被清空嗎?

 

 

這時,若是從新鏈接memcache服務器,那麼發覺數據就會被清空,以下所示:

 

 

因此重啓或中止memcached的服務都會致使數據丟失,所以memcache不能存儲敏感且重要的數據

若是咱們關閉xinetd服務(telnet協議),那麼memcache還會被清空數據嗎?

關閉telnet不會致使memcache的數據丟失,所以咱們若是但願維護memcache中的數據,咱們能夠關閉xinetd

5.過時時間

memcache的過時時間通常用於add命令和set命令當中,過時時間以秒做爲單位,0表示永遠不過時,永遠不過時的數據會永遠佔據着內存的空間,直到刪除鍵名或者memcache重啓時纔會被釋放,所以設置一個永遠不過時的鍵名須要深思熟慮。使用過時時間的設置,能夠有效的節省內存的空間。

通常設置過時時間,雖然理論上也可使用add命令,然而因爲set命令具有add命令的功能,且set命令自己具有修改的功能,所以咱們在設置過時時間時,使用set命令的概率是最高的。

其命令格式: set 鍵名 標識符 過時時間 字節的大小

其實這個命令關鍵點就是過時時間的參數不能設置爲0和小數點,必須爲正整數

好比說:把一個爲project2的鍵名的值設置爲20秒內過時,可使用如下方式:

set project2 1 20 6

 

 

 

 

6.setadd的注意事項

memcache當中,memcache默認的最大存儲內存空間爲64M,而memcache對單個鍵名的存儲的空間最大爲1M,因此設置鍵名的時候,要合理的分配字節的大小,而後memcache分配字節大小是很是嚴格的,好比說,你分配了一個爲3個字節大小的鍵名,若是你使用的時候超過3個字節或者有時候不足3個字節那麼memcache就會報錯。

1.設置一個爲project3,字節大小爲3,永遠不過時的鍵名,其值爲java(超過3個字節),這時因爲java的值是4個字節,超過了3個字節的存儲空間,這時memcache就會報錯,效果以下:

 

 

2.設置一個字節的大小爲3個字節,可是咱們輸入的數據爲2個字節,以下所示:

 

 

3.設置一個字節的大小爲8個字節,可是咱們輸入的數據爲4個字節,以下所示:

 

 

以上現象很是的奇葩,很差控制,因此咱們在開發中,通常要預估數據的字節大小,輸入的字節是多少那麼就鍵入多少,不要形成浪費

 

思考題:若是我但願把Memcache當中全部的數據清除,釋放掉內存,咱們應該怎麼作呢?

1)暴力關閉或者重啓linux或者關閉或者重啓memcached服務

2)若是僅僅但願在業務當中放棄全部的key,那麼咱們可使用flush_all命令

 

 

 

以上的操做咱們所有都是發生在命令行當中,那麼若是咱們但願在php當中操做memcache,那麼咱們還須要安裝memcache的擴展,可是咱們若是從php的官方文檔中搜索memcache,你會發覺有兩個memcache的相關類一個叫memcache一個叫memcached,這二者有什麼區別,咱們更應使用哪個呢?

.PHP中安裝Memcache的擴展

1.memcache類和memcached類的區別

若是咱們打開http://www.php.net搜索memcache關鍵字會出現如下狀況,如圖所示:

 

 

memcache和memcached是的功能是同樣的.

memcache類支持php5.3 - php5.6的單服務器和多服務器的操做但多服務器的操做在Linux操做系統中兼容性會出現bug.爲了在Linux中很好地兼容服務器的操做php官方推出了一個叫memcached的類,該類只能運行在Linux操做系統當中支持Linux的單服務器和多服務器操做,若是你使用Linux操做系統做爲服務器必須使用Memcached類.

由於Memcached類是基於一個叫libmemcached的庫,這個庫是用C語言開發的在Linux當中運行的效率最高.

4.安裝memcachememcached兩個擴展

您能夠同時安裝這兩個類,若是當前是php5.6那麼咱們還須要用到memcached的addServer方法來作分佈式服務器的鏈接,安裝的命令以下:

yum install -y --enablerepo=remi --enablerepo=remi-php56 libmemcached php-pecl-memcache php-pecl-memcached

 

1步:在putty或者xshell當中鍵入如下命令,進行php擴展安裝,命令以下所示:

yum install -y --enablerepo=remi --enablerepo=remi-php56 libmemcached php-pecl-memcache php-pecl-memcached

 

 

出現如下界面,表明memcache和memcached的擴展庫已經完成了安裝

 

 

2步:安裝完成後,必須重啓apache服務器,重啓的命令:service httpd restart

 

 

3步:重啓apache服務器完成後,須要從新在瀏覽器端訪問phpinfo.php這個文件查在apache的站點目錄/var/www/html編寫phpinfo.php,運行後以下:

 

 

 

 

看是否已經存在memcache和memcached的擴展模塊,出現如下界面,就表明安裝成功:

 

 

八.Memcached類的經常使用方法說明

重要方法:

addServer(host,port):host就是linux服務器的地址,port通常就是11211(memcached的端口),用於鏈接memcached服務器

set(key,value,exipre) : 用於修改或者添加內存的memcached數據,該方法有3個參數

key鍵名,value是鍵值,exipre是過時時間,exipre默認爲0,若是設置爲秒,最大隻能設置爲30天秒數

get(key):獲取對於鍵值對

delete(key):刪除memcached當中鍵值對

1.使用addServer方法鏈接memcache服務器

詳細代碼參考code/addServer.php,上傳代碼到/var/www/html中進行測試

 

 

測試結果以下圖所示:

 

 

2.set方法設置Memcache中的值

詳細代碼參考code/set.php,上傳代碼到/var/www/html中進行測試

memcache中建立一個叫作phper的鍵名,值爲jimmy

 

 

若是該key在15秒後過時,那麼咱們能夠把代碼設置爲以下:

 

 

 

測試結果以下圖所示:

 

 

telnet客戶端的結果以下:

 

 

若是15秒過時後,就查不到結果了:

 

 

 

3.使用get方法獲取Memcache中的鍵值

詳細代碼參考code/get.php,上傳代碼到/var/www/html中進行測試

 

 

以上操做若是獲取的數據在memcached命令行中setkey是沒有辦法正常獲取,會返回 0或者白屏現象,除非把標識符設置爲0

 

 

若是使用php去set,而後在同時get那麼就不會存在任何的問題

 

 

測試結果以下圖所示:

 

 

telnet客戶端的結果以下:

 

 

4.使用delete刪除Memcache中的鍵名

詳細代碼參考code/delete.php,上傳代碼到/var/www/html中進行測試

1步:使用php先set一個key,而後刪除

 

 

telnet客戶端的結果以下:

 

 

去掉註釋進行刪除,結果以下:

 

 

php本身set的key是能夠成功delete的

 

2步:使用memcached先set一個key,而後刪除

 

 

修改delete.php的代碼以下:

 

 

執行結果以下:

 

 

發覺php的delete方法能夠刪除memcache命令行中set的key,不須要理會這個能夠key的標識符

.Memcache存儲PHP各類數據類型

1.php中的9種數據類型回顧

標量類型(4種):string int boolean float

複合類型(2種):array object

特殊類型(3種): 序列化數據resource null

 

 

2.存儲php中的標量類型

詳細代碼參考code/biaoliang.php,上傳代碼到/var/www/html中進行測試

 

 

測試結果以下圖所示:

 

 

memcache可以實現自動的數據類型轉化,查看telnet的結果以下:

 

 

3.存儲php中的複合類型(arrayobject)

①測試複合類型數組的存儲,代碼以下所示:

詳細代碼參考code/mix_array.php,上傳代碼到/var/www/html中進行測試

 

 

 

測試結果以下圖所示:

 

 

telnet客戶端的結果以下:

 

 

②測試複合類型對象的存儲,代碼以下所示:

詳細代碼參考code/mix_object.php,上傳代碼到/var/www/html中進行測試

詳細代碼參考code/mix_object2.php,上傳代碼到/var/www/html中進行測試

 

 

 

 

 

 

 

測試結果以下圖所示:

查看php的set結果

 

 

 

查看php的get結果

 

 

 

 

 

4.存儲php中的特殊類型

①測試特殊類型序列化的存儲,代碼以下所示:

詳細代碼參考code/serialize.php,上傳代碼到/var/www/html中進行測試

 

 

 

測試結果以下圖所示:

 

 

因爲序列化後的內容是string因此至關於你把序列化內容用標量string進行存儲,因此memcache的返回在序列化中就是返回string,所以若是你須要反序列化就能夠直接調用unserialize方法:

 

 

測試結果以下:

 

 

說明:在現實開發當中把null值和resource的類型值存放在memcache當中的意義是不大,所以特殊類型的存儲只須要關心序列化的存儲操做。

十.登陸優化

在網站當中咱們作登陸通常都是讀操做,好比有一個用戶名爲zhangsan登陸網站,那麼咱們一般的語句爲select * from users where username=’zhangsan’,因而username咱們通常會設置索引字段。這時有2個這樣的優化手段:

1)前綴索引

2)使用memcache+前綴索引進行優化

1.什麼是前綴索引

在開發的過程當中,默認的狀況下若是你對一個字段進行索引,那麼mysql會根據字段的最大字符的長度進行索引。有以下記錄:

zhangsan

lisi

wangwu

假設對這3條數據進行索引咱們會使用如下的語句

create index uname on tableName(username),這時uname的長度有多少呢?

長度就是按最大的字符長度zhangsan來取值因此索引的長度等於8個字符,發覺lisi用戶8個字符,wangwu也用不上8個字符的索引,所以就形成索引的空間浪費,致使MYI文件增大,由於就有前綴索引的說法,假設有如下用戶:

張三

李四

王五

其實對於以上的用戶來講,咱們只需呼叫其姓氏就可以定位某一個具體用戶,因此前綴索引的定義就是若是索引的某一個長度已經足以標識一個記錄的全部值,那麼咱們就把索引成爲前綴索引,好比:張能夠標識張三,張就是一個前綴索引。若是須要實現前綴索引咱們能夠參考如下例子:

1步:把demo.sql文件上傳到Linux服務器當中的任意目錄,而後使用mysql的導入方式進行數據的導入,以下圖所示:

 

 

查詢結果以下:

 

 

 

每一條數據都是惟一的,而且該表也沒有創建任何的索引,因此須要對該表進行前綴因此的創建以節省索引的空間,所以咱們創建前綴,那麼前綴索引的長度應該是多少呢?假設不知道咱們就須要去求出前綴索引的長度

2步:用肉眼查看發覺David Williamson是最長的記錄,所以咱們說若是咱們假設用前綴長度5,7,9來對數據進行呼叫那麼是否能夠成功定位出每條惟一的數據呢?編寫select語句以下,分別統計5,7,9這3個數字的前綴:

 

 

所以5位的長度是不成立的,沒法成爲前綴索引的長度。

 

 

所以7位的長度是不成立的,沒法成爲前綴索引的長度。

 

 

9是索引的長度,若是使用David Williamson來做作索引的長度是16位,9位可以大大節省7個字符的長度,所以咱們求出了前綴索引最優的長度是9,因此咱們就可使用9來創建前綴索引.

3步:使用前綴索引創建語法以下:

alter table 表名 add index 索引名稱(字段名稱(長度));

執行語句以下所示:

 

 

 

4步:使用explain查看是否可以使用前綴索引

explain select * from users where username=’David Williamson’

 

 

發覺前綴索引是能夠被9個長度所使用的,這時其實咱們只是在數據庫的層面優化了索引,可是不管數據庫作了多好優化,若是中間沒有一個緩存的層面,那麼全部的壓力和響應都會發生在數據庫當中,數據庫必定須要去硬盤當中查找數據,無論數據是否存在,由於咱們能夠減小數據庫壓力,令數據庫能夠獲得休息的時間。

 

2.使用memcache+前綴索引進行登陸優化

咱們明白前綴索引的原理後,咱們能夠設計用戶表以下:

 

 

編寫php的優化登陸代碼以下:

 

 

測試以下:

 

 

 

 

十一.使用memcache實現session入庫共享

1.查看session的默認存儲方式

 

 

session在默認的狀況下以文件的方式放在Linux當中,因此session.save_handlerfiles

每個session其實就指代一個訪問網站的用戶,若是網站的訪問量不少,那麼就會嘗試不少的session文件,session.save_path目錄中(/var/lib/php/session),那麼文件增多就會致使硬盤的IO讀寫壓力過大,而且會佔據服務器不少的硬盤空間,所以咱們能夠優化session的存儲方式爲memcache,首先咱們先編寫代碼來查看session的默認存儲方式

2.PHP中修改session的存儲到memcache

首先,通過分析咱們知道session.save_handler是表明sesession默認存儲方式爲files,而存儲的文件路徑記錄在session.save_path當中,放置在linux服務器中/var/lib/php/session,在phpinfo當中以下圖所示

 

1.編寫php文件(code/default_session.php)查看默認的存儲結果,代碼以下圖所示

 

 

在瀏覽器中發覺session_id以下圖所示

 

 

linux的putty中切換到/var/lib/php/session中,該目錄是session默認的存儲目錄,進行ls -lh的查看結果以下圖所示:

 

 

打開該文件,工做目錄在/var/lib/php/session下使用vim打開進行查看

內容以下圖所示:

 

 

 

 

所以足以證實session是存放在文件當中的,而這個缺點也是顯而易見的。

2.因爲file的存儲讀取內容比內存慢,且佔據硬盤的空間,因此咱們須要 修改session默認存儲方式由files變爲memcache,以下圖所示:

詳細代碼參考code/mem_session.php,上傳代碼到/var/www/html中進行測試

修改session存儲方式能夠經過修改session.save_handler去改變

修改memcache的鏈接方式能夠經過修該session.save_path去改變

 

 

 

 

把代碼上傳到/var/www/html下進行測試:

在正式使用瀏覽器測試以前,首先爲了確保實驗的正確性那麼必須先刪除/var/lib/php/session目錄下全部的文件,以便於您的觀察,若是php代碼運行後,該目錄不會在產生文件,而且memcache當中會出現session的鍵名和鍵值內容,那麼就表明session成功的存儲到memcache當中去了。因此必須遵循如下步驟

 

第一步:cd /var/lib/php/session下刪除全部的文件

 

 

確認工做目錄完成後,使用rm -rf *刪除全部的文件

第二步:在瀏覽中訪問mem_session.php,結果以下圖所示:

 

 

出現以上結果,立刻去查看linux中的/var/lib/php/session下是否存在一個文件,使用命令ls -lh

 

 

 

第三步:複製瀏覽器中的session_id

 

 

而後在telnet客戶端使用get iafcuise2jdmk5p2bvgftkevg1進行查看

由於session會用session_id做爲memcache的鍵名對 session中的內容進行存儲,以下圖所示;

 

 

出現以上結果,表明session成功的存儲到memcache當中,速度會獲得大大的提高。

若是用戶長時間不操做,默認的狀況下大概是30分鐘左右,那麼memcache就會把session_id的鍵名刪除。

十一.搭建分佈式的Memcache服務器

分佈式的意思其實就創建1個以上的數據庫,分佈在不一樣的服務器當中,因此讀寫分離和主從複製的MySql數據庫服務器又能夠稱爲MySql分佈式數據庫,但MySql的讀寫分離你是須要本身實現的,而且你須要清楚的知道哪臺服務器是負責寫,哪臺服務器負責讀.

部署分佈式的過程,其實就是克隆服務器Slave的過程,由於咱們在數據庫讀寫分離的Grant用戶受權中已經克隆了一臺Slave服務器,因此Slave的克隆咱們在這裏能夠省略了.`然而你依然須要注意如下幾點:

1點:

Master和Slave這時在分佈式服務器當中他們屬於平級的服務器,沒有因此誰只能讀誰只能寫的區分,Master和Slave服務器在Memcache服務器中是可讀可寫的,也就是說能夠隨便的讀寫,由於Memcache的內置一個分佈式的算法,可以清楚的區分數據在哪一個服務器當中,因此在Memcache中這個是一個很是方便的,也不須要你配置任何文件更沒有什麼主從複製的過程,這也是Memcache很特別的一點.其實由於Memcache的數據是緩存數據是臨時性的,因此Memcache開發者認爲主從複製沒意義,因此他們經過分佈式算法來管理數據.

2點:

Master和Slave服務器必須同時都關閉了iptables和selinux,不然分佈式是不會成功

3點:

Master和Slave服務器必須同時都安裝了Memcached的服務器而且開啓了該服務

而且要肯定Master的服務器IP和Slave服務器IP

Master的IP爲: 192.168.84.197

Slave的IP爲:192.168.84.85

完成上述3點那麼memcache的分佈式服務器就部署成功了。

十二.php中使用操做分佈式服務

詳細代碼參考code/master.php,上傳代碼到Master服務器當中/var/www/html中進行測試

master服務器當中插入一條memcache的數據以下:

 

 

這條數據在Master服務器當中

telnet當中查看master的數據以下:

 

 

詳細代碼參考code/slave.php,上傳代碼到Master服務器當中/var/www/html中進行測試

 

 

這條數據在Slave服務器當中

telnet當中查看slave的數據以下:

 

 

這時兩條數據在不一樣的服務器當中,咱們若是但願查找name2這個數據,那麼memcache可否清楚知道name2在slave服務器當中呢,同理若是咱們但願查找name1這個數據,那麼memcache可以否清楚知道這個數據在master服務當中?這個答案是確定的,由於memcache內置了一種分佈式的算法,可以清楚知道當前的數據在哪一個服務器當中而不須要開發這本身去編寫代碼進行尋找,php分佈式的操做代碼以下:

 

1)獲取name2的數據

詳細代碼參考code/getFromServers,上傳代碼到Master服務器當中/var/www/html中進行測試

 

 

測試結果以下:

 

 

2)獲取name1的數據

 

 

測試結果以下:

 

至此php操做memcache分佈式就成功了。

 

 

十三.thinkphp當中操做memcache

建議使用thinkphp3.2.3,由於這個版本是tp的經典版本,使用的用戶最多

1步:部署thinkphp3.2.3到lamp當中

 

 

在瀏覽器中運行thinkphp安裝

 

2步:若是但願操做memcache就須要使用到S方法,那麼首先在Application/Common/Conf/config.php文件中配置memcache以下所示:

 

 

 

3:IndexController.class.php文件中定義memcachedS操做方法,以下:

 

 

測試效果以下:

 

 

 

 

 

4:使用S方法獲取memcache中的數據到網頁中顯示

 

 

 

 

 

 

5:使用S方法刪除memcache中的數據

 

相關文章
相關標籤/搜索