分布式緩存系統——memcache


一、簡介

      memcache是一個自由開源的、高性能的、分布式內存對象緩存系統。它是一種基於內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據可以是數據庫調用、API調用等。本質上,他就是一個簡單的key-value存儲系統。

      一般的使用目的是:通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態web應用的速度、提高可擴展性。

       

 

    第一次訪問數據庫:先從數據庫中取得數據返回給瀏覽器,同時將數據存儲在緩存中。

    第二次訪問相同數據:直接從memcache中取得數據。

(1)memcached的原理

  1、服務端緩存實現

    ①、memcache的特點

     memcache使用了BSD許可的服務端緩存實現。與其他服務端緩存實現不同,其主要由兩部分組成:獨立運行的memcache服務實例,以及用於訪問這些服務實例的客戶端。相較於普通服務端緩存實現中各個緩存都運行在服務實例之上的情況,memcache服務實例則是在服務實例之外獨立運行的。

 

 

 普通緩存與memcache的對比

  普通緩存 memcache
特性 緩存與特定的應用實例綁定,每個應用實例只能訪問特定緩存 實例獨立於各個應用服務器實例運行,每個應用實例可以訪問任意緩存
特點 整個應用所能訪問的緩存容量變小,緩存中存在數據冗余;緩存系統整體效率降低 整個應用所能訪問的緩存容量變大;緩存中沒有數據冗余;緩存系統整體效率較高。

   ②、緩存服務器結構的組織

    檢查當前各個服務器的負載情況:《1》若此時服務器的CPU使用率較高,空余內存較大,則在其上就可以運行memcache實例。

                   《2》若此時服務器的CPU使用率不高,空余內容較少,則在其上可以運行多個memcache實例。

                   《3》若此時所使用的服務器均無過多內存,則需要使用一系列獨立的服務器擴容。

   ③、數據存取過程

     一個大型的服務常常由多個memcache實例。而這些緩存實例中所存儲的數據都不相同。而這種數據的異構性,我們需要在訪問我們需要的信息之前確定哪個實例中存儲的數據是我們需要的。

          客戶端對緩存信息的訪問

該客戶端知道服務端緩存系統中所包含的所有memcache服務實例。在需要訪問具有特定鍵值的數據時,該客戶端內部會根據所需要讀取的數據的鍵值,如“name”,以及當前memcache緩存服務的配置來計算相應的哈希值,以確定到底哪個memcache實例存儲了客戶端需要的信息。在確定了存儲相應的數據的memcache實例之后,客戶端將從配置中讀取該memcache服務實例所在的地址,並向該實例發送數據訪問請求,並得到name所對應的值。

   客戶端對緩存信息的存入

假設用戶希望服務服務端緩存記錄數據“Lucille” ,並為其指定鍵值“name”。那么memcache客戶端將首先對用戶所復制的鍵值“name”及當前服務端緩存所記錄的可用服務實例個數執行哈希計算,並根據哈希計算結果來決定存儲該數據的memcache實例。接下來,客戶端需要訪問的時候,就可以訪問到。

    以上信息可得:每個memcached實例都是獨立的,彼此之間沒有交互;單個節點上不存在進程間通信;節點之間不存在數據同步以及消息廣播;便於節點擴縮容。

          這些記錄在服務端緩存中的數據是全局可見的。也就是說,一旦在memcache服務端緩存中成功添加了一條新記錄,那么其他使用該緩存服務的應用實例將同樣可以訪問該記錄。

   ④、記錄的組成及內容特性

    在memcache中,每個記錄都由四部分組成:記錄的鍵、有效期、一系列可選的標記以及表示記錄內容的數據。由於記錄內容的數據中並不包含任何數據結構,因此memcache中所記錄的數據需要是經過序列化之后的表示。

       2、內存管理

    在使用緩存時,我們需要考慮的問題是就是如何對緩存數據的生存期進行管理。這其中包括如何確定一個緩存中的數據過期時間,如何在緩存空間不夠時確定去除哪些數據的替換等。

   ①、內存管理模型

           通常情況下,一個內存管理算法所需要考慮的問題就是內存碎片化:在長時間的分配和回收的前提下,被系統所使用的內存將趨向於散落在不連續的空間中。這使得系統很難找到連續內存空間,一方面增大了內存分配失敗的概率,另一方面也使得內存分配工作變得復雜,降低運行效率。

           以上的問題,memcache使用了一種叫Slab的結構。在該分配算法中,內存將按照1MB的大小划分為頁,而划分的每個頁會繼續被分割為一系列具有相同大小的內存塊。

   ②、數據的存儲

     在一條新的記錄到來時,memcache會首先檢查該記錄的大小,並根據記錄的大小選擇記錄所需要存儲到的Slab類型;接下來,memcache就會檢查自己內部所包含的該類型的Slab,如果這些Slab中有空余的塊,那么memcache就會使用該塊記錄表該條信息。如果沒有Slab有合適大小的塊,那么memcache就會創建一個新的頁,並且該頁按照目標Slab的類型進行划分。  

 

 

 

 使用這種方式分配內存的好處:

