一、memcached命令行:那麼如何在memcache裏操做:好比建立和存儲數據;php
使用telnet命令,若是沒有則安裝: yum install -y telnetmysql
使用命令 telnet memcached的IP地址 端口nginx
telnet 127.0.0.1 11211 #進入memcached:web
[root@localhost_001 ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
(1):存儲和查詢操做: 由於 key -- value 類型算法
存儲數據: set key1 0 20 3 === set key1的名字 20(過時時間) 3(必須3位的)sql
查詢數據:get key3apache
[root@localhost_001 ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set key1 0 20 3 abc STORED get key1 END set key2 0 40 4 123 CLIENT_ERROR bad data chunk ERROR set key3 0 50 4 trew STORED get key3 VALUE key3 0 4 trew END
註釋:set時最後一位表示位數(如key2 的後面是4,就必須是4位,多或少都會報錯;)vim
set後面的分別是 鍵值key 0 50過時時間 4位數 | 查詢時用get;windows
格式:<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n數組
註釋:注:\r\n在windows下是Enter鍵;
<command name> 能夠是set, add, replace
set表示按照相應的<key>存儲該數據,沒有的時候增長,有的時候覆蓋
add表示按照相應的<key>添加該數據,可是若是該<key>已經存在則會操做失敗
replace表示按照相應的<key>替換數據,可是若是該<key>不存在則操做失敗。
<key> 客戶端須要保存數據的key;
set 0 30 4 ==== set flage exptime bytes
<flags>,即在使用set時 後面的0, 是一個16位的無符號的整數(以十進制的方式表示)。該標誌將和須要存儲的數據一塊兒存儲,並在客戶端get數據時返回。客戶端能夠將此標誌用作特殊用途,此標誌對服務器來講是不透明的。
<exptime> 爲過時的時間。若爲0表示存儲的數據永遠不過時(但可被服務器算法:LRU 等替換)。若是非0(unix時間或者距離此時的秒數),當過時後,服務器能夠保證用戶得不到該數據(以服務器時間爲標準)。
<bytes> j即在使用set時最後買的位數;須要存儲的字節數,當用戶但願存儲空數據時<bytes>能夠爲0,
<data block>須要存儲的內容,輸入完成後,最後客戶端須要加上\r\n(直接點擊Enter)做爲結束標誌。
#####數據示例: 註釋:
set key3 1 100 4 abcd STORED replace key3 1 0 5 abcde STORED get key3 VALUE key3 1 5 abcde END add key3 1 0 4 abcd NOT_STORED
註釋:退格時可使用ctrl+退格鍵才能夠;
二、memcached的數據導入和導出; 使用memcache-tool工具;
有時候memcached須要重啓的時候,最好把數據導入一下,啓動在導入進去;
此時咱們先寫入幾條永久不過時的數據,注意第三列 0 表示永不過時,以下;
set name 1 0 5 ayuan STORED set age 1 0 2 20 STORED set ke1 1 0 5 12345 STORED ^] telnet> quit Connection closed.
退出時使用 ctrl+] ------> quit
使用memstat查看下有幾個項目了, cmd_get 13個項目 cmd_set 13個項目 get_hits;
[root@localhost_001 ~]# memstat --servers=127.0.0.1:11211 Server: 127.0.0.1 (11211) pid: 1826 uptime: 14220 time: 1542213147 total_connections: 15 connection_structures: 11 reserved_fds: 20 cmd_get: 13 cmd_set: 13 cmd_flush: 0 cmd_touch: 0 get_hits: 3 get_misses: 10 delete_misses: 0 delete_hits: 0
2:導出數據,使用memcache-tool工具;
memcache-tool 127.0.0.1:11211 dump > data.txt 導出數據到data.txt文本;
nc 127.0.0.1 11211 < data.txt 導入data.txt的數據到memcached裏;
[root@localhost_001 ~]# memcached-tool 127.0.0.1:11211 dump #此時下面是將要導入的數據; Dumping memcache contents Number of buckets: 1 Number of items : 4 Dumping bucket 1 - 4 total items add ke1 1 1542198927 5 12345 add name 1 1542198927 5 ayuan add age 1 1542198927 2 20 add key3 1 1542198927 5 abcde [root@localhost_001 ~]# memcached-tool 127.0.0.1:11211 dump > data.txt #導出數據到data.txt Dumping memcache contents Number of buckets: 1 Number of items : 4 Dumping bucket 1 - 4 total items
3:此時重啓memcached,會清空數據,而後再導入; 不支持持久化;
[root@localhost_001 ~]# systemctl restart memcached [root@localhost_001 ~]# nc 127.0.0.1 11211 < data.txt STORED STORED STORED STORED [root@localhost_001 ~]# nc 127.0.0.1 11211
註釋:此時導入後查看發現沒有數據的,這是由於數據在到導出來是有一個時間戳,這個時間戳就是這條數據過時的時間點,若是當前的時候已經超過期間戳,是沒法導入進去的;以下,查看時間戳;
[root@localhost_001 ~]# cat data.txt add ke1 1 1542198927 5 12345 add name 1 1542198927 5 ayuan add age 1 1542198927 2 20 add key3 1 1542198927 5 abcde [root@localhost_001 ~]# date -d @1542198927 2018年 11月 14日 星期三 20:35:27 CST
那怎麼辦了就是在導入以前須要從新導出數據的時間戳的;以下;查看兩小時後的時間戳,並從新導入;
[root@localhost_001 ~]# systemctl restart memcached #重啓服務,清空memcache; [root@localhost_001 ~]# date -d "+3 hour" +%s #查看3小時後的時間戳; 1542228042 [root@localhost_001 ~]# vim data.txt #修改第四列的時間戳; add ke1 1 1542228042 5 12345 add name 1 1542228042 5 ayuan add age 1 1000 2 20 [root@localhost_001 ~]# nc 127.0.0.1 11211 < data.txt #導入後: STORED STORED STORED [root@localhost_001 ~]# telnet 127.0.0.1 11211 #查看數據; Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. get key1 END get name VALUE name 1 5 ayuan END get age VALUE age 1 2 20 END ^] telnet> quit Connection closed.
註釋:系統在建立這個數據的時候,又指定一個過時時間的,在導出的時候會本身換算成時間戳,就是 0 也會標記成在建立哪一刻的時間戳;
三、php鏈接memcached:使用LAMP這個架構時,怎麼用php去鏈接memcached;
使用memcached做爲php的擴展存在;那麼如何安裝這個;
1:首先下載memcached這個包;
wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
2:解壓這個包; tar zxvf memcache-2.2.3.tgz
3:使用phpize命令 生成 config 文件;
cd memcache-2.2.3
/usr/local/php/bin/phpize
4:使用config進行編譯;
./configure -with-php-config=/usr/local/php/bin/php-config
5: make && make install
[root@localhost_002 src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz 已發出 HTTP 請求,正在等待迴應... 200 OK 長度:27366 (27K) [application/octet-stream] 正在保存至: 「memcache-2.2.3.tgz」 100%[===========================================================================================>] 27,366 --.-K/s 用時 0.02s 2018-11-16 15:54:20 (1.15 MB/s) - 已保存 「memcache-2.2.3.tgz」 [27366/27366]) [root@localhost_002 src]# tar zxvf memcache-2.2.3.tgz [root@localhost_002 src]# cd memcache-2.2.3 [root@localhost_002 memcache-2.2.3]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226 [root@localhost_002 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php/bin/php-config^C [root@localhost_002 memcache-2.2.3]# echo $? 130 [root@localhost_002 memcache-2.2.3]# make [root@localhost_002 memcache-2.2.3]# make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
4:查下memcached的so文件;
[root@localhost_002 memcache-2.2.3]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/ memcache.so opcache.so
5:編輯php.ini的配置文件; 添加memcached的擴展 /usr/local/php/bin/php.ini
[root@localhost_002 memcache-2.2.3]# vim /usr/local/php/bin/php.ini|grep extension=memcache extension=memcache.so
註釋:能夠放到最後,也能夠放到php的模塊區域;
6:查看php的擴展模塊,看是否有加載memcached; /usr/local/php/bin/php -m
[root@localhost_002 memcache-2.2.3]# /usr/local/php/bin/php -m [PHP Modules] libxml mbstring mcrypt memcache mysql mysqli
註釋:看到有加載memcache模塊;
4:接下來使用LAMP測試下,memcache擴展是否生效;
1:首先下載一個測試文件:也能夠複製下面的內容了;
[root@localhost_002 ~]# curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null [root@localhost_002 ~]# cat 1. 1.php 1.sh 1.txt [root@localhost_002 ~]# cat 1.php <?php //鏈接Memcache Memcache $mem = new Memcache; $mem->connect("192.168.149.129", 11211); //保存數據 $mem->set('key1', 'This is first value', 0, 60); $val = $mem->get('key1'); echo "Get key1 value: " . $val ."<br>"; //替換數據 $mem->replace('key1', 'This is replace value', 0, 60); $val = $mem->get('key1'); echo "Get key1 value: " . $val . "<br>"; //保存數組數據 $arr = array('aaa', 'bbb', 'ccc', 'ddd'); $mem->set('key2', $arr, 0, 60); $val2 = $mem->get('key2'); echo "Get key2 value: "; print_r($val2); echo "<br>"; //刪除數據 $mem->delete('key1'); $val = $mem->get('key1'); echo "Get key1 value: " . $val . "<br>"; //清除全部數據 $mem->flush(); $val2 = $mem->get('key2'); echo "Get key2 value: "; print_r($val2); echo "<br>"; //關閉鏈接 $mem->close(); ?>
註釋:由於是在192.168.149.129這臺上面安裝的memcache,因此IP地址哪裏要注意一下哈;
2:使用php的命令測試; /usr/local/php/bin/php 1.php
[root@localhost_002 ~]# /usr/local/php/bin/php 1.php Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd ) <br>Get key1 value: <br>Get key2 value: <br>[root@localhost_002 ~]# echo $? 0
註釋:出現如上狀況,表示安裝成功;
3:使用memcached中緩存session,用在lnmp的架構下,若是使用了lvs負載均衡,這麼多的web服務器,用戶登陸第一次在A服務器,第二次登陸在B服務器,沒辦法讓某一個用戶固定在一臺服務器上,能夠把session不在存在服務上,而是存在一臺公共的服務上;
註釋:session默認會放在本地的/tmp目錄下,並以文件的形式;
此時開啓192.168.149.130(002)機器;在002機器操做以下;
首先在002機器下載的測試session的文件;並移動當前網站的根目錄下;
[root@localhost_002 ~]# wget http://study.lishiming.net/.mem_se.txt [root@localhost_002 ~]# mv .mem_se.txt /data/wwwroot/abc.com/1.php [root@localhost_002 ~]# cat /data/wwwroot/abc.com/1.php <?php session_start(); if (!isset($_SESSION['TEST'])) { $_SESSION['TEST'] = time(); } $_SESSION['TEST3'] = time(); print $_SESSION['TEST']; print "<br><br>"; print $_SESSION['TEST3']; print "<br><br>"; print session_id(); ?>
2:而後測試: curl localhost/1.php 並查看/tmp/目錄下是否有生成session文件;
[root@localhost_002 ~]# curl localhost/1.php 1542361239<br><br>1542361239<br><br>a93f74dac2a1541a45dc180295730db8 [root@localhost_002 ~]# ls -l /tmp/ srwxrwxrwx 1 mysql mysql 0 10月 5 11:00 mysql.sock -rw------- 1 daemon daemon 37 11月 16 17:40 sess_a93f74dac2a1541a45dc180295730db8
註釋:有生成了一個session的文件;每執行一次就會生成一個sessioon文件;
那麼如何在php關聯memcached,須要修改apache的虛擬主機配置文件的文件: /usr/local/apache2.4/conf/extra/http-vhosts.conf
在對應虛擬主機<VirtualHost *:80> 添加 </VirtualHost >
[root@localhost_002 php]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf php_value session.save_handler "memcache" php_value session.save_path "tcp://192.168.149.129:11211"
重啓apache服務;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
註釋:若是是nginx,則再相應的pool池添加以下內容;
php-fpm.conf對應的pool中添加 php_value[session.save_handler] = memcache php_value[session.save_path] = " tcp://192.168.149.129:11211 "
而後在002上這臺訪問: curl localhost/1.php 會獲得最後一個參數;
php_value_session.save_handler "memcache"
php_value_session.save_path "tcp://192.168.1.115:11211"
而後用telnet 192.168.149.129 11211
get 最後一個參數