溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

發(fā)布時(shí)間:2020-07-09 12:59:30 來(lái)源:網(wǎng)絡(luò) 閱讀:491 作者:warrent 欄目:建站服務(wù)器

博文大綱:
一、MemCache簡(jiǎn)介

  • 1、協(xié)議
  • 2、事件處理
  • 3、存儲(chǔ)方式
  • 4、通信分布式
  • 5、memcached的應(yīng)用場(chǎng)景
  • 6、memcached應(yīng)用中的工作流程
  • 7、memcached的一致性Hash算法
    二、部署LNMP動(dòng)靜分離&&memcache緩存服務(wù)器
  • 1、環(huán)境準(zhǔn)備
  • 2、部署Nginx服務(wù)器
  • 3、部署PHP服務(wù)器
  • 4、部署MySQL數(shù)據(jù)庫(kù)
  • 5、部署Memcached服務(wù)器
  • 6、部署memcache客戶端
  • 7、使用 memcache 實(shí)現(xiàn) session 共享
  • 8、測(cè)試memcached緩存數(shù)據(jù)庫(kù)

一、MemCache簡(jiǎn)介

MemCache 是一個(gè)自由、源碼開放、高性能、分布式的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)的負(fù)載。它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù),從而提高了網(wǎng)站訪問(wèn)的速度。 MemCaChe 是一個(gè)存儲(chǔ)鍵值對(duì)的 HashMap,在內(nèi)存中對(duì)任意的數(shù)據(jù)(比如字符串、對(duì)象等)所使用的 key-value 存儲(chǔ),數(shù)據(jù)可以來(lái)自數(shù)據(jù)庫(kù)調(diào)用、API調(diào)用,或者頁(yè)面渲染的結(jié)果。MemCache 設(shè)計(jì)理念就是小而強(qiáng)大,它簡(jiǎn)單的設(shè)計(jì)促進(jìn)了快速部署、易于開發(fā)并解決面對(duì)大規(guī)模的數(shù)據(jù)緩存的許多難題,而所開放的 API 使得 MemCache用于 Java、C/C++/C#、Perl、Python、PHP、Ruby 等大部分流行的程序語(yǔ)言。
另外,說(shuō)一下為什么會(huì)有 Memcache 和 memcached 兩種名稱?其實(shí) Memcache 是這個(gè)項(xiàng)目的名稱(也時(shí)它客戶端的名稱),而 memcached 是它服務(wù)器端的主程序文件名。

memcached是一個(gè)鍵/值系統(tǒng),系統(tǒng)相對(duì)于MySQL簡(jiǎn)單很多,雖然MySQL也有緩存,但是數(shù)據(jù)庫(kù)的SQL解析會(huì)耗費(fèi)性能,查詢慢于memcached,另外MySQL的緩存設(shè)計(jì)得更加復(fù)雜,因?yàn)橐紤]事務(wù),日志,存儲(chǔ)引擎等模塊,它的性能也沒(méi)有memcached好。

memcached只做一件事情,簡(jiǎn)單高效,在cache上比MySQL強(qiáng),這應(yīng)該容易理解。

memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn):

  • 協(xié)議簡(jiǎn)單;
  • 基于libevent的事件處理;
  • 內(nèi)置內(nèi)存存儲(chǔ)方式;
  • memcached不互相通信的分布式。

1、協(xié)議

memcached的服務(wù)器客戶端通信并不使用復(fù)雜的XML等格式,而使用簡(jiǎn)單的基于文本行的協(xié)議。
因此,通過(guò)telnet也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)。

2、事件處理

libevent是個(gè)程序庫(kù),它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口。即使對(duì)服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。memcached使用這個(gè)libevent庫(kù),因此能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能。

3、存儲(chǔ)方式

為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。memcached本身是為緩存而設(shè)計(jì)的服務(wù)器,因此并沒(méi)有過(guò)多考慮數(shù)據(jù)的永久性問(wèn)題。

4、通信分布式

memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒(méi)有分布式功能。各個(gè)memcached不會(huì)互相通信以共享信息。那么,怎樣進(jìn)行分布式呢?這完全取決于客戶端的實(shí)現(xiàn)。

