Memcached注意
缺乏安全認證以及安全管制
需要將Memcached服務器放置在防火墻(iptables)之后
Linux平臺 (CentOS)安裝Memcached
安裝依賴
yum -y install libevent libevent-devel
以下方式任選一種
方式1. 自動安裝方式 yum -y install memcached # 方式2. 源代碼編譯方式安裝 wget https://memcached.org/latest mv latest memcached-1.5.20.tar.gz tar -zxvf memcached-1.5.20.tar.gz cd memcached-1.5.20 ./configure --prefix=/usr/local/memcached make && sudo make install
# Linux平臺啟動 ./memcached -p 11211 -u root -m 64m 或者 ./memcached -p 11211 -u root -m 64m -d 或者 ./memcached -p 11211 -m 64m -d -u root -l 127.0.0.1 -c 256 -P /tmp/memcached.pid # Linux平臺服務行程查看 ps -ef | grep memcached # 根據埠查看 netstat -tunpl | grep 11211 # 關閉行程 kill -9 pid號
知識補充:
Memcached命令啟動
-d:啟動一個守護行程
-m:分配給mecached服務的記憶體大小,單位MB
-u:運行memcached服務的系統用戶
-l:服務監聽的IP地址,可以有多個地址
-p:服務監聽的埠,默認11211
-c:最大運行的并發客戶端連接數,默認1024
-P:設定保存服務的pid檔案
emcached客戶端 yum -y install telnet telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. ctrl + c 退出客戶端
Windows 平臺
32位系統下載地址 http://downloads.northscale.com/memcached-win32-1.4.4-14.zip # 64位系統下載地址 http://downloads.northscale.com/memcached-win64-1.4.4-14.zip # Windows平臺安裝啟動 C:\memcached\memcached.exe -d install C:\memcached\memcached.exe -d start C:\memcached\memcached.exe -d stop 運行 -> pkgmgr /iu:"TelnetClient"
Memcached常用命令
set命令
- 將資料值存盤到記憶體當中,將value存盤到key當中
- 如果key已經存在,則更新該key的值,否則存盤一個新的值
- key:鍵名稱
- flags:服務器與用戶提供的資料一起存盤的32位無符號整數,并在檢索到專案時隨資料一起回傳
- exptime:在記憶體中保存資料的時間長度(單位:秒,0:永不過期)
- bytes:快取資料的位元組數
- noreply:不需要回傳回應
# 登錄客戶端 telnet 127.0.0.1 11211 # 存盤命令 # set 命令 set www.test.com 1 0 4 best STORED set www.test.com 1 0 4 noreply best # get 命令 get www.test.com
add命令
- 將資料值存盤到記憶體當中,將value存盤到key當中
add www.test.com 1 0 4 best NOT_STORED add www.test.com 1 0 4 noreply best add new 1 0 4 test STORED
replace命令
- 將已存盤的key使用新值替換,如果key不存在,則替換失敗
replace www.test.com 1 0 4 best STORED replace www.test.com 1 0 4 noreply best replace new2 1 0 4 test NOT_STORED
append命令
- 向已存盤的key的值后追加資料
append www.test.com 1 0 4 best STORED append www.test.com 1 0 4 noreply best append new3 1 0 4 test NOT_STORED
prepend命令
- 向已存盤的key的值前追加資料
prepend www.test.com 1 0 4 best STORED prepend www.test.com 1 0 4 noreply best prepend new3 1 0 4 test NOT_STORED
cas(check-and-set)命令
- 當上一次當前客戶端取值后,其他客戶端沒有對該key進行修改,才可以將值寫入
- flags:服務器與用戶提供的資料一起存盤的32位無符號整數,并在檢索到專案時隨資料一起回傳
- exptime:在記憶體中保存資料的時間長度(單位:秒,0:永不過期)
- bytes:快取資料的位元組數,
- unique_cas_token:通過 gets 命令獲取的一個唯一的64位值
- noreply:不需要回傳回應
gets www.imooc.com VALUE www.imooc.com 1 4 36 best END cas www.imooc.com 1 0 4 36 test STORED
get命令
- 獲取存盤在 key(鍵) 中的 value(資料值) ,如果 key 不存在,則回傳空
get www.test.com VALUE www.test.com 1 4 test END get www.test.com test VALUE www.test.com 1 4 test VALUE test 1 4 test END
gets命令
- gets 命令獲取帶有 CAS 令牌存 的 value(資料值) ,如果 key 不存在,則回傳空
gets www.test.com VALUE www.test.com 1 4 36 test END gets www.test.com test VALUE www.test.com 1 4 36 test VALUE test 1 4 37 test END
incr命令
- 用于對已存在的 key(鍵) 的數字值進行自增操作
set count 1 0 1 1 STORED incr count 1 2 incr count 1 3
decr命令
- 用于對已存在的 key(鍵) 的數字值進行自減操作
decr count 1 2 decr count 1 1
stats命令
- 回傳統計資訊例如 PID(行程號)、版本號、連接數等