(1)其可以降低由於記錄的多次讀寫而導致的碎片化。

(2)由於memcache是根據記錄的大小選擇需要插入到的快類型,因此為而每個記錄所分配的塊的大小常常大於該記錄實際需要的內存大小,進而造成內存的浪費。一般情況下,我們要根據業務需求,通過memcache的配置文件來指定各個塊的大小,從而盡可能的減少內存的浪費。

注:由於默認情況下memcache中每頁的大小為1MB,因為單個塊最大為1MB。除此之外,memcache還限制每個數據所對應的鍵的長度不能超過250個字節。

   ③、內存調優

    對於內存利用率和記錄所在位置有影響的因素是:Slab中的各個塊的大小以及塊大小的遞增倍數。

         問題一:例如,各個Slab中塊的大小默認情況下是按照1.25倍的方式遞增。在某種Slab中的塊的大小為80K,另一個Slab中的塊的大小為100K。如果我們需要存入一個81K的數據,那我們只能選擇100K的Slab來存儲數據。此時就會造成較大的內存浪費。

         解決:在設置塊大小的和塊大小的遞增倍數時,需要根據數據的大小以及各個數據的差異幅度。若數據在通常情況下都比較小,則就將最小塊的大小調整得小一些;若數據得大小變動不是很大,則將塊大小的遞增倍數設置的小一些。

         問題二:memcache在計算到底哪個服務實例記錄了具有特定鍵的數據時並不會考慮用來組成緩存系統中各個服務器的差異性。如果每個服務器上只安裝了一個memcache實例,那么每一個memcache實例所擁有的可用內存將存在着數倍的差異。但是由於各個實例被選中的概率基本相同,因此具有較大內存的memcache實例將無法被充分利用。

         解決:我們可以通過在具有較大內存的服務器上部署多個memcache實例。

   ④、內存清理

LRU算法:”最近使用的頁面數據會在未來一段時間內仍然被使用,以及很久沒有使用的頁面有可能在未來很久一段時間內仍然不會被使用“。每次從內存中找到最久未使用的數據然后置換出來,從而存入新的數據。它的主要衡量指標是使用的時間,附加指標是使用的次數。

 