5、memcached的應(yīng)用場(chǎng)景

1)數(shù)據(jù)庫(kù)的前端緩存應(yīng)用:讓它來(lái)分擔(dān)數(shù)據(jù)的并發(fā)壓力,當(dāng)數(shù)據(jù)更新時(shí),可以使程序通知緩存進(jìn)行更新
2)session會(huì)話共享的共享存儲(chǔ)

6、memcached應(yīng)用中的工作流程

它是一種內(nèi)存緩存,可通過(guò)API的方式讀取內(nèi)存中緩存的這些數(shù)據(jù),當(dāng)用戶需要讀取數(shù)據(jù)時(shí),會(huì)首先訪問(wèn)memcached緩存,如果緩存中有數(shù)據(jù)就直接返回給前端的應(yīng)用程序,如果沒(méi)有,再轉(zhuǎn)發(fā)給后臺(tái)端的服務(wù)器,這時(shí)服務(wù)器除了返回?cái)?shù)據(jù)給用戶,就會(huì)將數(shù)據(jù)更新給memcached緩存。

如果實(shí)際生產(chǎn)環(huán)境中,緩存服務(wù)器需要重啟(或者斷電),那么緩存中的數(shù)據(jù)將會(huì)丟失,那么這時(shí)替換的服務(wù)器并發(fā)壓力會(huì)擴(kuò)大,可能會(huì)導(dǎo)致引入的服務(wù)器也跟著停機(jī),無(wú)法提供服務(wù),那么這時(shí)我們的處理流程是這樣的:
首先從負(fù)載均衡中將WEB應(yīng)用停掉- - - >讓負(fù)載均衡不再轉(zhuǎn)發(fā)數(shù)據(jù)給WEB - - >接著啟動(dòng)緩存服務(wù)器- - - - > 通過(guò)程序把數(shù)據(jù)庫(kù)的內(nèi)容初始化到緩存服務(wù)器中- - - - >然后將網(wǎng)頁(yè)應(yīng)用啟用- - - - >重啟數(shù)據(jù)庫(kù)服務(wù)器

7、memcached的一致性Hash算法

一致性 Hash 算法通過(guò)一個(gè)叫做一致性 Hash 環(huán)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) Key 到緩存服務(wù)器的 Hash 映射。簡(jiǎn)單地說(shuō),一致性哈希將整個(gè)哈希值空間組織成一個(gè)虛擬的圓環(huán)(這個(gè)環(huán)被稱為一致性Hash 環(huán)),如假設(shè)某空間哈希函數(shù) H 的值空間是 0~2^ 32 -1(即哈希值是一個(gè) 32 位無(wú)符號(hào)整型),整個(gè)哈??臻g如下:

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

下一步將各個(gè)服務(wù)器使用 H 進(jìn)行一個(gè)哈希計(jì)算,具體可以使用服務(wù)器的 IP 地址或者主機(jī)名作為關(guān)鍵字,這樣每臺(tái)機(jī)器能確定其在上面的哈希環(huán)上的位置了,并且是按照順時(shí)針排列,這里我們假設(shè)三臺(tái)節(jié)點(diǎn) memcache經(jīng)計(jì)算后位置如下:

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

接下來(lái)使用相同算法計(jì)算出數(shù)據(jù)的哈希值 h,并由此確定數(shù)據(jù)在此哈希環(huán)上的位置。假如我們有數(shù)據(jù) A、B、C、D、4 個(gè)對(duì)象,經(jīng)過(guò)哈希計(jì)算后位置如下:

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

根據(jù)一致性哈希算法,數(shù)據(jù) A 就被綁定到了 server01 上,D 被綁定到了 server02 上,B、C在 server03 上,是按照順時(shí)針找最近服務(wù)節(jié)點(diǎn)方法。

這樣得到的哈希環(huán)調(diào)度方法,有很高的容錯(cuò)性和可擴(kuò)展性:
假設(shè) server03 宕機(jī):

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

