目錄
參考
《PHP核心技術與最佳實踐》的第9章:Memcached使用與實踐
在 Windows 10 64 下安裝 Memcached,安裝 PHP 7.0.22 的 Memcache 擴展
PHP7的Windows的memcache擴展Github地址
一、概要
隨着互聯網的發展,特別是Web網站的興起,傳統的關係型數據庫(MySQL、Oracle等)開始出現瓶頸,很多方面不能滿足我們的要求。
比如:
- 對數據庫的高併發讀寫:關係型數據庫在處理過程非常複雜和耗時(如解析SQL語句、事務處理等),如果對關係型數據庫進行高併發讀寫(每秒上萬次的訪問),那麼關係型數據庫是無法承受的
- 對海量數據的處理:對於一些高流量網站來說,每天有上千萬的數據產生(如微博),對於關係型數據庫,如果在一個有上億條數據的數據表中查找某條記錄,效率會很低
對於這種情況,如果是使用Redis或者是Memcached就能很好的解決以上問題。
這裏對Redis不做討論,只討論Memcache。
Memcache 是一款開源、高性能、分佈式內存對象緩存系統,可應用各種需要緩存的場景,其主要目的是通過降低對Database的訪問來加速web應用程序。
Memcache 把從數據庫中讀取到的數據暫存在內存中,等下次訪問同樣數據時,直接從Memcache中讀取。因爲Memcache中的數據存放在內存中,所以訪問速度特別快,但重要數據最好保存在數據庫或硬盤上,防止斷電後Memcache數據丟失。
通俗的理解呢,Memcache其實是隻有一張表的數據庫,數據庫只有兩個字段,一個是key主鍵,一個是value值
Memcache分爲服務端和客戶端
二、服務端
Memcache 服務端有兩個,一個是 Memcache 另一個是 Memcached ,後者比前者要新,功能也比較多,另外Memcache已經停止更新了,所以一般都是用Memcached作爲服務端的
Memcached 是高性能的分佈式內存緩存服務器。 一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、 提高可擴展性。具有以下特點:
- 協議簡單:Memcached的服務器客戶端通信並不使用複雜的XML等格式,而是使用簡單的基於文本的協議
- 基於libevent的事件處理:libevent是個程序庫,將Linux的epoll、BSD類操作系統的kueue等時間處理封裝成統一的接口。Memcached使用這個libevent庫,因此在Linxu、BSD、Solaris等操作系統上發揮其高性能
- 內置內存存儲方式:爲了提高性能,Memcached中保存的數據都存儲在內置的內存存儲空間中。由於數據僅存在內存中,因此重啓操作系統會導致全部數據消失。另外,內容容量達到指定的值之後Memcached會自動刪除不使用的緩存
- Memcached不互相通信的分佈式:Memcached儘管是分佈式緩存服務器,但服務端並沒有分佈式功能,各個Memcached不會互相通信以共享信息,它的分佈式主要是通過客戶端來實現的
如圖:
Memcached 以守護進程的方式運行於一個或多個服務器中,隨時接受來自客戶端的連接操作,客戶端可以由各種語言編寫,如Perl、PHP、Python、Ruby、Java、C等。客戶端在與Memcached服務建立連接之後,接下來的事情就是存取對象了。每個被存儲的對象都有一個唯一標識符key與之相關聯,通過key可以對對象進行存取操作。保存在Memcached的對象實際上是放置在內存中,這也是Memcached如此高效快速的原因了。
官網地址:https://memcached.org
Github地址:https://github.com/memcached/memcached/
截至目前爲止(2019-10-26),Memcached的最新穩定版本爲:1.5.19
注意:Windows版本沒有官方支持,但還是可以使用其他方法進行下載安裝的
1. Linux 安裝
這裏以Centos7作爲例子
A. 安裝libevent-dev
由於Memcached 依賴於 libevent庫,所以必須先安裝 libevent-dev
yum -y install libevent-devel
B. 安裝Memcached
安裝Memcached有兩種方式:
- 編譯安裝
- 使用依賴管理工具yum、apt-get等(推薦)
編譯安裝:
# 下載memcached(可以通過官方下載地址查看最新穩定版本鏈接:https://memcached.org/downloads)
wget https://memcached.org/files/memcached-1.5.19.tar.gz
# 解壓縮
tar -zxvf memcached-1.5.19.tar.gz
# 編譯安裝
cd memcached-1.5.19
./configure --prefix=/usr/local/memcached
make && make install
編譯的時候,如果不指定安裝位置的話,默認是安裝在/usr/local/bin下面的,這裏修改安裝位置爲:/usr/local/memcached
注意:如果是編譯安裝的話,建議是安裝完成之後使用systemctl來管理Memcached服務:
新增Memcached服務
vim /usr/lib/systemd/system/memcached.service :
[Unit]
Description=Memcached
Before=httpd.service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/memcached/bin/memcached -u root -p 11211 -m 128 -c 100
[Install]
WantedBy=multi-user.target
然後就可以使用systemctl來進行memcached的管理了
# 啓動memcached
systemctl start memcached
# 設置開機啓動
systemctl enable memcached
# 查看狀態
systemctl status memcached
# 重啓服務
systemctl restart memcached
# 停止服務
systemctl stop memcached
如果不使用systemctl的話,那麼可以使用以下命令來啓動:
/usr/local/memcached/bin/memcached -d -m 128 -u root -p 11211 -l 127.0.0.1
常用啓動選項:
- -d:以守護線程方式運行
- -l:設置監聽的IP地址,如果是本機的話一般不用設置
- -p:設置監聽的端口號,默認爲11211
- -m:設置使用的內存大小,以M爲單位
- -u:指定用戶
- -c:設置最大併發連接數,默認是11211
- -vv:打印客戶端的請求和返回信息,一般用來調試
更多命令可以通過 -h 來查找
yum安裝:
yum install -y memcached
注意:yum安裝完成之後,默認是會使用systemctl來管理memcached服務的
C. 驗證是否安裝成功
# 驗證是否安裝成功
memcached -h
# 查找安裝位置(yum安裝方式)
rpm -ql memcached
D. 配置文件
注意:只有yum依賴安裝的纔會生成配置文件,編譯安裝的話是沒有該配置文件的
默認的Memcached配置文件位於:/etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
參數說明:
**PORT**:Memcached 使用的默認端口。
**USER**:Memcached 的運行用戶。
**MAXCONN**:允許連接到 Memcached 的最大數目。可以根據你的需求增加任何數量。
**CACHESIZE**:內存的緩存大小。
**OPTIONS**:命令的後續參數
一般不需要修改
E. 開機啓動和啓動
# 設置開機啓動
systemctl enable memcached
# 啓動(systemctl啓動)
systemctl start memcached
# 手動啓動
/usr/local/memcached/bin/memcached -d -m 128 -u root -p 11211 -l 127.0.0.1
驗證是否運行:
netstat -tulpn | grep 11211
# 或者
memcached-tool 127.0.0.1 stats
F. Telnet連接
可以通過telnet連接memcached服務器進行數據存儲,及數據獲取
一些簡單的操作:
# 查看版本
version
# 設置”key”, <command name> <key> <flags> <exptime> <bytes>
set test 0 0 5
# 輸入“value”值,<data block>,字節數與key中的設的“bytes”相同
mymem
# 獲取已設的key的數據
get test
# 推出
quit
比如:
[root@www abc]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
version
VERSION 1.4.15
set test 0 0 5
mymem
STORED
get test
VALUE test 0 5
mymem
END
quit
Connection closed by foreign host.
2. Windows 安裝
Windows版本沒有官方支持,但還是有方法
參考:
http://www.shuijingwanwq.com/2017/09/11/1906/
https://www.runoob.com/Memcached/window-install-memcached.html
Github地址:https://github.com/nono303/memcached
在裏面下載對應版本的memcached即可
截至目前爲止,Windows下的memcached的版本爲:1.5.19
下載完成之後,在在memcached的目錄下的命令行下運行:
memcached.exe -p 11211 -m 150 -u root
命令等同於Linux的命令
注意:在memcached 1.4.5版本之前是可以作爲服務安裝的,即會開啓自啓動,直接使用管理員權限在memcached的目錄下運行:
memcached.exe -d install
然後就可以使用命令來開啓和關閉:
memcached.exe -d start
memcached.exe -d stop
但是在1.4.5以及後面的版本就不行了,需要使用任務計劃中開啓一個普通的進程,在Window啓動時設置memcached自動執行。
具體可以參考http://www.shuijingwanwq.com/2017/09/11/1906/
三、客戶端-PHP
Memcache支持多客戶端,如perl,php,Python,c/c++,Java等等,這裏主要基於php來進行配置。
關於PHP的memcache擴展有兩個:
- memcache
- memcached(推薦)
1. memcache
下載地址:https://pecl.php.net/package/memcache
官方已經停止更新了,最新穩定版本是在2013-04-07發佈的3.0.8版本,並且提供了Windows的擴展下載,但只支持到PHP 5.6,不支持PHP7+版本
2. memcached
這個擴展相比起memcache來說,支持的函數和協議比memcache多,版本也比較新,並且一直在維護中,功能更加強大,另外呢,memcache這個擴展在分佈式讀取數據和高併發下的穩定性上都存在一些問題,所以更加推薦使用memcached來作爲PHP的擴展
下載地址:https://pecl.php.net/package/memcached
Githug地址:https://github.com/php-memcached-dev/php-memcached
最新穩定版本爲2019-10-06發佈的3.1.4版本
注意:3.x是支持PHP 7.0 - 7.4,2.x是支持PHP 5.2 - 5.6
注意:memcached並不支持Windows平臺,如果Windows的PHP想要安裝memcache擴展的話,只能安裝memcache,如果是PHP 5.6及以下版本的話,去官方下載地址下載即可:https://pecl.php.net/package/memcache,如果是PHP 7的版本的話,需要從這裏下載:https://github.com/nono303/PHP7-memcache-dll,這是非官方提供的包,是基於memcache的
1. Linux 安裝
A. 安裝libmemcached
php的memcached擴展是基於libmemcached,所以要先安裝libmemcached
目前是1.0.18版本,最新的穩定版本可以查看官網:https://launchpad.net/libmemcached/+download
# 下載libmemcached(可以去官方下載地址看看最新穩定版本:https://launchpad.net/libmemcached/+download)
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
# 解壓
tar -zxvf libmemcached-1.0.18.tar.gz
# 配置安裝目錄
cd libmemcached-1.0.18/
./configure --prefix=/usr/lib/libmemcached
# 編譯安裝
make && make install
B. 安裝memcached
目前的最新穩定版本是3.1.4版本,最新的穩定版本可以查看官網:https://pecl.php.net/package/memcached
# 下載php-memcached(可以去官方下載地址看看最新穩定版本:https://pecl.php.net/package/memcached)
wget https://pecl.php.net/get/memcached-3.1.4.tgz
# 解壓
tar zxvf memcached-3.1.4.tgz
cd memcached-3.1.4
#使用phpize來生成configure配置文件
/usr/bin/phpize(可以通過find / -name "phpize"找到自己的phpize路徑,如果沒有安裝phpize的話需要安裝yum install -y php-devel)
# 配置
./configure --enable-memcached --with-php-config=/usr/bin/php-config --with-libmemcached-dir=/usr/lib/libmemcached --disable-memcached-sasl
# 編譯安裝
make && make install
C. PHP添加擴展
vim /etc/php.ini
# 增加
extension=memcached.so
D. 重啓Apache或者是Nginx
# apache
systemctl restart httpd
# nginx
systemctl restart nginx
E. 驗證
php -m | grep memcached
也可以通過訪問phinfo頁面來驗證是否成功
2. Windows 安裝
注意:Memcached擴展並不支持Windows平臺,如果Windows的PHP想要安裝memcache擴展的話,只能安裝memcache,如果是PHP 5.6及以下版本的話,去官方下載地址下載即可:https://pecl.php.net/package/memcache,如果是PHP 7的版本的話,需要從這裏下載:https://github.com/nono303/PHP7-memcache-dll,這是非官方提供的包,是基於memcache的
下載
PHP 5.6下載地址:https://pecl.php.net/package/memcache
PHP 7 下載地址:https://github.com/nono303/PHP7-memcache-dll
根據PHP版本選擇對應的dll,然後放到php的安裝目錄下的ext目錄中
設置php.ini
php.ini中增加:
[memcache]
extension = php_memcache.dll
重啓Apache或者是Nginx
驗證
php -m | grep memcached
也可以通過訪問phinfo頁面來驗證是否成功
注意:這裏是memcache不是memcached
3. PHP測試Memcached
vim /var/www/html/test.php
<?php
$mem = new Memcached();
if(!$mem->addServer('127.0.0.1', 11211)){
die('連接失敗!');
}
$mem->set('name','lf');
var_dump($mem->get('name'));
保存之後,瀏覽器訪問,能看到輸出了if,然後註釋掉$mem->set('name','lf');再去訪問,看看能不能輸出if,如果ok則正常
也可以telnet進去看:
可以看到,是有name的值的,說明是正常的
[root@www php-fpm]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get name
VALUE name 0 2
lf
END
注意:如果是Windows下的話,是沒有Memcached類的,需要安裝memcache擴展,使用:Memcache類,即改成:
<?php
$mem = new Memcache;
if (!$mem->connect('127.0.0.1', 11211)) {
die('連接失敗!');
}
$mem->set('name','lf');
var_dump($mem->get('name'));
所以在封裝PHP的Memcache類的時候,特別要注意這一點,另外Memcached的方法基本包含了Memcache的方法,可以兼容