memcached的一些简单使用
2017-12-28 14:34
387 查看
笔记内容:memcached命令行,memcached数据导出和导入,php连接memcached,memcached中存储sessions
笔记日期:2017-12-28
21.5 memcached命令行
21.6 memcached数据导出和导入
21.7 php连接memcached
21.8 memcached中存储sessions
使用telnet可以进入memcached命令行:
创建数据:
查询数据:
数据过期了的话就不存在了:
创建数据命令释义:
set key2 0 30 2
set: 创建数据命令(command name)
key2: 创建一个名为key2的key (key)
0 : 特殊标记位(flags)
30 : 定义这个数据的过期时间为30秒(exptime)
2 : 定义这个key所能够存储的value长度,单位是字节 (bytes)
Memcached语法规则:
replace替换数据示例:
delete删除数据示例:
add添加数据示例:
memcached中添加了如下几个不过期的数据:
添加完之后,memcached的状态如下:
将数据导出到一个文件里:
注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的
重启服务后将数据导入到memcached里:
如果导入后发现没有数据,这是因为备份文件里记录的时间戳已经过期了,可以修改文件中的时间戳保证数据的有效期。可以写一个简单的脚本批量替换这些文件中的时间戳:
然后再到memcached里查看数据:
可以看到,数据正常导入了。
1.先安装php的memcache扩展,我这里的php是LNMP环境的并且在之前已经安装好了,所以现在进行扩展即可:
安装完后会有类似这样的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
然后修改php.ini添加一行extension="memcache.so“
检查/usr/local/php-fpm/bin/php -m里是否有memcache模块:
测试:
1.下载测试脚本:
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
2.执行测试脚本:
测试输出如上,代表没问题。
这里演示的是lnmp环境下的配置:
php服务默认会把session信息存在本地文件中,所以需要修改存储的类型。
1.编辑php.ini配置文件添加以下两行:
session.save_handler = memcache # 指定session的存储类型
session.save_path = "tcp://192.168.77.130:11211" # 指定memcached服务器的ip和端口
或者php-fpm.conf对应的pool中添加以下两行:
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.77.130:11211"
2.修改完之后重启服务:
3.测试,下载测试文件 + 移动文件到默认站点目录并更名 + curl测试,素质三连:
那个 0rmd502kjrsvrnqhqtn1a0eih6 就是memcached中的key,通过这个key才能去memcached里拿值,如果没有这个key的话,可能是配置文件没配置对。
4.进入memcached命令行,看看有没有存储到对应的session数据:
如上,可以看到get到了该键的值,证明没问题,能够正常存储。
笔记日期:2017-12-28
21.5 memcached命令行
21.6 memcached数据导出和导入
21.7 php连接memcached
21.8 memcached中存储sessions
21.5 memcached命令行
memcached也是和mysql一样有一个命令行,能在命令行中创建和检索数据。使用telnet可以进入memcached命令行:
[root@server ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
创建数据:
[root@server ~]# 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 # 创建一个可以存两个字节的key
12 # 这是上面这个key的value
STORED # 存储成功
set key1 0 30 3 # 创建一个可以存三个字节的key
abc # 这是上面这个key的value
STORED # 存储成功
查询数据:
get key2 # 查询key2的数据 VALUE key2 0 2 # key2的信息 12 # key2的value END # 查询结束 get key1 # 查询key1的数据 VALUE key1 0 3 # key1的信息 abc # key1的value END # 查询结束
数据过期了的话就不存在了:
# 数据过期后就查询不到了 get key2 END get key1 END
创建数据命令释义:
set key2 0 30 2
set: 创建数据命令(command name)
key2: 创建一个名为key2的key (key)
0 : 特殊标记位(flags)
30 : 定义这个数据的过期时间为30秒(exptime)
2 : 定义这个key所能够存储的value长度,单位是字节 (bytes)
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)作为结束标志。
replace替换数据示例:
set key1 1 100 4 1234 STORED get key1 VALUE key1 1 4 1234 END replace key1 1 200 5 12345 STORED get key1 VALUE key1 1 5 12345 END
delete删除数据示例:
set key1 0 200 5 12345 STORED get key1 VALUE key1 0 5 12345 END delete key1 DELETED get key1 END
add添加数据示例:
add key2 0 50 5 12345 STORED get key2 VALUE key2 0 5 12345 END
21.6 memcached数据导出和导入
因为memcached的数据是存储在内存中的,当服务需要重启的时候,需要先让memcached里的数据写到磁盘中,不然数据会丢失。所以介绍一下memcached如何导出和导入数据。memcached中添加了如下几个不过期的数据:
set name 1 0 6 zero01 STORED set age 1 0 2 16 STORED set key1 1 0 5 12345 STORED
添加完之后,memcached的状态如下:
[root@server ~]# memstat --servers=127.0.0.1:11211 Server: 127.0.0.1 (11211) pid: 7578 uptime: 84193 time: 1514427344 version: 1.4.15 libevent: 2.0.21-stable pointer_size: 64 rusage_user: 1.145116 rusage_system: 0.551031 curr_connections: 10 total_connections: 16 connection_structures: 12 reserved_fds: 20 cmd_get: 14 cmd_set: 18 cmd_flush: 0 cmd_touch: 0 get_hits: 8 get_misses: 6 delete_misses: 0 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: 829 bytes_written: 3719 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: 219 curr_items: 3 total_items: 15 expired_unfetched: 1 evicted_unfetched: 0 evictions: 0 reclaimed: 4 [root@server ~]#
将数据导出到一个文件里:
注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的
[root@server ~]# 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@server ~]# cat data.txt # 查看文件内容 add name 1 1514343151 6 zero01 add key1 1 1514343151 5 12345 add age 1 1514343151 2 16 [root@server ~]#
重启服务后将数据导入到memcached里:
[root@server ~]# systemctl restart memcached
[root@server ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED
STORED
[root@server ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
get name
END
get key1
END
get age
END
如果导入后发现没有数据,这是因为备份文件里记录的时间戳已经过期了,可以修改文件中的时间戳保证数据的有效期。可以写一个简单的脚本批量替换这些文件中的时间戳:
[root@server ~]# vim replace.sh #!/bin/bash hour=`date -d "+1 hour" +%s` data_time=`cat data.txt |grep add |awk '{print $4}' |sort -n |uniq` for i in $data_time do sed -i "s/$i/$hour/g" `grep $i -rl /root/data.txt` done [root@server ~]# sh ./replace.sh [root@server ~]# cat data.txt add name 1 1514434454 6 zero01 add key1 1 1514434454 5 12345 add age 1 1514434454 2 16 [root@server ~]# nc 127.0.0.1 11211 < data.txt # 再次导入 STORED STORED STORED [root@server ~]#
然后再到memcached里查看数据:
[root@server ~]# 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 6
zero01
END
get key1
VALUE key1 1 5
12345
END
get age
VALUE age 1 2
16
END
可以看到,数据正常导入了。
21.7 php连接memcached
在LNMP、LAMP等环境下,我们需要让php与memcached进行交互,就像php与mysql交互那样,php也得通过某个模块连接memcached后,才能进行数据的呈现、交互等操作。1.先安装php的memcache扩展,我这里的php是LNMP环境的并且在之前已经安装好了,所以现在进行扩展即可:
[root@server ~]# cd /usr/local/src/ [root@server /usr/local/src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz [root@server /usr/local/src]# tar zxf memcache-2.2.3.tgz [root@server /usr/local/src]# cd memcache-2.2.3 [root@server /usr/local/src/memcache-2.2.3]# ls config9.m4 CREDITS memcache_consistent_hash.c memcache_queue.h php_memcache.h config.m4 example.php memcache.dsp memcache_session.c README config.w32 memcache.c memcache_queue.c memcache_standard_hash.c [root@localhost /usr/local/src/memcache-2.2.3]# /usr/local/php-fpm/bin/phpize # 生成config文件 Configuring for: PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226 [root@localhost /usr/local/src/memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config [root@localhost /usr/local/src/memcache-2.2.3]# echo $? 0 [root@localhost /usr/local/src/memcache-2.2.3]# make && make install [root@localhost /usr/local/src/memcache-2.2.3]# echo $? 0 [root@localhost /usr/local/src/memcache-2.2.3]#
安装完后会有类似这样的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
[root@localhost /usr/local/src/memcache-2.2.3]# ls /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/ memcache.so opcache.a opcache.so [root@localhost /usr/local/src/memcache-2.2.3]#
然后修改php.ini添加一行extension="memcache.so“
[root@localhost /usr/local/src/memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini extension=memcache.so
检查/usr/local/php-fpm/bin/php -m里是否有memcache模块:
[root@localhost /usr/local/src/memcache-2.2.3]# /usr/local/php-fpm/bin/php -m |grep memcache memcache [root@localhost /usr/local/src/memcache-2.2.3]#
测试:
1.下载测试脚本:
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
2.执行测试脚本:
[root@localhost ~]# /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 ) <br>Get key1 value: <br>Get key2 value: <br> [root@localhost ~]#
测试输出如上,代表没问题。
21.8 memcached中存储sessions
在负载均衡集群中,用户第一次访问的是A服务器,并且在该服务器上登录了账户,这个登录信息就保存在session中。由于是集群的关系,所以用户可能下一次再访问的时候就不是访问到A服务器上,而是访问到B服务器上了。但是之前的session却保存在A服务器上,那么用户在B服务器上就只能重新登录一次,因为在B服务器上并没有session信息。所以为了让集群中的服务器都能够共享session,就可以把session存储在一个memcached服务器中,所有的web服务器往这台memcached服务器上读session信息,就能做到简单的session共享。这里演示的是lnmp环境下的配置:
php服务默认会把session信息存在本地文件中,所以需要修改存储的类型。
1.编辑php.ini配置文件添加以下两行:
session.save_handler = memcache # 指定session的存储类型
session.save_path = "tcp://192.168.77.130:11211" # 指定memcached服务器的ip和端口
或者php-fpm.conf对应的pool中添加以下两行:
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.77.130:11211"
2.修改完之后重启服务:
[root@localhost ~]# /etc/init.d/php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done [root@localhost ~]#
3.测试,下载测试文件 + 移动文件到默认站点目录并更名 + curl测试,素质三连:
[root@localhost ~]# wget http://study.lishiming.net/.mem_se.txt [root@localhost ~]# mv .mem_se.txt /data/wwwroot/default/1.php [root@localhost ~]# curl localhost/1.php # 输出内容如下格式,代表没毛病 1514470099<br><br>1514470099<br><br>0rmd502kjrsvrnqhqtn1a0eih6 [root@localhost ~]#
那个 0rmd502kjrsvrnqhqtn1a0eih6 就是memcached中的key,通过这个key才能去memcached里拿值,如果没有这个key的话,可能是配置文件没配置对。
4.进入memcached命令行,看看有没有存储到对应的session数据:
[root@localhost ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. get 0rmd502kjrsvrnqhqtn1a0eih6 VALUE 0rmd502kjrsvrnqhqtn1a0eih6 0 37 TEST|i:1514470099;TEST3|i:1514470099; END
如上,可以看到get到了该键的值,证明没问题,能够正常存储。
相关文章推荐
- symbian中活动对象的一些简单的使用
- java.util.Properties 的一些简单使用
- 关于使用PRO*C编程的一些简单说明和例子
- Oracle 日期的一些简单使用
- 关于使用PRO*C编程的一些简单说明和例子
- 一个简单的动态编译器,支持C#和VB.NET。当你想测试一些简单的代码的时候可以使用。
- Request对象的一些简单使用
- 超简单使用MemCached
- winform中treeView的简单使用(连数据库和一些特殊要求)
- .NET4中Task类和Parallel类的一些简单使用
- 先简单写一个,Linux下man命令使用的一些东东
- AVR-GCC 的简单说明和个人的一些使用经
- 下面简单使用Jquery来操作iframe的一些记录,这个使用纯JS也可以实现。
- linux 的命令使用及一些简单常用的命令
- SQL 使用函数一些简单的事例
- 关于使用PRO*C编程的一些简单说明和例子
- Oracle中日期的一些简单使用
- symbian中活动服务对象的一些简单的使用
- 【转】symbian中活动对象的一些简单的使用
- Linux一些简单的使用技巧