1. 程式人生 > >21.5-21.8 memcached命令行、導出與導入、PHP連接memcached、存儲會話

21.5-21.8 memcached命令行、導出與導入、PHP連接memcached、存儲會話

one spa ctype reads six and touch 臨時 soap

21.5 memcached命令行

創建數據

yum install -y telnet

利用telnet命令連接memcached數據庫

telnet 127.0.0.1 11211

#寫入數據

set key2 0 30 2

12

STORED


這個是錯誤的示範,因為0 30 已經存在

set key 0 30 3

12


CLIENT_ERROR bad data chunk

ERROR

檢測存儲狀態

#利用get key值查看

get key

END

get key2

END

#因為定義了過期時間,且已經過期,所以get key是沒有任何數據顯示


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)作為結束標誌。


Memcached數據示例

set key3 1 100 4

abcd

STORED

get key3

VALUE key3 1 4

abcd

END

replace key3 1 200 5

abcdx

STORED

get key3

VALUE key3 1 5

abcdx

END

delete key3

DELETED

get key3

END


21.6 memcached數據導出和導入

mamcached-tool命令能實現數據導出導入

1 首先telnet進去memcached數據庫創建測試數據

set name 1 0 5

Kevin

STORED

set age 1 0 2

18

STORED

set sex 1 0 4

male

STORED


2 退出telnet:ctrl+]

^] ctrl+]

telnet> quit 輸入quit命令退出

Connection closed. 退出


3 查看memcached狀態

memstat --servers=127.0.0.1:11211

Server: 127.0.0.1 (11211)

pid: 617

uptime: 79684

time: 1530688689

version: 1.4.15

libevent: 2.0.21-stable

pointer_size: 64

rusage_user: 1.421258

rusage_system: 0.940525

curr_connections: 10

total_connections: 17

connection_structures: 11

reserved_fds: 20

cmd_get: 13

cmd_set: 16

cmd_flush: 0

cmd_touch: 0

get_hits: 8

get_misses: 5

delete_misses: 2

delete_hits: 2

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: 716

bytes_written: 10871

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: 12

expired_unfetched: 0

evicted_unfetched: 0

evictions: 0

reclaimed: 2


其中 cmd_set: 16 是剛剛創建的數據項目數量

delete_hits: 2 剛剛刪除的項目


4 把數據導出

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 name 1 1530609005 5

Kevin

add age 1 1530609005 2

18

add sex 1 1530609005 4

male

如果不加重定向操作,會顯示預覽效果

導出重定向到指定文件

memcached-tool 127.0.0.1:11211 dump > mem_data0704.txt

Dumping memcache contents

Number of buckets: 1

Number of items : 3

Dumping bucket 1 - 3 total items


cat !$

cat mem_data0704.txt

add name 1 1530609005 5

Kevin

add age 1 1530609005 2

18

add sex 1 1530609005 4

male


5 從文件導入數據庫

nc 127.0.0.1 11211 < mem_data0704.txt

NOT_STORED

NOT_STORED

NOT_STORED

NOT_STORED的原因,是因為剛剛建立的數據是add進去的,所以數據存在,再導入的話就是覆蓋操作,無意義,

所以需要重啟一下memcached服務來清空數據庫,別忘了memcached的容量是保存在內存中,服務重啟了,數據就會被清空。

systemctl restart memcached

再次導入數據,導入成功。

nc 127.0.0.1 11211 < mem_data0704.txt

STORED

STORED

STORED

註意:導出的數據是帶有一個時間戳的,這個時間戳就是該條數據過期的時間點,如果當前時間已經超過該時間戳,那麽是導入不進去的

要使數據保存時間久點的話,需要修改導出文件的時間戳。

例如,要加一天的時間戳,先把1天的時間戳值取出來

date -d "+1 day" +%s

1530776745

查看 導出時間的文件戳是多少

cat mem_data0704.txt

add name 1 1530609005 5

Kevin

add age 1 1530609005 2

18

add sex 1 1530609005 4

male

修改理想的時間戳

sed -i 's/1530609005/1530776745/g' mem_data0704.txt

cat mem_data0704.txt

add name 1 1530776745 5

Kevin

add age 1 1530776745 2

18

add sex 1 1530776745 4

male

再次導入數據庫,

nc 127.0.0.1 11211 < mem_data0704.txt

STORED

STORED

STORED

再次進入數據庫,查看數據是否存在

telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get name

VALUE name 1 5

Kevin

END

get age

VALUE age 1 2

18

END

get sex

VALUE sex 1 4

male

END

導入成功,done.


Q&A:

為什麽建庫的時候,定義的過期時間值與實際不同,導出的時候數據變成一個時間戳的值?

這是因為系統在創建數據的時候會指定過期時間的,而導出的文件是從memcached導出的。


21.7 php連接memcached

先安裝php的memcache擴展

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

./configure --with-php-config=/usr/local/php-fpm/bin/php-config

make && make install

安裝完後會有類似這樣的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/

vim /usr/local/php-fpm/etc/php.ini

