溫馨提示×

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

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

如何搭建memcache緩存服務(wù)器?

發(fā)布時(shí)間:2020-06-01 15:11:31 來源:億速云 閱讀:361 作者:鴿子 欄目:云計(jì)算

一、MemCache簡(jiǎn)介
MemCache 是一個(gè)自由、源碼開放、高性能、分布式的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫的負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高了網(wǎng)站訪問的速度。 MemCaChe 是一個(gè)存儲(chǔ)鍵值對(duì)的 HashMap,在內(nèi)存中對(duì)任意的數(shù)據(jù)(比如字符串、對(duì)象等)所使用的 key-value 存儲(chǔ),數(shù)據(jù)可以來自數(shù)據(jù)庫調(diào)用、API調(diào)用,或者頁面渲染的結(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 等大部分流行的程序語言。
另外,說一下為什么會(huì)有 Memcache 和 memcached 兩種名稱?其實(shí) Memcache 是這個(gè)項(xiàng)目的名稱(也時(shí)它客戶端的名稱),而 memcached 是它服務(wù)器端的主程序文件名。

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

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

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

2、事件處理
libevent是個(gè)程序庫,它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口。即使對(duì)服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。memcached使用這個(gè)libevent庫,因此能在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ù)器,因此并沒有過多考慮數(shù)據(jù)的永久性問題。

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

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

6、memcached應(yīng)用中的工作流程
它是一種內(nèi)存緩存,可通過API的方式讀取內(nèi)存中緩存的這些數(shù)據(jù),當(dāng)用戶需要讀取數(shù)據(jù)時(shí),會(huì)首先訪問memcached緩存,如果緩存中有數(shù)據(jù)就直接返回給前端的應(yīng)用程序,如果沒有,再轉(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ù),那么這時(shí)我們的處理流程是這樣的:
首先從負(fù)載均衡中將WEB應(yīng)用停掉- - - >讓負(fù)載均衡不再轉(zhuǎn)發(fā)數(shù)據(jù)給WEB - - >接著啟動(dòng)緩存服務(wù)器- - - - > 通過程序把數(shù)據(jù)庫的內(nèi)容初始化到緩存服務(wù)器中- - - - >然后將網(wǎng)頁應(yīng)用啟用- - - - >重啟數(shù)據(jù)庫服務(wù)器
7、memcached的一致性Hash算法
一致性 Hash 算法通過一個(gè)叫做一致性 Hash 環(huán)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) Key 到緩存服務(wù)器的 Hash 映射。簡(jiǎn)單地說,一致性哈希將整個(gè)哈希值空間組織成一個(gè)虛擬的圓環(huán)(這個(gè)環(huán)被稱為一致性Hash 環(huán)),如假設(shè)某空間哈希函數(shù) H 的值空間是 0~2^ 32 -1(即哈希值是一個(gè) 32 位無符號(hào)整型),整個(gè)哈??臻g如下:
如何搭建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ì)算后位置如下:
如何搭建memcache緩存服務(wù)器?
接下來使用相同算法計(jì)算出數(shù)據(jù)的哈希值 h,并由此確定數(shù)據(jù)在此哈希環(huán)上的位置。假如我們有數(shù)據(jù) A、B、C、D、4 個(gè)對(duì)象,經(jīng)過哈希計(jì)算后位置如下:
如何搭建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ī):
如何搭建memcache緩存服務(wù)器?
可以看到此時(shí) C、B 會(huì)受到影響,將 B、C 節(jié)點(diǎn)被重定位到 Server01。一般的,在一致性哈希算法中,如果一臺(tái)服務(wù)器不可用,則受影響的數(shù)據(jù)僅僅是此服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即順著逆時(shí)針方向行走遇到的第一臺(tái)服務(wù)器)之間數(shù)據(jù),其它不會(huì)受到影響。
考慮另外一種情況,如果我們?cè)谙到y(tǒng)中增加一臺(tái)服務(wù)器 Memcached Server 04:

