78:memcached的命令行及數據導入導出 php鏈接memcache| 存儲session

一、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  最後一個參數

相關文章
相關標籤/搜索