找到extension=

添加一行extension="memcache.so"

檢查 memcached是否被加進去了

/usr/local/php/bin/php-fpm -m

/usr/local/php-fpm/sbin/php-fpm -m

[PHP Modules]

cgi-fcgi

Core

ctype

curl

date

dom

ereg

exif

fileinfo

filter

ftp

gd

hash

iconv

json

libxml

mbstring

mcrypt

memcache

mysql

mysqli

openssl

pcre

PDO

pdo_mysql

pdo_sqlite

Phar

posix

Reflection

session

SimpleXML

soap

SPL

sqlite3

standard

tokenizer

xml

xmlreader

xmlwriter

zlib


下載測試腳本

curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null

1.php內容也可以參考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php

執行腳本

/usr/local/php-fpm/bin/php 1.php

或者將1.php放到某個虛擬主機根目錄下面,在瀏覽器訪問,即可看到效果

最終可以看到數據如下:

[0] => aaa

[1] => bbb

[2] => ccc

[3] => ddd


21.8 memcached中存儲session

查看session存放方式

vim /usr/local/php-fpm/etc/php.ini

session.save_handler = files

files表示sesision存放在本地/tmp/,每產生一個session會產生一個文件

測試如下:

測試前的文件ls狀態

ls -lt /tmp/

srw-rw-rw- 1 root root 0 Jul 4 18:18 aming.sock

srw-rw-rw- 1 root root 0 Jul 4 18:18 php-fcgi.sock

srw-rw-rw- 1 root root 0 Jul 4 17:29 aaa.sock

drwxr-xr-x 2 root root 4096 Jul 2 10:59 hsperfdata_root

srwxrwxrwx 1 mysql mysql 0 Jun 30 15:48 mysql.sock

-rw-r--r-- 1 root root 1283 Jun 27 18:02 fuxi.com_access.log

srwxr-xr-x 1 root root 0 Jun 26 04:06 Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>

drwx------ 3 root root 4096 Apr 19 14:24 systemd-private-f7277ce00b84475293449af32306aba8-ntpd.service-bg2rEZ


在虛擬主機目錄創建php腳本

cd /data/wwwroot/

wget http://study.lishiming.net/.mem_se.txt

mv .mem_se.txt 11.php

curl localhost/11.php

1530699618<br><br>1530699618<br><br>vt380k4sru58kad7k7qfsio8a6

curl localhost/11.php

1530699618<br><br>1530699618<br><br>vt380k4sru58kad7k7qfsio8a6

curl localhost/11.php

1530699618<br><br>1530699618<br><br>vt380k4sru58kad7k7qfsio8a6

curl了3次後,發現多了3個php-fpm產生臨時文件,這個正是要找的會話文件

ls -lt /tmp/

total 24

-rw------- 1 php-fpm php-fpm 37 Jul 4 18:25 sess_0j4a3r7b5ec00668rn0hjsonk4

-rw------- 1 php-fpm php-fpm 37 Jul 4 18:20 sess_vt380k4sru58kad7k7qfsio8a6

-rw------- 1 php-fpm php-fpm 37 Jul 4 18:18 sess_jbv3fihdervat4dceo879mccs7

srw-rw-rw- 1 root root 0 Jul 4 18:18 aming.sock

srw-rw-rw- 1 root root 0 Jul 4 18:18 php-fcgi.sock

srw-rw-rw- 1 root root 0 Jul 4 17:29 aaa.sock

drwxr-xr-x 2 root root 4096 Jul 2 10:59 hsperfdata_root

srwxrwxrwx 1 mysql mysql 0 Jun 30 15:48 mysql.sock

-rw-r--r-- 1 root root 1283 Jun 27 18:02 fuxi.com_access.log

srwxr-xr-x 1 root root 0 Jun 26 04:06 Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>

drwx------ 3 root root 4096 Apr 19 14:24 systemd-private-f7277ce00b84475293449af32306aba8-ntpd.service-bg2rEZ


要修改這些會話文件的存放路徑,需要做如下操作。

把會話文件存到memcached,如下操作:

php-fpm.conf對應的pool中添加

php_value[session.save_handler] = memcache

php_value[session.save_path] = "tcp://ip:port"

重啟php

/etc/init.d/php-fpm restart

刪除/tmp/下面的會話文件

rm -f /tmp/se*

再次進入可以看到會話文件沒有加載到/tmp下面

ls -lt /tmp/

進行curl測試

curl localhost/11.php

1530701432<br><br>1530701432<br><br>e75l0ab8qpp36oapkmun763h53

e75l0ab8qpp36oapkmun763h53是key值,有key值才是正常的輸出,如果無key值是錯誤輸出

進入memcached查看k-v

telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get e75l0ab8qpp36oapkmun763h53

VALUE e75l0ab8qpp36oapkmun763h53 0 37

TEST|i:1530701432;TEST3|i:1530701432;

END

正常輸出,done.







21.5-21.8 memcached命令行、導出與導入、PHP連接memcached、存儲會話