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.