由於緩存系統擁有有限的資源,其會在某一時刻被服務所產生的數據填滿。如果此時緩存系統再次接收到一個緩存數據的請求,那么他就會根據LRU算法以及數據的過期時間來決定需要從緩存系統中移除的數據。

 memcache所使用的過期算法稱為延遲過期:當用戶從memcache實例中讀取數據的時候,其將首先通過配置中所設置的過期時間來決定該數據是否過期。如果已經過期,那么在下一次寫入數據卻沒有足夠空間的時候,memcache會選擇該過期數據所在的內存塊作為新數據的目標地址;如果寫入時沒有相應的記錄被標記為過期,那么LRU算法才被執行;從而找到最久沒有被使用的需要被替換的數據。

 

 注:這里的LRU是在Slab范圍內的,即存入新的數據時,先選擇Slab的塊大小,選擇好之后,選擇相應的數據進行釋放。就算某個不是它規格的數據已經過期,也不會被釋放。

 3、高可用實現原理

    在企業中,所有的架構都需要擁有高可用性和高可用性。大型的服務中,memcache組成的服務端是在服務前端擁有多個memcache服務。而如上表明了memcached所具有獨立性的正確性,一旦其中的某一個memcache實例發生了故障,那么我們還可以從數據庫及服務端再次計算得到該數據,並將其記錄在其他可用的memcache實例上。

    問題:由於memcache實例的個數變化會導致哈希計算的結果發生變化,從而導致所有對數據的請求會導向到不正確的memcache實例,使得由memcache實例集群所提供的緩存服務全部失效,從而導致數據庫的壓力驟增。

    解決:memcache使用一致性Hash算法。在該算法的幫助下,memcache實例的數量變化將只可能導致其中的一部分鍵的哈希值發生改變。

    問題:一個服務的服務端緩存僅僅由一個或幾個memcache實例組成,其中的一個memcache失效。此時數據庫以及服務器實例將接收到大量需要進行復雜計算的請求,並將最終導致服務器和數據庫過載。

    解決:在設計服務端緩存時,我們需要采用超出容量的方法來定義這些緩存。例如:服務實際需要5個memcache節點時,設計稱為一個包含六個節點的服務端緩存系統,以增加整個系統的容錯能力。

    (2)memcache的特點

1、memory。內存存儲速度快,對於內存的要求高,但對CPU要求很低,所緩存的內容不能持久化。

2、集中式cache。避開了分布式cache的傳播問題,但是需要非單點保證他的可靠性,這需要集群的工作。

3、分布式擴展。將部署在一台服務器上的多個memcache服務端或者部署在多個機器上的memcache服務端組成一個虛擬的服務器。對於調用者來說完全屏蔽。提高了單機器的內存利用率。

4、特殊的內存分配機制。支持最大的存儲對象為1M,簡單的分配機制可以更容易地回收再分配。

5、cache機制簡單。

6、客戶端。提供客戶端給使用者提供空間去擴展和設計客戶端來滿足需要。

二、安裝部署(以centos7.6為例)

(1)源碼安裝

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@localhost ~]# yum install gcc libevent-devel -y
[root@localhost ~]# wget http://memcached.org/files/memcached-1.5.22.tar.gz
[root@localhost ~]# tar xf memcached-1.5.22.tar.gz 
[root@localhost ~]# cd memcached-1.5.22
[root@localhost memcached-1.5.22]# mkdir -p /apps/memcached
[root@localhost memcached-1.5.22]# ./configure prefix=/apps/memcached/
[root@localhost memcached-1.5.22]# echo $?
0
[root@localhost memcached-1.5.22]# make && make install
[root@localhost memcached-1.5.22]# echo $?
0
[root@localhost memcached-1.5.22]# tree /apps/memcached/
/apps/memcached/
├── bin
│   └── memcached
├── include
│   └── memcached
│       └── protocol_binary.h
└── share
    └── man
        └── man1
            └── memcached.1

6 directories, 3 files
[root@localhost memcached-1.5.22]# echo 'PATH=/apps/memcached/bin:$PATH' > /etc/profile.d/memcached.sh
[root@localhost memcached-1.5.22]# sh /etc/profile.d/memcached.sh 
[root@localhost memcached-1.5.22]# useradd -r -s /sbin/nologin memcached
[root@localhost memcached-1.5.22]# find / -name memcached -type f
/root/memcached-1.5.22/memcached
/apps/memcached/bin/memcached
[root@localhost memcached-1.5.22]# cp /root/memcached-1.5.22/memcached /usr/bin/


#后台啟動
[root@localhost memcached-1.5.22]# memcached -u memcached -m 2048 -c 65536 &
[1] 9248

#前台啟動
[root@localhost ~]# memcached -d -l 127.0.0.1 -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached.pid
選項:
-d 啟動一個守護進程
-l 監聽服務器IP地址,默認為所有網卡
-p 設置memcached的TCP監聽的端口,默認為11211
-u 是運行memcache的用戶
-m 是分配給memcache使用的內存數量,單位是MB,默認為64MB
-c 是最大運行的並發連接數,默認為1024
-P 是設置保存memcache的pid文件。 [root@localhost
~]# netstat -nltp | grep memcached tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 9404/memcached

(2)yum安裝

