1. 程式人生 > >memcached命令行以及數據導出和導入、 php連接memcached以及儲到sessions

memcached命令行以及數據導出和導入、 php連接memcached以及儲到sessions

pool ash ESS first oca nc命令 無符號 \n conn

memcached命令行

進入到memcached中,如果沒有可以yum安裝
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
set key2 0 30 2
set:是用來儲存數據的
key:這裏面key2是key的名字,因為memcached是屬於key- valux,存數據要有一個key,也要有一個valux。
2:這裏面的2是你要存到數值是兩位的,或者是兩個字節。比如我輸入11,得到的結果為STORED,如果輸入3個字符就會報錯。
get+key的名,可以用來查看是否儲存成功,儲存成功的顯示為儲存的內容+END。

30:這裏面的30為過期時間,就是過了30秒數據就會消失。用get查看只會得到END的結果。

Memcached語法規則

<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

<flags> 是一個16位的無符號的整數(以十進制的方式表示)。該標誌將和需要存儲的數據一起存儲,並在客戶端get數據時返回。客戶端可以將此標誌用做特殊用途,此標誌對服務器來說是不透明的

<exptime> 為過期的時間。若為0表示存儲的數據永遠不過期(但可被服務器算法:LRU 等替換)。如果非0(unix時間或者距離此時的秒數),當過期後,服務器可以保證用戶得不到該數據(以服務器時間為標準)。

<bytes>

需要存儲的字節數,當用戶希望存儲空數據時<bytes>可以為0

<data block>需要存儲的內容,輸入完成後,最後客戶端需要加上\r\n(直接點擊Enter)作為結束標誌

<delete> delete+庫名可以刪除數據

創建數據
set key1 1 110 4
1234
STORED
get key1
VALUE key1 1 4
1234
END

替換數據
replace key1 1 110 5
98756
STORED
get key1
VALUE key1 1 5
98756
END

增加數據
add key1 1 110 2
12
NOT_STORED
add key2 1 110 3
123
STORED
get key2
VALUE key2 1 3
123
END

刪除數據
get key6
VALUE key6 1 3
llt
END
delete key6
DELETED
get key6
END

Memcached數據導出和導入
首先輸入數據
set name 1 0 5
aming
STORED
set age 1 0 2
20
STORED
set k1 1 0 5
12345
STORED
telnet> quit
Connection closed.
然後檢查狀態:memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
pid: 1428
uptime: 5322
time: 1530712057
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.114001
rusage_system: 0.114001
curr_connections: 10
total_connections: 13
connection_structures: 11
reserved_fds: 20
cmd_get: 8
cmd_set: 10
cmd_flush: 0
cmd_touch: 0
get_hits: 5
get_misses: 3
delete_misses: 0
delete_hits: 1
incr_misses: 0
incr_hits: 0
decr_misses: 0
decr_hits: 0
cas_misses: 0
cas_hits: 0
cas_badval: 0
touch_hits: 0
touch_misses: 0
auth_cmds: 0
auth_errors: 0
bytes_read: 356
bytes_written: 264
limit_maxbytes: 67108864
accepting_conns: 1
listen_disabled_num: 0
threads: 4
conn_yields: 0
hash_power_level: 16
hash_bytes: 524288
hash_is_expanding: 0
bytes: 216
curr_items: 3
total_items: 9
expired_unfetched: 0
evicted_unfetched: 0
evictions: 0
reclaimed: 3

導出:
[root@linletao-001 ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contents
Number of buckets: 1
Number of items : 3
Dumping bucket 1 - 3 total items
add k1 1 1530706735 5
12345
add name 1 1530706735 5
aming
add age 1 1530706735 2
20

我們也可以把結果重定向到一個文件裏。
memcached-tool 127.0.0.1:11211 dump > data.txt
[root@linletao-001 ~]# memcached-tool 127.0.0.1:11211 dump > data.txt
Dumping memcache contents
Number of buckets: 1
Number of items : 3
Dumping bucket 1 - 3 total items
[root@linletao-001 ~]# cat data.txt
add k1 1 1530706735 5
12345
add name 1 1530706735 5
aming
add age 1 1530706735 2
20

導入: nc 127.0.0.1 11211 < data.txt
若nc命令不存在,yum install nc
[root@linletao-001 ~]# nc 127.0.0.1 11211 < data.txt
NOT_STORED
NOT_STORED
NOT_STORED
這裏我們發現導入不成功,這是因為在memcached中還有數據,所以不成功。這時我們要重啟一下memcached才可以導入,這是因為memcached是以內存的形式存在,重啟以後數據庫就會清空。
[root@linletao-001 ~]# systemctl restart memcached
[root@linletao-001 ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED
STORED
這樣就可以了。
然後進入memcached查看
[root@linletao-001 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
get name
END
發現沒有數據,,這是因為在我們到處數據的會後數據加了時間戳,所以導入失敗。
[root@linletao-001 ~]# cat data.txt
add k1 1 1530706735 5
12345
add name 1 1530706735 5
aming
add age 1 1530706735 2
20

我們要將數據的時間戳改掉,才可以繼續導入數據。
add k1 1 10000 5
12345
add name 1 1530706735 5
aming
add age 1 10000 2
20
我們將age和k1的時間戳改掉,然後重試一次。
[root@linletao-001 ~]# nc 127.0.0.1 11211
get k1
VALUE k1 1 5
12345
END
get name
END
get age
VALUE age 1 2
20
END
這樣就成功的導入數據了。

php連接memcached
cd /usr/local/src/
wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
tar zxf memcache-2.2.3.tgz
cd memcache-2.2.3
/usr/local/php-fpm/bin/phpize
[root@linletao-001 memcache]# /usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
安裝完後會在/usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
目錄下生成memcache.so opcache.a opcache.so這三個文件,其中memcache.so最為主要。
然後修改 vim /usr/local/php-fpm/etc/php.ini
在擴展模塊extension區域添加一行extension="memcache.so“
檢查/usr/local/php-fpm/bin/php -m
[root@linletao-001 memcache]# /usr/local/php-fpm/bin/php -m|grep memcache
memcache(模塊已經生成)

PHP連接Memcached
下載測試腳本
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
執行腳本
/usr/local/php-fpm/bin/php 1.php
[root@linletao-001 ~]# /usr/local/php-fpm/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
)

memcached中存儲sessions

本實例是在lamp/lnmp環境下實現
httpd.conf中對應的虛擬主機中添加
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
或者php-fpm.conf對應的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://127.0.0.1:11211 "

memcached命令行以及數據導出和導入、 php連接memcached以及儲到sessions