stats items命令
- 用于顯示各個 slab 中 item 的數目和存盤時長(最后一次訪問距離現在的秒數)

# stats cachedump 命令
stats cachedump 1 0 ITEM www.test.com [4 b; 0 s] ITEM test [4 b; 0 s] END
stats slabs命令
- 用于顯示各個slab的資訊,包括chunk的大小、數目、使用情況等

stats sizes命令
- 用于顯示所有item的大小和個數
# 需要啟動memcached時開啟track_sizes
./memcached -u root -p 11211 -l 127.0.0.1 -d -o track_sizes
stats sizes STAT 96 1 END
# delete 命令
delete www.test.com
DELETED
flush_all命令
- 用于清理快取中的所有 key,value對
- time:指定時間后清除
安裝PHP的memcached擴展
方式1:自動安裝
yum -y install php-memcached 重啟httpd服務 service httpd restart 移除yum安裝的php-memcached yum -y remove php-memcached
方式2:編譯安裝
# 安裝依賴 yum -y install zlib-devel yum -y install libmemcached-devel # 編譯安裝 wget https://pecl.php.net/get/memcached-3.1.4.tgz tar zxvf memcached-3.1.4.tgz cd memcached-3.1.4 /usr/bin/phpize ./configure --with-php-config=/usr/bin/php-config make && make install # 修改php.ini vim /etc/php.ini # 添加 extension="memcached.so" # 保存退出 # 重啟httpd服務 service httpd restart # 臨時關閉 selinux setenforce 0 # 永久關閉 selinux vim /etc/selinux/config # 修改 selinux selinux=disabled # 保存退出
PHP案例:構建高速快取
- 如果快取資料存在,請求memcached服務,查詢快取資料,顯示給用戶
- 如果快取資料不存在,請求資料源資料,將資料存盤至快取中
第一次從資料庫獲取

第二次從快取讀取

進入mysql mysql -uroot -p 創建資料庫 create database cms; use cms; 創建資料表 create table cms_users( id int unsigned not null auto_increment primary key, username varchar(50) not null default '', age tinyint unsigned not null default 0, sex tinyint unsigned not null default 0, major varchar(100) not null default '', created_time datetime null default CURRENT_TIMESTAMP )engine=innodb default charset=utf8; 插入資料 insert into cms_users(username,age,sex,major) values('cyy',22,1,'math'); insert into cms_users(username,age,sex,major) values('cyy2',22,2,'chinese'); insert into cms_users(username,age,sex,major) values('cyy3',23,3,'english'); insert into cms_users(username,age,sex,major) values('cyy4',24,4,'business'); insert into cms_users(username,age,sex,major) values('cyy5',25,5,'php'); 查看資料 select * from cms_users;
users.php
<?php $start = microtime(true); # 建立memcached連接 $mem = new Memcached(); $mem->addServer('127.0.0.1', 11211); $key_name = 'users'; $expire_time = 60;//過期時間 # 判斷用戶資料在快取當中是否存在,如果存在,直接get,顯示給用戶 # 如果不存在,查詢資料庫,將資料寫入到memcached當中,顯示給用戶 if (false === ($users = $mem->get($key_name))) { # 資料不存在于快取當中,呼叫PDO查詢DB $users = fetchDataFromDB(); # 將查詢出的資料寫入到memcached當中 $mem->set($key_name, $users, time() + $expire_time); } function fetchDataFromDB() { echo 'Fetching data from db....'; # Fetch users from mysql using PDO try { $dsn = "mysql:dbname=cms;host=localhost;port=3306"; $pdo = new PDO($dsn, 'root', '123456', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $sql = 'select * from cms_users'; $stmt = $pdo->prepare($sql); $stmt->execute(); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $pe) { echo $pe->getMessage(); } return $users; } $sex_array = ['unknown', 'male', 'female']; echo '<table border=1>'; echo '<tr><th>ID</th><th>USERNAME</th><th>AGE</th><th>SEX</th><th>MAJOR</th><th>CREATED_TIME</th></tr>'; foreach ($users as $user) { echo '<tr>'; echo '<td>'.$user['id'].'</td>'; echo '<td>'.$user['username'].'</td>'; echo '<td>'.$user['age'].'</td>'; echo '<td>'.$sex_array[$user['sex']].'</td>'; echo '<td>'.$user['major'].'</td>'; echo '<td>'.$user['created_time'].'</td>'; echo '</tr>'; } echo '</table>'; $end = microtime(true); echo "Running time: ". ($end-$start);
小案例

<?php $mem = new Memcached(); # telnet 127.0.0.1 11211 $mem->addServer('127.0.0.1', 11211); # stats $stats = $mem->getStats(); # var_dump($stats); $mem->set('php_client', ['one' => 1, 'two' => 2], time() + 60); $res = $mem->get('php_client'); var_dump($res);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84992.html
標籤:PHP
下一篇:Go 與 PHP 的語法對比