[root@localhost ~]# yum install memcached -y
[root@localhost ~]# vim /etc/sysconfig/memcached 
[root@localhost ~]# cat /etc/sysconfig/memcached 
PORT="11211"   #監聽端口
USER="memcached"   #啟動用戶
MAXCONN="1024"   #最大連接數
CACHESIZE="1024"   #最大使用內存
OPTIONS=""   #其他選項
[root@localhost ~]# ps -ef | grep memcached
memcach+   7390      1  0 01:17 ?        00:00:00 /usr/bin/memcached -u memcached -p 11211 -m 1024 -c 1024
root       7397   7264  0 01:17 pts/0    00:00:00 grep --color=auto memcached

三、應用場景與配置

(1)應用場景

  1、web緩存

       場景:有一個網站,上面承載着某個公司的官方網站,側面導航欄上擁有這個公司的各個部門以及聯系方式。

       在以上場景中,公司的部門不會經常改變,所以可以放置在緩存中。

        原本的訪問:

執行一次或多次sql從數據庫中查詢全站的聯系方式-----》 遞歸行成頁面上要顯示的數據-----》進入處理數據-----》顯示到頁面上。

       使用緩存后的訪問:

首次訪問:判斷memcache中是否由這個聯系方式-----》沒有------》執行一次或多次sql從數據庫中查詢全站的聯系方式-----》放入到memcached中-----》進入處理數據-----》顯示到頁面上。 

之后訪問:判斷memcache中是否由這個聯系方式-----》有 ------》從memcached中取出數據-----》進入處理數據-----》顯示到頁面上。

  數據更新

更新數據庫中的聯系方式-----》找到memcached中的key值,刪除-----》重新插入到memcached

   注:memcached的存儲操作是原子性的,所以信息的更新不會讓客戶及只獲得部分數據;他們獲得只會是新版本或者老版本。  

  2、數據庫緩存

        場景:某個網站有一個圖片查看功能,頁面加載時需要從數據庫中查詢信息。

   有x張圖片且同時又y人查看,對應在數據庫中就有x*y條查詢記錄,且還要顯示圖片。當大規模用戶訪問時,數據庫的壓力就會很大,此時可以使用memcached,將圖片信息緩存到memcached上,這樣就可以將數據庫的壓力分散到各個緩存服務器,可以提高網站整體的訪問速度。

(2)配置

基礎配置圖:

 

 1、基礎環境配置

IP地址 主機名 環境
192.168.10.10 web PHP+httpd
192.168.10.11 mysql mysql8.0
192.168.10.12 memcache memcache

 

#三台機器上都要操作
[root@localhost ~]# yum install ntp ntpdate vim wget tree lsof net-tools -y [root@localhost ~]# ntpdate cn.pool.ntp.org 28 Jan 09:38:53 ntpdate[7752]: step time server 84.16.73.33 offset 2548499.251893 sec [root@localhost ~]# hwclock -w #同步時間 [root@localhost ~]# hostnamectl set-hostname memcached #修改名字 [root@localhost ~]# su -l 上一次登錄:三 12月 29 21:34:26 CST 2021從 192.168.10.1pts/0 上 #防火牆 三台機器上都要操作 [root@memcached ~]# systemctl stop firewalld [root@memcached ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@memcached ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config [root@memcached ~]# setenforce 0

 2、web操作

[root@web ~]# rpm -e mariadb-libs postfix
[root@web ~]# wget https://dev.mysql.com/get/archives/mysql-8.0/mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
[root@web ~]# mkdir mysql
[root@web ~]# tar xf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar -C mysql
[root@web ~]# cd mysql
[root@web mysql]# yum localinstall mysql-community-client-8.0.16-2.el7.x86_64.rpm mysql-community-server-8.0.16-2.el7.x86_64.rpm mysql-community-libs-8.0.16-2.el7.x86_64.rpm mysql-community-common-8.0.16-2.el7.x86_64.rpm mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm -y
[root@web ~]# yum install php php-gd php-mysql php-memcache -y
[root@web ~]# systemctl start httpd

 3、mysql操作