如何搭建memcache緩存服務(wù)器?
此時(shí) A、D、C 不受影響,只有 B 需要重定位到新的 Server04。一般的,在一致性哈希算法中,如果增加一臺(tái)服務(wù)器,則受影響的數(shù)據(jù)僅僅是新服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即順著逆時(shí)針方向行走遇到的第一臺(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ù)傾斜問題。我們可以采用增加虛擬節(jié)點(diǎn)的方式解決。
更重要的是,集群中緩存服務(wù)器節(jié)點(diǎn)越多,增加/減少節(jié)點(diǎn)帶來的影響越小,很好理解。換句話說,隨著集群規(guī)模的增大,繼續(xù)命中原有緩存數(shù)據(jù)的概率會(huì)越來越大,雖然仍然有小部分?jǐn)?shù)據(jù)緩存在服務(wù)器中不能被讀到,但是這個(gè)比例足夠小,即使訪問數(shù)據(jù)庫,也不會(huì)對(duì)數(shù)據(jù)庫造成致命的負(fù)載壓力。
二、部署LNMP動(dòng)靜分離&&memcache緩存服務(wù)器
環(huán)境如下:
如何搭建memcache緩存服務(wù)器?
所需源碼包可在此處下載并上傳至各服務(wù)器:https://pan.baidu.com/s/1-2pS702mz41e94nBXSgUnA
提取碼:rldk

1、部署Nginx服務(wù)

[root@nginx /]# yum -y install openssl-devel pcre-devel     # 安裝所需依賴包 
[root@nginx /]# mkdir nginx           # 個(gè)人習(xí)慣而已
[root@nginx /]# cd nginx/
[root@nginx nginx]# rz          # 使用的xshell連接的服務(wù)器,使用rz上傳所需的源碼包
[root@nginx nginx]# tar zxf nginx-1.14.0.tar.gz       # 解壓到當(dāng)前目錄
[root@nginx nginx]# cd nginx-1.14.0/
[root@nginx nginx-1.14.0]# useradd -M -s /sbin/nologin www          # 創(chuàng)建Nginx運(yùn)行用戶
[root@nginx nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www && make && make install         # 編譯并安裝
[root@nginx nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/         # 創(chuàng)建命令軟連接
[root@nginx nginx-1.14.0]# nginx          # 啟動(dòng)服務(wù)
[root@nginx nginx-1.14.0]# netstat -anput | grep 80        # 查看端口,確定服務(wù)已經(jīng)啟動(dòng)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6827/nginx: master 
[root@nginx nginx-1.14.0]# cd /
[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf
...............................               // 省略部分內(nèi)容
在server{} 字段中添加如下內(nèi)容
location ~ \.php$ {
            root           /var/www/html;            # 指定PHP的網(wǎng)頁存放路徑
            fastcgi_pass   192.168.171.133:9000;           # 指定PHP服務(wù)監(jiān)聽端口及地址
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

[root@nginx /]# nginx -s reload              # 重啟服務(wù)使配置生效

2、部署PHP服務(wù)

#首先需要為PHP安裝依賴包
[root@php php]# yum -y install libxml2-devel openssl-devel bzip2-devel
[root@php php]# tar zxf libmcrypt-2.5.7 
[root@php php]# cd 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 ..
[root@php php]# tar zxf php-5.6.27.tar.gz 
[root@php php]# cd php-5.6.27/
[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

#以下為調(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   #開啟
#復(fù)制php-fpm提供的默認(rèn)配置文件并編輯它
[root@php php-5.6.27]# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
[root@php php-5.6.27]# vim /usr/local/php5.6/etc/php-fpm.conf
listen = 192.168.171.133: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 /]# service php-fpm restart              # 重啟PHP使配置生效
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@php /]# netstat -anput | grep 9000                  # 查看是否運(yùn)行
tcp        0      0 192.168.171.133:9000    0.0.0.0:*               LISTEN      3054/php-fpm: maste 
# 準(zhǔn)備網(wǎng)頁測(cè)試文件
[root@php /]# mkdir -p /var/www/html
[root@php /]# cd /var/www/html/
[root@php html]# cat index.php 
<?php
phpinfo();
?>
[root@php html]# cat index1.php 
<?php
$link=mysqli_connect('192.168.171.135','zyz','pwd@123');
if($link) echo "恭喜你,數(shù)據(jù)庫連接成功?。?!"; else echo "connect shibai";
mysqli_close($link);
?>

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

# 這里部署一個(gè)簡(jiǎn)單的數(shù)據(jù)庫即可
[root@mysql /]# mkdir -p mysql
[root@mysql /]# cd mysql/
[root@mysql mysql]# rz             # 上傳所需
[root@mysql mysql]# sh mysql.sh          # 直接sh執(zhí)行腳本安裝即可,安裝完畢之后默認(rèn)密碼是123
Starting MySQL.. SUCCESS! 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql mysql]# netstat -anput | grep 3306            # 確保服務(wù)已經(jīng)啟動(dòng)
tcp6       0      0 :::3306                 :::*                    LISTEN      3290/mysqld       
[root@mysql mysql]# mysql -u root -p        # 登錄數(shù)據(jù)庫
Enter password: 
mysql> create database bbs;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on bbs.* to zyz@"192.168.171.%" identified by 'pwd@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

測(cè)試驗(yàn)證:
如何搭建memcache緩存服務(wù)器?
如何搭建memcache緩存服務(wù)器?
4、部署Memcached服務(wù)

[root@memcached /]# mkdir memcached
[root@memcached /]# cd memcached/
[root@memcached memcached]# rz           # 上傳所需源碼包
[root@memcached memcached]# tar zxf libevent-2.0.22-stable.tar.gz           # 解包
[root@memcached memcached]# cd libevent-2.0.22-stable/
[root@memcached libevent-2.0.22-stable]# ./configure && make && make install              # 編譯并安裝
[root@memcached libevent-2.0.22-stable]# cd ..
[root@memcached memcached]# tar zxf memcached-1.4.33.tar.gz 
[root@memcached memcached]# cd memcached-1.4.33/
[root@memcached memcached-1.4.33]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local
/ && make && make install 
[root@memcached memcached-1.4.33]# ln -s /usr/local/memcached/bin/memcached /usr/local/bin/            # 命令制作軟連接
[root@memcached memcached-1.4.33]# memcached -d -m 1024 -l 192.168.171.132 -p 11211 -c 10240 -P /usr/local/memcached/memcached.pid -u root
#啟動(dòng)memcached服務(wù),上述啟動(dòng)參數(shù)說明如下:
# -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@memcached memcached-1.4.33]# netstat -anput | grep 11211              # 確定TCP及udp都在監(jiān)聽
tcp        0      0 192.168.171.132:11211   0.0.0.0:*               LISTEN      11666/memcached     
udp        0      0 192.168.171.132:11211   0.0.0.0:*                           11666/memcached    

5、部署Memcache客戶端(返回PHP服務(wù)器操作)

[root@php /]# mkdir memcache
[root@php /]# cd memcache/
[root@php memcache]# rz      # 上傳如下源碼包
[root@php memcache]# ls
memcache-3.0.8.tgz
[root@php memcache]# tar zxf memcache-3.0.8.tgz 
[root@php memcache]# cd memcache-3.0.8/
[root@php memcache-3.0.8]# /usr/local/php5.6/bin/phpize       #  #執(zhí)行該命令,以便生成configure文件  
# 若在執(zhí)行上述命令時(shí)報(bào)錯(cuò),則需要執(zhí)行“yun -y install autoconf "安裝提示的autoconf包。
Configuring for:          # 執(zhí)行成功會(huì)顯示次此幾行
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[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)容,注意不要直接復(fù)制本人的路徑
extension = /usr/local/php5.6/lib/php/extensions/no-debug-non-zts-20131226/memcache.so
[root@php memcache-3.0.8]# service php-fpm restart          # 重啟php使配置生效
Gracefully shutting down php-fpm . done
Starting php-fpm  done

編寫測(cè)試文件:

[root@php memcache-3.0.8]# cd /var/www/html/
[root@php html]# vim test1.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.171.132', 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”

客戶端訪問編輯的test1.php文件,會(huì)看到以下內(nèi)容:
如何搭建memcache緩存服務(wù)器?
在memcached服務(wù)器上安裝Telnet命令,并登陸緩存庫,查看是否可以得到其鍵值對(duì)

[root@memcached /]# yum -y install telnet        # 安裝Telnet命令
[root@memcached /]# telnet 192.168.171.132 11211
Trying 192.168.171.132...
Connected to 192.168.171.132.
Escape character is '^]'.
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í),需要將test1.php文件中插入的鍵值對(duì)的保存時(shí)間值改大一些
#或者重新訪問一下,以免緩存失效,查詢不到

至此,LNMP動(dòng)靜分離&&memcache緩存服務(wù)器已經(jīng)基本部署完成,接下來,配置PHP與memcached服務(wù)器溝通保存session會(huì)話
6、使用 memcache 實(shí)現(xiàn) session 共享(在PHP服務(wù)器進(jìn)行以下操作)

[root@php /]# vim /etc/php.ini 
# 在末尾添加如下內(nèi)容
session.save_handler = memcache
session.save_path = "tcp://192.168.171.132: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 /]# service php-fpm restart          # 重啟服務(wù)使配置生效
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@php /]# vim /var/www/html/test2.php     # 編寫配置文件
<?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 />";
?>

客戶端訪問編寫的test2.php測(cè)試文件,如下:
如何搭建memcache緩存服務(wù)器?
同樣,使用Telnet命令在memcached服務(wù)器上進(jìn)行查詢其session_id的值,如下:

[root@memcached /]# telnet 192.168.171.132 11211
Trying 192.168.171.132...
Connected to 192.168.171.132.
Escape character is '^]'.
get d1n4umig3aq8okqrg7ep95t321
VALUE d1n4umig3aq8okqrg7ep95t321 0 26
session_time|i:1581082210;
END
#可以看到,查詢到的session_time和我們網(wǎng)頁訪問到的值是一樣的,說明其被緩存了

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

[root@mysql mysql]# mysql -u root -p
Enter password: 
mysql> create database testdb;      # 創(chuàng)建數(shù)據(jù)庫
mysql> use testdb;      # 進(jìn)入庫中
Database changed
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)建表
mysql> insert into test1(name) values ('aaa1'),('aaa2'),('aaa3'),('aaa4'),('aaa5');       # 向表中添加內(nèi)容
mysql> select * from test1       # 查詢表中內(nèi)容
    -> ;
+----+------+
| id | name |
+----+------+
|  1 | aaa1 |
|  2 | aaa2 |
|  3 | aaa3 |
|  4 | aaa4 |
|  5 | aaa5 |
+----+------+
5 rows in set (0.00 sec)
mysql> desc test1;       # 可查詢表結(jié)構(gòu)
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> grant select on testdb.* to test@'%' identified by 'pwd@123';
# 創(chuàng)建用于測(cè)試的用戶

在PHP服務(wù)器上編寫以下測(cè)試文件,測(cè)試memcache 是否緩存數(shù)據(jù)成功:

[root@php html]# vim test3.php
<?php
$memcachehost = '192.168.171.132';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from test1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
$conn=mysql_connect("192.168.171.135","test","pwd@123");
mysql_select_db(testdb);
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result))
{
$arr[]=$row;
}
$f = 'mysql';
$memcache->add($key,serialize($arr),0,30);
$data = $arr ;
}
else{
$f = 'memcache';
$data_mem=$memcache->get($key);
$data = unserialize($data_mem);
}
echo $f;
echo "<br>";
echo "$key";
echo "<br>";
//print_r($data); 
foreach($data as $a)
{
echo "number is <b><font color=#FF0000>$a[id]</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$a[name]</font></b>";
echo "<br>";
}
?>

客戶端訪問用于測(cè)試的腳本文件,第一次訪問的頁面如下:
如何搭建memcache緩存服務(wù)器?
客戶端刷新后,會(huì)看到以下頁面:
如何搭建memcache緩存服務(wù)器?
在查詢到的緩存過期前,可以在memcache上通過get 獲取到對(duì)應(yīng)的緩存數(shù)據(jù),如下(在memcache服務(wù)器上進(jìn)行操作):

[root@memcached memcached]# telnet 192.168.171.132 11211
Trying 192.168.171.132...
Connected to 192.168.171.132.
Escape character is '^]'.
get d8c961e9895ba4b463841924dbcefc2b
VALUE d8c961e9895ba4b463841924dbcefc2b 0 251
a:5:{i:0;a:2:{s:2:"id";s:1:"1";s:4:"name";s:4:"aaa1";}i:1;a:2:{s:2:"id";s:1:"2";s:4:"name";s:4:"aaa2";}i:2;a:2:{s:2:"id";s:1:"3";s:4:"name";s:4:"aaa3";}i:3;a:2:{s:2:"id";s:1:"4";s:4:"name";s:4:"aaa4";}i:4;a:2:{s:2:"id";s:1:"5";s:4:"name";s:4:"aaa5";}}
END
向AI問一下細(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