21.5 memcached命令行
21.6 memcached数据导出和导入
21.7 php连接memcached
21.8 memcached中存储sessions
21.5 memcached命令行
使用Telnet进入memcached
格式:telnet IP 端口
1
2
3
4
5
6
7
8
9[root@kun01 ~]# yum install -y telnet
[root@kun01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet> quit
退出Telnet按Ctrl+]
再输入quit
撤销按Ctrl+退格键
使用nc进入memcached
格式:nc IP 端口
1
[root@kun01 ~]# nc 127.0.0.1 11211
Memcached语法规则
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
注:\r\n
等于是windows下的Enter键
<command name>
可以是set, add, replaceset
表示按照相应的存储该数据,没有的时候增加,有的时候覆盖 add
表示按照相应的添加该数据,但是如果该 已经存在则会操作失败 replace
表示按照相应的替换数据,但是如果该 不存在则操作失败。
<key>
客户端需要保存数据的key
<flags>
是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
<exptime>
为过期的时间。若为0
表示存储的数据永远不过期
(但可被服务器算法:LRU 等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
例如:10表示10秒的存储时间
<bytes>
需要存储的字节数,当用户希望存储空数据时
例如:2 表示2位
<data block>
需要存储的内容,即为值。输入完成后,最后客户端需要加上\r\n
(直接点击Enter)作为结束标志。
添加键
1 | set key1 0 100 2 ## 0为标记 100为存储时间 2为2位数 |
获得键对应的值
1 | get key1 |
替换值
1 | replace key1 0 1000 3 ##replace和set一样也要输入<flags> <exptime> <bytes> |
删除键
1 | delete key1 |
21.6 memcached数据导出和导入
由于memcached在重启服务或者重启机器就会把数据丢掉,因此需要把数据进行备份。
使用memcached-tool命令把数据导出
格式:memcached-tool IP:端口 dump > 备份文件
1
2
3
4
5[root@kun01 ~]# memcached-tool 127.0.0.1:11211 dump > date.txt
Dumping memcache contents
Number of buckets: 1
Number of items : 3
Dumping bucket 1 - 3 total items
1 | [root@kun01 ~]# cat date.txt |
1 | [root@kun01 ~]# date -d @1534285054 |
通过时间戳找出对应的时间。因为我们装置设定数据的过期时间为0,永不过期。但是导出数据就会把创建数据的时间为过期时间,因此要把时间改一改,不然导入数据就会出问题
使用nc命令把数据导入
格式:nc IP 端口 < 备份文件
1 | [root@kun01 ~]# nc 127.0.0.1 11211 < date.txt |
1 | [root@kun01 ~]# nc 127.0.0.1 11211 ##使用nc进入memcached发型数据还在 |
21.7 php连接memcached
当php和memcached打交道时候,需要有memcache模块。而memcache模块下载回来是需要源码安装的。
步骤
- 进入src目录并下载解压memcache
1 | [root@kun07 ~]# cd /usr/local/src/ |
2.进入memcache目录下并生成configure文件
1 | [root@kun07 src]# cd memcache-2.2.3 |
这里是缺少autoconf导致的因此安装autoconf再来phpize1
2
3
4
5
6[root@kun07 memcache-2.2.3]# yum install -y autoconf
[root@kun07 memcache-2.2.3]# /usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
/usr/local/php-fpm/bin/phpizes
用来生成configure文件
3.初始化
1 | [root@kun07 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config |
4.编译 安装
错误11
2/usr/local/src/memcache-2.2.3/memcache.c:40:40: 致命错误:ext/standard/php_smart_str.h:没有那个文件或目录
#include "ext/standard/php_smart_str.h"
这里是由于PHP7中缺少php_smart_str.h的文件导致的只能使用php5.几的版本来安装memcache模块 我们重新使用php5来安装memcache模块
错误21
2
3
4
5
6
7In file included from /usr/local/php/include/php/Zend/zend_API.h:27:0,
from /usr/local/php/include/php/main/php.h:39,
from /usr/local/src/memcache-2.2.3/memcache.c:26:
/usr/local/php/include/php/Zend/zend_list.h:73:14: 附注:在此声明
ZEND_API int zend_list_insert(void *ptr, int type TSRMLS_DC);
^
make: *** [memcache.lo] 错误 1
将所有的:zend_list_insert(pool, le_memcache_pool);
改为:zend_list_insert(pool, le_memcache_pool TSRMLS_CC);
将所有的:zend_list_insert(mmc, le_pmemcache);
改为:zend_list_insert(mmc, le_pmemcache TSRMLS_CC);
讲所有的:if (!zend_is_callable(failure_callback, 0, NULL))
改为:if (!zend_is_callable(failure_callback, 0, NULL, NULL))
修改memcache.c下面的参数
1 | vim memcache.c |
1 | [root@kun02 memcache-2.2.3]# make |
5.查看模块
1 | [root@kun02 memcache-2.2.3]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/ |
6.加载扩张模块
1 | [root@kun02 memcache-2.2.3]# vim /usr/local/php/etc/php.ini |
在下面添加上extension=memcache.so
1
extension=memcache.so
7.查看加载的模块
1 | [root@kun02 memcache-2.2.3]# /usr/local/php/bin/php -m |grep memcache |
测试
下载一个php的测试页面看是否支持php来操作memcache
代码内容在https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php
1 | [root@kun02 ~]# curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null |
在浏览器下访问
21.8 memcached中存储session
当某个用户登录web服务器上时候,由于后端有多台服务器,为了让用户的登录状态等信息持续在线,就可以让用户的session(一般存在服务器磁盘上)存在memcached中,即使用户登录不同的web服务器,他的登录状态也不会发生变化。有三种方法
1.编辑php.ini文件
1 | [root@kun02 ~]# vim /usr/local/php/etc/php.ini |
找到下面参数,并注释掉1
session.save_handler = files
它表示session以文件的形式存在tmp
目录下
添加下面参数1
2session.save_handler = memcache
session.save_path = "tcp://192.168.80.101:11211"
session.save_handler
定义session的存储类型 session.save_path
定义session的地址
2.编辑httpd.conf中对应的虚拟主机
1 | [root@kun02 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf |
在<VirtualHost *:80>
里面添加下面代码1
2php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.80.101:11211"
3.编辑php-fpm.conf对应的pool
1 | [root@kun02 ~]# vim /usr/local/php-fpm/etc/php-fpm.d/test1.conf |
在pool中添加下面代码1
2php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.80.101:11211"
测试
下载一个php测试页面看memcache是否存储了session
代码内容在https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php1
2[root@kun02 ~]# wget http://study.lishiming.net/.mem_se.txt
[root@kun02 ~]# cp .mem_se.txt /var/www/test1.com/index.php
访问几次测试页面 最后的为键名1
2
3
4[root@kun02 ~]# curl localhost
1534369326<br><br>1534369326<br><br>hgabpcb0fj86rq2fkf3j8osr77
[root@kun02 ~]# curl localhost
1534369332<br><br>1534369332<br><br>ln16irtfbb24ollb29alemc763
发现memcached下多了3个项目1
2[root@kun02 ~]# memcached-tool 127.0.0.1:11211 stats |grep curr_items
curr_items 3
进入memcached1
2
3
4
5
6
7
8
9
10
11
12[root@kun02 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get hgabpcb0fj86rq2fkf3j8osr77
VALUE hgabpcb0fj86rq2fkf3j8osr77 0 37
TEST|i:1534369326;TEST3|i:1534369326;
END
get ln16irtfbb24ollb29alemc763
VALUE ln16irtfbb24ollb29alemc763 0 37
TEST|i:1534369332;TEST3|i:1534369332;
END
发现mem已经存储了session了