#安裝mysql
[root@mysql ~]# rpm -e mariadb-libs postfix
[root@mysql ~]# groupadd mysql
[root@mysql ~]# useradd -g mysql mysql
[root@mysql ~]# mkdir mysql
[root@mysql ~]# wget https://dev.mysql.com/get/archives/mysql-8.0/mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
[root@mysql ~]# tar xf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar -C mysql
[root@mysql ~]# yum localinstall mysql-community-client-8.0.16-2.el7.x86_64.rpm mysql-community-server-8.0.16-2.el7.x86_64.rpm mysql-community-libs-8.0.16-2.el7.x86_64.rpm mysql-community-common-8.0.16-2.el7.x86_64.rpm mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm -y
[root@mysql ~]# systemctl start mysql
[root@mysql ~]# cat /var/log/mysqld.log 
2022-01-28T03:12:56.221405Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: s7mydVxtUk.6
[root@mysql ~]# mysql -uroot -ps7mydVxtUk.6
mysql> alter user 'root'@'localhost' identified by 'Csbu@1234';  #修改密碼
Query OK, 0 rows affected (0.14 sec)


#設置一個用戶,用來遠程連接
mysql> create user 'memcache'@'%' identified by 'Csbu@1234';
Query OK, 0 rows affected (0.34 sec)

mysql> alter user 'memcache'@'%' identified with mysql_native_password by 'Csbu@1234';
Query OK, 0 rows affected (0.15 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| memcache         | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.91 sec)

mysql> 
mysql> 
mysql> 
mysql> 
mysql> grant all privileges on *.* to 'memcache'@'%' with grant option;
Query OK, 0 rows affected (1.64 sec)

mysql> flush privileges;
Query OK, 0 rows affected (1.66 sec)

 web上操作 測試http功能

[root@web ~]# vim /var/www/html/index.html
[root@web ~]# cat /var/www/html/index.html 
this is a test from 192.168.10.10.......

 

測試php功能

[root@web html]# cat index.php 
<?php
phpinfo();
?>  

php功能

 

php連接memcache

php連接數據庫

 

 

 

 由上可得php連接正常

接下來,連接測試php與數據庫的連接情況

[root@web html]# cat mysql.php 
<?php
$link=mysql_connect('192.168.10.11','memcache','Csbu@1234');
if($link) echo "<h1>success!!!</h1>";
else echo "Fail!!!";
mysql_close();
?>

 由上可知,mysql數據庫可以正常連接。

 4、memcache操作

#下載安裝包
[root@memcached ~]# wget https://github.com/downloads/libevent/libevent/libevent-2.1.8-stable.tar.gz
[root@memcached ~]# wget http://memcached.org/files/memcached-1.5.12.tar.gz

