lnmp架構(四)——靜態緩存之給php添加memcache(nginx+php+mysql+memcache)

一、什麼是MemCache

memcache是一套分佈式的高速緩存系統,目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著 ,這是一套開放源代碼軟件,以BSD license授權發佈。

通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高了網站訪問的速度,MemCaChe是一個存儲鍵值對的HashMap,在內存中對任意的數據(比如字符串、對象等)所使用的key-value存儲,數據可以來自數據庫調用、API調用,或者頁面渲染的結果。MemCache設計理念就是小而強大,它簡單的設計促進了快速部署、易於開發並解決面對大規模的數據緩存的許多難題,而所開放的API使得MemCache能用於Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序語言。

MemCache訪問模型
在這裏插入圖片描述
MemCache雖然被稱爲"分佈式緩存",但是MemCache本身完全不具備分佈式的功能,MemCache集羣之間不會相互通信. 與之形成對比的,比如JBoss Cache,某臺服務器有緩存數據更新時,會通知集羣中其他機器更新緩存或清除緩存數據.所謂的"分佈式",完全依賴於客戶端程序的實現,就像上面這張圖的流程一樣

從上圖,我們理出MemCache一次寫緩存的流程:

  1. 應用程序輸入需要寫緩存的數據
  2. API將Key輸入路由算法模塊,路由算法根據Key和MemCache集羣服務器列表得到一臺服務器編號
  3. 由服務器編號得到MemCache及其的ip地址和端口號
  4. API調用通信模塊和指定編號的服務器通信,將數據寫入該服務器,完成一次分佈式緩存的寫操作、讀緩存和寫緩存一樣,只要使用相同的路由算法和服務器列表,只要應用程序查詢的是相同的Key,MemCache客戶端總是訪問相同的客戶端去讀取數據,只要服務器中還緩存着該數據,就能保證緩存命中

這種MemCache集羣的方式也是從 分區容錯性 的方面考慮的,假如Node2宕機了,那麼Node2上面存儲的數據都不可用了,此時由於集羣中Node0和Node1還存在,下一次請求Node2中存儲的Key值的時候,肯定是沒有命中的,這時先從數據庫中拿到要緩存的數據,然後路由算法模塊根據Key值在Node0和Node1中選取一個節點,把對應的數據放進去,這樣下一次就又可以走緩存了,這種集羣的做法很好,但是缺點是成本比較大。

二、MemCache的工作流程

  1. 客戶端把請求先發送給代理服務器(一般是nginx)
  2. 先檢查客戶端的請求數據是否在memcached(MemCached是MemCache服務器端可以執行文件的名稱)中,如有,直接把請求數據返回,不再對數據庫進行任何操作
  3. 如果請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,需要程序明確實現)
  4. 每次更新數據庫的同時更新memcached中的數據,保證一致性
  5. 當分配給memcached內存空間用完之後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略失效數據首先被替換,然後再替換掉最近未使用的數據

三、Memcache特性和限制

  • 在 Memcached中可以保存的item數據量是沒有限制的,只要內存足夠 。
  • memcached是一種無阻塞的socket通信方式服務,基於libevent庫,由於無阻塞通信,對內存讀寫速度非常之快
  • memcached分服務器端和客戶端,可以配置多個服務器端和客戶端,應用於分佈式的服務非常廣泛

四、給php添加memcache

實驗思想
osi七層模型每一層都可以加上屬於自己的緩存,現在我們給lnmp中的php和nginx可以加上緩存,最後將mysql加上緩存,服務器一般不會把數據直接存儲在自己上面,存儲有專門的地方,交叉存儲可以保證正常運行,數據共享,都會存儲一份,本地存儲+交叉存儲當服務器和自己的存儲設備都壞了,也可以在其他服務器的存儲器上找到自己的數據,可以保證客戶正常訪問。

實驗環境

主機(版本:ip) 功用
虛擬機server1(rhel6.5:172.25.2.1) lnmp環境主機
真機(rhel7.3:172.25.2.250) 測試機

以下配置過程,是在lnmp環境搭建成功的基礎上。

1、從真機下載我之前已經下載好的memcache的安裝包,並且解壓。
在這裏插入圖片描述

tar zxf memcache-2.2.5.tgz #解壓
cd memcache-2.2.5/  #進入解壓目錄

在這裏插入圖片描述
2、將之前PHP編譯完成的二進制命令加入到環境變量中,可以直接調用PHP命令。

vim ~/.bash_profile 
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
source ~/.bash_profile 

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