可以看到此時(shí) C、B 會(huì)受到影響,將 B、C 節(jié)點(diǎn)被重定位到 Server01。一般的,在一致性哈希算法中,如果一臺(tái)服務(wù)器不可用,則受影響的數(shù)據(jù)僅僅是此服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即順著逆時(shí)針?lè)较蛐凶哂龅降牡谝慌_(tái)服務(wù)器)之間數(shù)據(jù),其它不會(huì)受到影響。
考慮另外一種情況,如果我們?cè)谙到y(tǒng)中增加一臺(tái)服務(wù)器 Memcached Server 04:

LNMP動(dòng)靜分離&&memcache緩存服務(wù)
此時(shí) A、D、C 不受影響,只有 B 需要重定位到新的 Server04。一般的,在一致性哈希算法中,如果增加一臺(tái)服務(wù)器,則受影響的數(shù)據(jù)僅僅是新服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即順著逆時(shí)針?lè)较蛐凶哂龅降牡谝慌_(tái)服務(wù)器)之間數(shù)據(jù),其它不會(huì)受到影響。

綜上所述,一致性哈希算法對(duì)于節(jié)點(diǎn)的增減都只需重定位環(huán)空間中的一小部分?jǐn)?shù)據(jù),具有較好的容錯(cuò)性和可擴(kuò)展性。
一致性哈希的缺點(diǎn):在服務(wù)節(jié)點(diǎn)太少時(shí),容易因?yàn)楣?jié)點(diǎn)分部不均勻而造成數(shù)據(jù)傾斜問(wèn)題。我們可以采用增加虛擬節(jié)點(diǎn)的方式解決。
更重要的是,集群中緩存服務(wù)器節(jié)點(diǎn)越多,增加/減少節(jié)點(diǎn)帶來(lái)的影響越小,很好理解。換句話說(shuō),隨著集群規(guī)模的增大,繼續(xù)命中原有緩存數(shù)據(jù)的概率會(huì)越來(lái)越大,雖然仍然有小部分?jǐn)?shù)據(jù)緩存在服務(wù)器中不能被讀到,但是這個(gè)比例足夠小,即使訪問(wèn)數(shù)據(jù)庫(kù),也不會(huì)對(duì)數(shù)據(jù)庫(kù)造成致命的負(fù)載壓力。

二、部署LNMP動(dòng)靜分離&&memcache緩存服務(wù)器

1、環(huán)境準(zhǔn)備

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

下載我提供的源碼包,并將對(duì)應(yīng)的源碼包上傳至各個(gè)服務(wù)器。

2、部署Nginx服務(wù)器

