memcached命令行及其用法

21.5 memcached命令行php

建立數據mysql

yum install -y telnet

利用telnet命令鏈接memcached數據庫linux

telnet 127.0.0.1 11211

#寫入數據git

set key2 0 30 2
12
STORED

 

這個是錯誤的示範,由於0 30 已經存在算法

set key 0 30 3
12

CLIENT_ERROR bad data chunk
ERROR

檢測存儲狀態sql

#利用get key值查看數據庫

get key
END
get key2
END

#由於定義了過時時間,且已通過期,因此get key是沒有任何數據顯示json

 

Memcached語法規則vim

  <command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\nwindows

 注:\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-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.

相關文章
相關標籤/搜索