3、創建編譯環境:
memcache目錄中本來沒有configure文件,所以沒法編譯,執行phpize,生成configure文件後就可以編譯了。

  • phpize是用來擴展php擴展模塊的,通過phpize可以建立php的外掛模塊,比如你想在原來編譯好的php中加入memcached或者ImageMagick等擴展模塊,可以使用phpize。或者說,phpize的作用可以這樣理解:偵測環境(phpize工具是在php安裝目錄下,基於這點phpize對應了當時的php環境,所以是要根據該php的配置情況生成對應的configure文件),建立一個configure文件。必須在一個目錄下去運行phpize。那麼phpize就知道你的的環境是哪個目錄,並且configure文件建立在該目錄下

在這裏插入圖片描述

4、編譯安裝memcachen

./configure
make && make install

在這裏插入圖片描述在這裏插入圖片描述

5、更改php主配置文件,增加memcache模塊

vim /usr/local/lnmp/php/etc/php.ini # 將memcache緩存模塊與php連接起來
873 extension=memcache.so	 #這個模塊以插件的形式運行
/etc/init.d/php-fpm reload #重新加載php

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

6、php -m | grep memcache可以看到這個模塊已經加入到php中,可以看到數據庫也與mysql關聯

php -m | grep memcache
php -m | grep mysql

在這裏插入圖片描述

7、安裝memcache工具,開啓memcache服務,監聽端口爲11211

yum install -y memcached  #安裝memcache服務,提供接口11211客戶才能用,之前只是提供一個模塊
rpm -qa | grep memcache  #查看版本
rpm -ql memcached-1.4.4-3.el6.x86_64  #查看生成的各種文件

在這裏插入圖片描述

在這裏插入圖片描述

8、編輯配置文件/etc/sysconfig/memcached

在這裏插入圖片描述

9、啓動memcached

/etc/init.d/memcached start
netstat -tlnp

在這裏插入圖片描述
在這裏插入圖片描述

10、telnet測試:

telnet localhost 11211
  • 沒有的話:yum install -y telnet

在這裏插入圖片描述在這裏插入圖片描述

11、拷貝php頁面到nginx默認發佈目錄/usr/local/lnmp/nginx/html/,並修改memcache.php內容

 [root@server1 memcache-2.2.5]# cp memcache.php example.php /usr/local/lnmp/nginx/html/
 [root@server1 memcache-2.2.5]# cd /usr/local/lnmp/nginx/html/
[root@server1 html]# ls
50x.html  bbs  example.php  index.html  index.php  memcache.php  readme  utility
[root@server1 html]# vim memcache.php 

define('ADMIN_USERNAME','memcache');    ## Admin Username(自定義)
define('ADMIN_PASSWORD','westos');      ## Admin Password(自定義)

$MEMCACHE_SERVERS[] = '172.25.230.5:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
	##只留一個主機,memcache沒有轉發或負載均衡機制,只能一個一個添加(因爲本實驗只有一個主機,其實可以添加多個)

在這裏插入圖片描述
12、訪問 http://172.25.2.1/memcache.php輸入用戶名密碼,可以查看memcache命中率,
在這裏插入圖片描述

13、再打開一個頁面訪問http://172.25.2.1/example.php,這個就相當於客戶訪問nginx(web服務器)的資源
在這裏插入圖片描述

客戶每訪問172.25.2.1/example.php一次,172.25.2.1/memcache.php的緩存就會增多

14、在真機,壓力測試,模擬5000請求量

ab -c 10 -n 5000 http://172.25.2.1/index.php 10個併發,5000個請求
	#很慢,因爲沒有緩存,而且failed比較多                

在這裏插入圖片描述

在這裏插入圖片描述

ab -c 10 -n 5000 http://172.25.2.1/example.php 10個併發,5000個請求
	#很快,因爲訪問緩存,而且沒有failed的

在這裏插入圖片描述

1. 其實這兩個php文件(index.php、example.php)都相當於放在nginx代理服務器下web資源
2. 客戶訪問的時候先去問nginx代理服務器
3. 如果請求的是靜態資源,nginx會直接將靜態緩存的資源返回給客戶
4. 如果請求的是動態資源,nginx會通過php去找fsatcgi去加載數據庫,再把資源給客戶端

客戶通過php訪問後端資源慢,客戶通過php的memcache緩存直接訪問緩存在內存中的數據很快
類似於在php服務上面加了memcache服務,就可以緩存數據,使的數據的訪問更快(也可以說是備份)memcache.php只是一個管理員的頁面而已

發佈了127 篇原創文章 · 獲贊 26 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章