[root@nginx ~]# yum -y erase httpd     #卸載自帶的httpd服務(wù)
[root@nginx ~]# yum -y install openssl-devel pcre-devel    #安裝所需依賴
[root@nginx ~]# cd /usr/src
[root@nginx src]# rz           #上傳Nginx源碼包
[root@nginx src]# tar zxf nginx-1.14.0.tar.gz
[root@nginx src]# cd nginx-1.14.0/
[root@nginx nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www && make && make install
#進(jìn)行編譯安裝
[root@nginx nginx-1.14.0]# useradd -M -s /sbin/nologin www   #創(chuàng)建運(yùn)行用戶
[root@nginx nginx-1.14.0]# ln -sf /usr/local/nginx/sbin/nginx /usr/local/sbin/    #對(duì)命令做軟鏈接
[root@nginx nginx-1.14.0]# nginx     #啟動(dòng)Nginx服務(wù)
[root@nginx nginx-1.14.0]# netstat -anput | grep 80     #確定80端口在監(jiān)聽
#以下是配置nginx與PHP服務(wù)器關(guān)聯(lián)
[root@nginx nginx-1.14.0]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf   #編輯主配置文件
#在server{  }字段中添加以下內(nèi)容
        location ~ \.php$ {            root           /var/www/html;      #指定PHP服務(wù)器的網(wǎng)頁(yè)存放路徑   
            fastcgi_pass   192.168.20.3:9000;    #指定PHP服務(wù)器監(jiān)聽端口
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
#更改完成后,保存退出即可
[root@nginx conf]# nginx -s reload      #重啟使更改生效

3、部署PHP服務(wù)器

[root@php ~]# rz    #上傳源碼包libmcrypt及php-5.6.27
[root@php ~]# tar zxf libmcrypt-2.5.7.tar.gz -C /usr/src    #解包
[root@php ~]# tar zxf php-5.6.27.tar.gz -C /usr/src    #解包
[root@php ~]# yum -y install libxml2-devel openssl-devel bzip2-devel    #安裝依賴
[root@php ~]# cd /usr/src/libmcrypt-2.5.7       #切換至解壓后的路徑
[root@php libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install
#編輯安裝
[root@php libmcrypt-2.5.7]# cd ../php-5.6.27/       #進(jìn)入PHP源碼包解壓后的路徑
[root@php php-5.6.27]# ./configure  --prefix=/usr/local/php5.6  --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr  --enable-xml  --with-mhash  --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc  --with-config-file-scan-dir=/etc/php.d  --with-bz2 --enable-maintainer-zts && make && make install
#編譯安裝PHP
#接下來(lái)為調(diào)整PHP的配置文件及控制服務(wù)的啟停
[root@php php-5.6.27]# cp php.ini-production /etc/php.ini    #復(fù)制源碼中中提供的PHP配置文件
[root@php php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm   #復(fù)制其服務(wù)控制腳本文件
[root@php php-5.6.27]# chmod +x /etc/init.d/php-fpm    #賦予執(zhí)行權(quán)限
[root@php php-5.6.27]# chkconfig --add php-fpm    #添加為系統(tǒng)服務(wù),以便支持systemctl管理
[root@php php-5.6.27]# chkconfig php-fpm on   #開啟
[root@php php-5.6.27]# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
#復(fù)制php-fpm提供的默認(rèn)配置文件并編輯它
[root@php php-5.6.27]# vim /usr/local/php5.6/etc/php-fpm.conf     #修改一下,進(jìn)行優(yōu)化
listen = 192.168.20.3:9000    #監(jiān)聽地址是本機(jī)的IP9000端口
pm.max_children = 50         #最大啟動(dòng)的進(jìn)程數(shù)
pm.start_servers = 5          #初始啟動(dòng)進(jìn)程數(shù)
pm.min_spare_servers = 5     #最小空閑進(jìn)程
pm.max_spare_servers = 35     #最大空閑進(jìn)程
#修改完成后,保存退出即可
[root@php php-5.6.27]# systemctl start php-fpm    #啟動(dòng)PHP服務(wù)
[root@php php-5.6.27]# netstat -anput | grep php-fpm     #確認(rèn)其9000端口已啟動(dòng)
[root@php ~]# mkdir -p /var/www/html        #創(chuàng)建其網(wǎng)頁(yè)存放目錄,須和nginx服務(wù)器的網(wǎng)頁(yè)存放路徑一樣
[root@php php-5.6.27]# vim /var/www/html/index.php     #編寫PHP測(cè)試頁(yè)面
<?php
phpinfo();
?>
[root@php php-5.6.27]# vim /var/www/html/index1.php     #連接數(shù)據(jù)庫(kù)的測(cè)試腳本

<?php
$link=mysqli_connect('192.168.20.5','ljz','pwd@123');
if($link) echo "恭喜你,數(shù)據(jù)庫(kù)連接成功!!!"; else echo "connect shibai";
mysqli_close($link);
?>

至此,即可訪問(wèn)Nginx服務(wù)器的80端口來(lái)查看php服務(wù)器上定義的兩個(gè)網(wǎng)頁(yè)文件(在訪問(wèn)連接數(shù)據(jù)庫(kù)的腳本文件時(shí),需要先部署數(shù)據(jù)庫(kù),并創(chuàng)建用來(lái)連接的用戶):

訪問(wèn)index.php,看到以下頁(yè)面說(shuō)明php運(yùn)行正常:
LNMP動(dòng)靜分離&&memcache緩存服務(wù)

訪問(wèn)index1.php,看到以下頁(yè)面,說(shuō)明LNMP之間的協(xié)調(diào)工作沒(méi)有問(wèn)題(我在訪問(wèn)下面的地址前,已經(jīng)部署了MySQL數(shù)據(jù)庫(kù),并且創(chuàng)建了相應(yīng)的用戶):

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

4、部署MySQL數(shù)據(jù)庫(kù)

我這里部署一個(gè)簡(jiǎn)易的MySQL數(shù)據(jù)庫(kù),提供測(cè)試功能即可。

[root@mysql ~]# rz
#上傳我提供的mysql.sh腳本文件及mysql-5.7.22-linux.....源碼包
[root@mysql ~]# sh mysql.sh              #執(zhí)行mysql.sh腳本,執(zhí)行后,需要等待較長(zhǎng)時(shí)間
Starting MySQL... SUCCESS!    #當(dāng)出現(xiàn)此提示信息時(shí),則表示MySQL部署成功
mysql: [Warning] Using a password on the command line interface can be insecure.
#安裝MySQL成功后,默認(rèn)的數(shù)據(jù)庫(kù)root密碼為123
[root@mysql ~]# mysql -uroot -p123    #登錄MySQL數(shù)據(jù)庫(kù)
mysql> create database bbs;
mysql> grant all on bbs.* to ljz@"192.168.20.%" identified by 'pwwd@123';

5、部署Memcached服務(wù)器

[root@mamcache ~]# cd /usr/src       #切換至指定目錄
[root@mamcache src]# rz             #上傳所需源碼包
[root@mamcache src]# ls       #就是上傳以下的后面兩個(gè)源碼包
debug  kernels  libevent-2.0.22-stable.tar.gz  memcached-1.4.33.tar.gz
[root@mamcache src]# tar zxf libevent-2.0.22-stable.tar.gz       #解包
[root@mamcache src]# tar zxf memcached-1.4.33.tar.gz       #解包
[root@mamcache src]# cd libevent-2.0.22-stable/     #切換至解壓后的目錄
[root@mamcache libevent-2.0.22-stable]# ./configure && make && make install     #編譯安裝
[root@mamcache libevent-2.0.22-stable]# cd ../memcached-1.4.33/    #切換至memcached目錄
[root@mamcache memcached-1.4.33]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local && make && make install
#編譯安裝
[root@mamcache ~]# ls /usr/local/memcached/bin/memcached          #確認(rèn)該命令已安裝
/usr/local/memcached/bin/memcached
[root@mamcache ~]# ln -sf /usr/local/memcached/bin/memcached /usr/local/bin/    #對(duì)命令做軟鏈接
[root@memcache memcached-1.4.33]# memcached -d -m 1024 -l 192.168.20.4 -p 11211 -u root -c 10240 -P /usr/local/memcached/memcached.pid
#啟動(dòng)memcached服務(wù),上述啟動(dòng)參數(shù)說(shuō)明如下:
# -d 選項(xiàng)是啟動(dòng)一個(gè)守護(hù)進(jìn)程。
# -m 分配給 Memcache 使用的內(nèi)存數(shù)量,單位是 MB,默認(rèn) 64MB。
# -l 監(jiān)聽的 IP 地址。(默認(rèn):INADDR_ANY,所有地址)
# -p 設(shè)置 Memcache 的 TCP 監(jiān)聽的端口,最好是 1024 以上的端口。
# -u 運(yùn)行 Memcache 的用戶,如果當(dāng)前為 root 的話,需要使用此參數(shù)指定用戶。
# -c 選項(xiàng)是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是 1024。
# -P 設(shè)置保存 Memcache 的 pid 文件路徑。
# -M 內(nèi)存耗盡時(shí)返回錯(cuò)誤,而不是刪除項(xiàng)
# -f 塊大小增長(zhǎng)因子,默認(rèn)是 1.25
# -n 最小分配空間,key+value+flags 默認(rèn)是 48
# -h 顯示幫助
[root@mamcache ~]# netstat -anput | grep 11211         #確定TCP及udp端口在監(jiān)聽

6、部署memcache客戶端(返回到PHP服務(wù)器進(jìn)行配置)

[root@php ~]# cd /usr/src
[root@php src]# rz   #上傳memcache-3.0.8.tgz源碼包
[root@php src]# tar zxf memcache-3.0.8.tgz     #解包
[root@php src]# cd memcache-3.0.8/     #進(jìn)入解壓后的目錄
[root@php memcache-3.0.8]# /usr/local/php5.6/bin/phpize    #生成該命令,以便生成configure文件
#若在執(zhí)行上述命令時(shí)報(bào)錯(cuò),則需要執(zhí)行“yun -y install autoconf "安裝提示的autoconf包。
[root@php memcache-3.0.8]#  ./configure --enable-memcache --with-php-config=/usr/local/php5.6/bin/php-config && make && make install
#上述命令執(zhí)行后,會(huì)顯示memcache.so存放的路徑
[root@php memcache-3.0.8]# vim /etc/php.ini   #編輯主配置文件
#在配置文件末尾添加上述內(nèi)容,以便指定memcache.so文件的存放路徑
extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/memcache.so
[root@php memcache-3.0.8]# systemctl restart php-fpm   #重啟php服務(wù),使更改生效
[root@php memcache-3.0.8]# cd /var/www/html/
[root@php html]# vim test3.php       #編寫測(cè)試文件

<?php
$memcache = new Memcache;
$memcache->connect('192.168.20.4', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 600) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 600 seconds)<br/>";
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>";
var_dump($get_result);
?>
#編輯完成后,保存退出即可,此測(cè)試腳本是顯示memcached的版本
#并且向里面插入了一個(gè)緩存時(shí)間為600秒的鍵值對(duì)“test=123”,其ID為“key”

客戶端訪問(wèn)編輯的test3.php文件,會(huì)看到以下內(nèi)容:
LNMP動(dòng)靜分離&&memcache緩存服務(wù)

在memcached服務(wù)器上安裝Telnet命令,并登陸緩存庫(kù),查看是否可以得到其鍵值對(duì)(以下操作在memcached服務(wù)器上進(jìn)行操作):

[root@memcache ~]# yum -y install telnet           #安裝Telnet命令
[root@memcache ~]# telnet 192.168.20.4 11211    #登陸到memcached的11211端口
get key         #查詢ID為“key”的鍵值對(duì),可以看到我們測(cè)試腳本寫入的“test=123”
VALUE key 1 66
O:8:"stdClass":2:{s:8:"str_attr";s:4:"test";s:8:"int_attr";i:123;}
END
#在進(jìn)行上面的get驗(yàn)證時(shí),需要將test3.php文件中插入的鍵值對(duì)的保存時(shí)間值改大一些
#或者重新訪問(wèn)一下,以免緩存失效,查詢不到

至此,LNMP動(dòng)靜分離&&memcache緩存服務(wù)器已經(jīng)基本部署完成,接下來(lái),配置PHP與memcached服務(wù)器溝通保存session會(huì)話

7、使用 memcache 實(shí)現(xiàn) session 共享(在PHP服務(wù)器進(jìn)行以下操作)

接下來(lái)實(shí)現(xiàn)PHP與memcached服務(wù)器溝通保存session會(huì)話。

[root@php ~]# vim /etc/php.ini      #在配置文件末尾添加下面內(nèi)容
ession.save_handler = memcache
session.save_path = "tcp://192.168.20.4:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
#注上面寫入的內(nèi)容解釋如下:
# session.save_handler:設(shè)置 session 的儲(chǔ)存方式為 memcache 。
#默認(rèn)以文件方式存取 session數(shù)據(jù)。
#session.save_path: 設(shè)置 session 儲(chǔ)存的位置
#使用多個(gè) memcached server 時(shí)用逗號(hào)”,”隔開,
#可以帶額外的參數(shù)”persistent”、”weight”、”timeout”、”retry_interval”等等,
#類似這樣的:"tcp://host:port?persistent=1&weight=2,tcp://host2:port2"。
[root@php html]# systemctl restart php-fpm     #重啟使更改生效
[root@php html]# vim /var/www/html/test2.php    #編寫測(cè)試文件
<?php
session_start();
if (!isset($_SESSION['session_time']))
{
$_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."<br />";
echo "now_time:".time()."<br />";
echo "session_id:".session_id()."<br />";
?>
#編寫完成后,保存退出即可

客戶端訪問(wèn)編寫的test2.php測(cè)試文件,如下:

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

同樣,使用Telnet命令在memcached服務(wù)器上進(jìn)行查詢其session_id的值,如下:

[root@memcache ~]# telnet 192.168.20.4 11211     #登錄緩存監(jiān)聽的端口
get naapo2eet2d9s4to4mt7hchnr1            #執(zhí)行g(shù)et命令
VALUE naapo2eet2d9s4to4mt7hchnr1 0 26
session_time|i:1572450021;
#可以看到,查詢到的session_time和我們網(wǎng)頁(yè)訪問(wèn)到的值是一樣的,說(shuō)明其被緩存了

8、測(cè)試memcached緩存數(shù)據(jù)庫(kù)

在MySQL數(shù)據(jù)庫(kù)上創(chuàng)建用于測(cè)試的表(所有操作都在MySQL數(shù)據(jù)庫(kù)上)如下:

mysql> create database testdb1;    #創(chuàng)建一個(gè)庫(kù)
mysql> use testdb1;    #切換至創(chuàng)建的庫(kù)中
mysql> create table test1(id int not null auto_increment,name varchar(20) default null,primary key (id)) engine=innodb auto_increment=1 default charset=utf8;
#創(chuàng)建表,共兩列,分別是ID號(hào)和姓名
mysql> insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
#向表中插入測(cè)試數(shù)據(jù)
mysql> select * from test1;   #確定插入的數(shù)據(jù)
+----+------+
| id | name |
+----+------+
|  1 | tom1 |
|  2 | tom2 |
|  3 | tom3 |
|  4 | tom4 |
|  5 | tom5 |
+----+------+
5 rows in set (0.00 sec)
mysql> desc test1;         #可以執(zhí)行此語(yǔ)句查看test1的表結(jié)構(gòu)
mysql> grant select on testdb1.* to user@'%' identified by 'pwd@123';
#對(duì)test1表創(chuàng)建一個(gè)只讀的數(shù)據(jù)庫(kù)用戶,用于接下來(lái)的測(cè)試

接下來(lái)就是測(cè)試的工作了,這里有個(gè) php 腳本,用于測(cè)試memcache 是否緩存數(shù)據(jù)成功

在PHP服務(wù)器上編寫以下測(cè)試文件:

客戶端訪問(wèn)用于測(cè)試的腳本文件,第一次訪問(wèn)的頁(yè)面如下:
LNMP動(dòng)靜分離&&memcache緩存服務(wù)

客戶端刷新后,會(huì)看到以下頁(yè)面:

LNMP動(dòng)靜分離&&memcache緩存服務(wù)

在查詢到的緩存過(guò)期前,可以在memcache上通過(guò)get 獲取到對(duì)應(yīng)的緩存數(shù)據(jù),如下(在memcache服務(wù)器上進(jìn)行操作):

[root@memcache ~]# telnet 192.168.20.4 11211     #登錄緩存監(jiān)聽的端口
get d8c961e9895ba4b463841924dbcefc2b       #執(zhí)行g(shù)et命令
VALUE d8c961e9895ba4b463841924dbcefc2b 0 251
a:5:{i:0;a:2:{s:2:"id";s:1:"1";s:4:"name";s:4:"tom1";}i:1;a:2:{s:2:"id";s:1:"2";s:4:"name";s:4:"tom2";}i:2;a:2:{s:2:"id";s:1:"3";s:4:"name";s:4:"tom3";}i:3;a:2:{s:2:"id";s:1:"4";s:4:"name";s:4:"tom4";}i:4;a:2:{s:2:"id";s:1:"5";s:4:"name";s:4:"tom5";}}

———————— 本文至此結(jié)束,感謝閱讀 ————————

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI