博文大綱:
一、MemCache簡介創(chuàng)新互聯(lián)建站擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10多年,專業(yè)且經(jīng)驗(yàn)豐富。10多年網(wǎng)站優(yōu)化營銷經(jīng)驗(yàn),我們已為上1000家中小企業(yè)提供了成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)解決方案,按需求定制網(wǎng)站,設(shè)計(jì)滿意,售后服務(wù)無憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!
- 1、協(xié)議
- 2、事件處理
- 3、存儲(chǔ)方式
- 4、通信分布式
- 5、memcached的應(yī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ù)庫
- 5、部署Memcached服務(wù)器
- 6、部署memcache客戶端
- 7、使用 memcache 實(shí)現(xiàn) session 共享
- 8、測試memcached緩存數(shù)據(jù)庫
MemCache 是一個(gè)自由、源碼開放、高性能、分布式的分布式內(nèi)存對象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫的負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高了網(wǎng)站訪問的速度。 MemCaChe 是一個(gè)存儲(chǔ)鍵值對的 HashMap,在內(nèi)存中對任意的數(shù)據(jù)(比如字符串、對象等)所使用的 key-value 存儲(chǔ),數(shù)據(jù)可以來自數(shù)據(jù)庫調(diào)用、API調(diào)用,或者頁面渲染的結(jié)果。MemCache 設(shè)計(jì)理念就是小而強(qiáng)大,它簡單的設(shè)計(jì)促進(jìn)了快速部署、易于開發(fā)并解決面對大規(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)相對于MySQL簡單很多,雖然MySQL也有緩存,但是數(shù)據(jù)庫的SQL解析會(huì)耗費(fèi)性能,查詢慢于memcached,另外MySQL的緩存設(shè)計(jì)得更加復(fù)雜,因?yàn)橐紤]事務(wù),日志,存儲(chǔ)引擎等模塊,它的性能也沒有memcached好。
memcached只做一件事情,簡單高效,在cache上比MySQL強(qiáng),這應(yīng)該容易理解。
memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn):
- 協(xié)議簡單;
- 基于libevent的事件處理;
- 內(nèi)置內(nèi)存存儲(chǔ)方式;
- memcached不互相通信的分布式。
memcached的服務(wù)器客戶端通信并不使用復(fù)雜的XML等格式,而使用簡單的基于文本行的協(xié)議。
因此,通過telnet也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)。
libevent是個(gè)程序庫,它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口。即使對服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。memcached使用這個(gè)libevent庫,因此能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能。
為了提高性能,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ù)的永久性問題。
memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒有分布式功能。各個(gè)memcached不會(huì)互相通信以共享信息。那么,怎樣進(jìn)行分布式呢?這完全取決于客戶端的實(shí)現(xiàn)。
1)數(shù)據(jù)庫的前端緩存應(yīng)用:讓它來分擔(dān)數(shù)據(jù)的并發(fā)壓力,當(dāng)數(shù)據(jù)更新時(shí),可以使程序通知緩存進(jìn)行更新
2)session會(huì)話共享的共享存儲(chǔ)
它是一種內(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ù)器
一致性 Hash 算法通過一個(gè)叫做一致性 Hash 環(huán)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) Key 到緩存服務(wù)器的 Hash 映射。簡單地說,一致性哈希將整個(gè)哈希值空間組織成一個(gè)虛擬的圓環(huán)(這個(gè)環(huán)被稱為一致性Hash 環(huán)),如假設(shè)某空間哈希函數(shù) H 的值空間是 0~2^ 32 -1(即哈希值是一個(gè) 32 位無符號整型),整個(gè)哈??臻g如下:
下一步將各個(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ì)算后位置如下:
接下來使用相同算法計(jì)算出數(shù)據(jù)的哈希值 h,并由此確定數(shù)據(jù)在此哈希環(huán)上的位置。假如我們有數(shù)據(jù) A、B、C、D、4 個(gè)對象,經(jīng)過哈希計(jì)算后位置如下:
根據(jù)一致性哈希算法,數(shù)據(jù) A 就被綁定到了 server01 上,D 被綁定到了 server02 上,B、C在 server03 上,是按照順時(shí)針找最近服務(wù)節(jié)點(diǎn)方法。
這樣得到的哈希環(huán)調(diào)度方法,有很高的容錯(cuò)性和可擴(kuò)展性:
假設(shè) server03 宕機(jī):
可以看到此時(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ì)受到影響。
考慮另外一種情況,如果我們在系統(tǒng)中增加一臺(tái)服務(wù)器 Memcached Server 04:
此時(shí) A、D、C 不受影響,只有 B 需要重定位到新的 Server04。一般的,在一致性哈希算法中,如果增加一臺(tái)服務(wù)器,則受影響的數(shù)據(jù)僅僅是新服務(wù)器到其環(huán)空間中前一臺(tái)服務(wù)器(即順著逆時(shí)針方向行走遇到的第一臺(tái)服務(wù)器)之間數(shù)據(jù),其它不會(huì)受到影響。
綜上所述,一致性哈希算法對于節(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ì)對數(shù)據(jù)庫造成致命的負(fù)載壓力。
下載我提供的源碼包,并將對應(yīng)的源碼包上傳至各個(gè)服務(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/ #對命令做軟鏈接
[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)頁存放路徑
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 #重啟使更改生效
[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
#接下來為調(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)頁存放目錄,須和nginx服務(wù)器的網(wǎng)頁存放路徑一樣
[root@php php-5.6.27]# vim /var/www/html/index.php #編寫PHP測試頁面
[root@php php-5.6.27]# vim /var/www/html/index1.php #連接數(shù)據(jù)庫的測試腳本
至此,即可訪問Nginx服務(wù)器的80端口來查看php服務(wù)器上定義的兩個(gè)網(wǎng)頁文件(在訪問連接數(shù)據(jù)庫的腳本文件時(shí),需要先部署數(shù)據(jù)庫,并創(chuàng)建用來連接的用戶):
訪問index.php,看到以下頁面說明php運(yùn)行正常:
訪問index1.php,看到以下頁面,說明LNMP之間的協(xié)調(diào)工作沒有問題(我在訪問下面的地址前,已經(jīng)部署了MySQL數(shù)據(jù)庫,并且創(chuàng)建了相應(yīng)的用戶):
我這里部署一個(gè)簡易的MySQL數(shù)據(jù)庫,提供測試功能即可。
[root@mysql ~]# rz
#上傳我提供的mysql.sh腳本文件及mysql-5.7.22-linux.....源碼包
[root@mysql ~]# sh mysql.sh #執(zhí)行mysql.sh腳本,執(zhí)行后,需要等待較長時(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ù)庫root密碼為123
[root@mysql ~]# mysql -uroot -p123 #登錄MySQL數(shù)據(jù)庫
mysql> create database bbs;
mysql> grant all on bbs.* to ljz@"192.168.20.%" identified by 'pwwd@123';
[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/ #對命令做軟鏈接
[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ù)說明如下:
# -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 塊大小增長因子,默認(rèn)是 1.25
# -n 最小分配空間,key+value+flags 默認(rèn)是 48
# -h 顯示幫助
[root@mamcache ~]# netstat -anput | grep 11211 #確定TCP及udp端口在監(jiā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 #編寫測試文件
connect('192.168.20.4', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."
";
$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)
";
$get_result = $memcache->get('key');
echo "Data from the cache:
";
var_dump($get_result);
?>
#編輯完成后,保存退出即可,此測試腳本是顯示memcached的版本
#并且向里面插入了一個(gè)緩存時(shí)間為600秒的鍵值對“test=123”,其ID為“key”
客戶端訪問編輯的test3.php文件,會(huì)看到以下內(nèi)容:
在memcached服務(wù)器上安裝Telnet命令,并登陸緩存庫,查看是否可以得到其鍵值對(以下操作在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”的鍵值對,可以看到我們測試腳本寫入的“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文件中插入的鍵值對的保存時(shí)間值改大一些
#或者重新訪問一下,以免緩存失效,查詢不到
至此,LNMP動(dòng)靜分離&&memcache緩存服務(wù)器已經(jīng)基本部署完成,接下來,配置PHP與memcached服務(wù)器溝通保存session會(huì)話
接下來實(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í)用逗號”,”隔開,
#可以帶額外的參數(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 #編寫測試文件
";
echo "now_time:".time()."
";
echo "session_id:".session_id()."
";
?>
#編寫完成后,保存退出即可
客戶端訪問編寫的test2.php測試文件,如下:
同樣,使用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)頁訪問到的值是一樣的,說明其被緩存了
在MySQL數(shù)據(jù)庫上創(chuàng)建用于測試的表(所有操作都在MySQL數(shù)據(jù)庫上)如下:
mysql> create database testdb1; #創(chuàng)建一個(gè)庫
mysql> use testdb1; #切換至創(chuàng)建的庫中
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號和姓名
mysql> insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
#向表中插入測試數(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í)行此語句查看test1的表結(jié)構(gòu)
mysql> grant select on testdb1.* to user@'%' identified by 'pwd@123';
#對test1表創(chuàng)建一個(gè)只讀的數(shù)據(jù)庫用戶,用于接下來的測試
接下來就是測試的工作了,這里有個(gè) php 腳本,用于測試memcache 是否緩存數(shù)據(jù)成功
在PHP服務(wù)器上編寫以下測試文件:
客戶端訪問用于測試的腳本文件,第一次訪問的頁面如下:
客戶端刷新后,會(huì)看到以下頁面:
在查詢到的緩存過期前,可以在memcache上通過get 獲取到對應(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é)束,感謝閱讀 ————————