#安裝
[root@memcached ~]# tar xf libevent-2.1.8-stable.tar.gz 
[root@memcached ~]# yum install make gcc gcc-c++ -y
[root@memcached ~]# cd libevent-2.1.8-stable
[root@memcached libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent/
[root@memcached libevent-2.1.8-stable]# echo $?
0
[root@memcached libevent-2.1.8-stable]# make && make install
[root@memcached libevent-2.1.8-stable]# echo $?
0
[root@memcached ~]# tar xf memcached-1.5.12.tar.gz 
[root@memcached ~]# cd memcached-1.5.12
[root@memcached memcached-1.5.12]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
[root@memcached memcached-1.5.12]# echo $?
0
[root@memcached memcached-1.5.12]# make && make install
[root@memcached memcached-1.5.12]# echo $?
0

#啟動memcached
[root@memcached ~]# find / -name memcached
/etc/selinux/targeted/active/modules/100/memcached
/root/memcached-1.5.12/memcached
/usr/local/memcached
/usr/local/memcached/bin/memcached
/usr/local/memcached/include/memcached
[root@memcached ~]# cp /usr/local/memcached/bin/memcached /usr/bin/
[root@memcached ~]# memcached -d -l 0.0.0.0 -p 11211 -u root -m 64 -c 1024 -p /var/run/memcached.pid
[root@memcached ~]# ps -ef | grep memcached
root      15878      1  2 15:37 ?        00:00:00 memcached -d -l 0.0.0.0 -p 11211 -u root -m 64 -c 1024 -p /var/run/memcached.pid
root      15897   7025  0 15:37 pts/0    00:00:00 grep --color=auto memcached 

web上測試memcache的連接

[root@web html]# vim memcached.php
[root@web html]# 
[root@web html]# cat memcached.php 
<?php
$memcache = new Memcache;
$memcache->connect('192.168.10.12',11211) or die ("Could not connect");  #ip為memcached的服務器地址,11211為memcached的端口
$version = $memcache->getVersion();
echo "Server's version:".$version."<br>";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 12;
$memcache->set('key',$tmp_object,false,10) or die ("Failed to save data a the server");
echo "Store data in the cache (data will expire in 10 seconds)<br/>";
$get_result = $memcache->get('key');
echo "Data from the cache;<br/>";
var_dump($get_result);
?> 

結果

 

 連接成功,測試通過

配置session

[root@web html]# vim /etc/php.ini
session.save_handler = memcache  #設置session的存儲方式為memcache。默認以文件方式存取session數據。
#如果想使用自定義待得處理來存取session數據,比如memcache方式則修改為session。save_handler=memcache
session.save_path = "tcp://192.168.10.10:11211?persistent=1&weight=1&timeout=1&retry_interval=15" #設置session存儲的位置,多台memcache用逗號隔開。 

測試memcached的可用性:

[root@web html]# vim memcachedcan.php
[root@web html]# cat memcachedcan.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/>";
?>

結果

 

 測試結果。

5、最終測試

在數據庫上創建測試數據庫

mysql> create database test;
Query OK, 1 row affected (0.96 sec)

mysql> use test;
Database changed
mysql> create table test01(id int not null auto_increment,name varchar(20) default null,primary key(id)) engine=innodb auto_increment=1 default charset=utf8;
Query OK, 0 rows affected, 1 warning (1.74 sec)

mysql> desc test01;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.69 sec)

mysql> insert into test01(name) values ('chu'),('zhang'),('yang'),('xiao'),('chen');
Query OK, 5 rows affected (3.13 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from test01;
+----+-------+
| id | name  |
+----+-------+
|  1 | chu   |
|  2 | zhang |
|  3 | yang  |
|  4 | xiao  |
|  5 | chen  |
+----+-------+
5 rows in set (0.09 sec) 

編寫測試腳本

[root@web html]# cat test.php 
<?php
$memcachehost = '192.168.10.12';
$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.10.11","memcache","Csbu@1234");
  mysql_select_db(test);
  $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>"
foreach($data as $a)
{
echo "number is <b><front color=#FF0000>$a[id]</front></b>";
echo "<br>";
echo "name is <b><front color=#FF0000>$a[name]</front><b>";
echo "<br>";
}
?>
[root@web html]#  

結果

 

 注:memcached有一個緩存時間默認為1分鍾,過了一分鍾之后,memcached需要重新從數據庫中取得數據。

四、管理與監控

1、memcache的管理工具

   memadmin是一款可視化memcache的管理與監控工具,使得PHP開發,體積小,操作簡單。

   主要功能:

    服務器參數監控:STATS、SETTINGS、ITEMS、SLABS、SIZES實時刷新。

    服務器性能監控:GET、DELETE、INCR、DESC、CAS等常用操作命中率實時監控。

    支持數據遍歷,方便對存儲內容進行監視。

    支持條件查詢,篩選出滿足條件的KEY或VALUE

    數組、JSON等序列化字符反序列顯示。

    兼容memcache協議的其他服務。

     支持服務器連接池,多服務器管理切換簡潔。

安裝方法:

前提:
需要一個已經安裝httpd的服務器,且需要安裝一個LAMP環境,之前搭建的web服務器即可用

安裝:
[root@web ~]# wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
[root@web ~]# tar xf memadmin-1.0.12.tar.gz 
[root@web ~]# mv memadmin/ /var/www/html/
修改登錄密碼
[root@localhost memadmin]# vim /var/www/html/memadmin/config.php 
$config['user'] = "admin"; // your username
$config['passwd'] = "admin"; // your password 

訪問:

http://IP/memadmin/index.php

 

登錄之后的頁面

 

 連接之后的頁面(監控參數)

2、memcache的監控方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM