Memcached 之 (2) 命令行、数据导出和导入、存储sessions

5. memcached命令行

Memcached类似于mysql一样,同样支持类似于mysql中创建一个库,创建一个表,插入一个表,查看表数据等。

1 登录 Memcached

1[root@yt-01 ~]# telnet 127.0.0.1 11211 //测试端口 2Trying 127.0.0.1... 3Connected to 127.0.0.1. 4Escape character is '^]'. 5# 进入memcached命令行 6 7stats 关于当前 memcached 实例的信息 8STAT pid 13412 9STAT uptime 1885 10STAT time 1522943511 11STAT version 1.4.24 12STAT libevent 2.0.21-stable 13STAT pointer_size 64 14STAT rusage_user 0.017423 15STAT rusage_system 0.046463 16…… 17 18 19set key2 0 30 2 //手动存储一个数据 20 21其中key2 代表着 key值 220代表着 flags 标记 2330代表着 过期时间 242代表着 2个字节 25--------------------------------------------- 26set key2 0 30 2 //存储key2,标记为0,过期时间30s,2个字节的数据 27ab //输入数据,只能2个字节:ab 28STORED 29get key2 //获取key2数据(因为输入慢了,数据过期了) 30END 31set key2 0 30 2 //重新存 32ab 33STORED 34get key2 //获取成功 35VALUE key2 0 2 36ab 37END

2 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)作为结束标志。

3 Memcached数据示例

1set key3 1 100 4 //存取一个4字节值 2abcd 3STORED 4get key3 //查询key3值 5VALUE key3 1 4 6abcd 7END 8replace key3 1 200 5 //替换key3的值 9abcdx 10STORED 11get key3 //查询替换后的值 12VALUE key3 1 5 13abcdx 14END 15delete key3 //删除key3的值 16DELETED 17get key3 18END 19quit //退出 20Connection closed by foreign host.

6. memcached数据导出和导入

1 导出

1[root@yt-01 ~]# date -d "+1 hour" +%s //显示当前时间加一个小时时间戳 21522948361 3[root@yt-01 ~]# memcached-tool 127.0.0.1:11211 dump >data.txt //导出 4Dumping memcache contents 5 Number of buckets: 1 6 Number of items : 4 7Dumping bucket 1 - 4 total items 8[root@zhdy-01 ~]# cat data.txt 9add key1 1 1522948361 3 10asd 11add name 1 1522948361 5 12justi 13add sex 1 1522948361 3 14man 15add age 1 1522948361 2 1627

2 导入

1[root@yt-01 ~]# nc 127.0.0.1 11211 < data.txt 2若nc命令不存在,yum install nc

注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的。 如果仅仅是为了测试,这样可以办到,因为memcached是缓存在内存中的,只要重启机器或者重启memcached服务缓存数据就会丢失,然后我们再次使用nc 导入就可以了

1[root@yt-01 ~]# systemctl restart memcached 2[root@yt-01 ~]# nc 127.0.0.1 11211 <data.txt 3STORED 4STORED 5STORED 6STORED

7. php连接memcached

1 先安装php的memcache扩展

1[root@yt-01 ~]# cd /usr/local/src/ 2[root@yt-01 src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz 3[root@yt-01 src]# tar zxf memcache-2.2.3.tgz 4[root@yt-01 src]# cd memcache-2.2.3 5[root@yt-01 memcache-2.2.3]# ls 6config9.m4 config.w32 example.php memcache_consistent_hash.c memcache_queue.c memcache_session.c php_memcache.h 7config.m4 CREDITS memcache.c memcache.dsp memcache_queue.h memcache_standard_hash.c README 8[root@yt-01 memcache-2.2.3]# /usr/local/php/bin/phpize //nginx的php目录是/usr/local/php-fpm/bin/phpize 9Configuring for: 10PHP Api Version: 20131106 11Zend Module Api No: 20131226 12Zend Extension Api No: 220131226 13[root@yt-01 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php/bin/php-config 14[root@yt-01 memcache-2.2.3]# echo $? 150 16[root@yt-01 src]# make & make install 17# 报错 18/usr/local/src/memcache-2.2.3/memcache.c: 在函数‘php_mmc_connect'中: 19/usr/local/src/memcache-2.2.3/memcache.c:1902: 错误:提供给函数‘zend_list_insert'的实参太少 20/usr/local/src/memcache-2.2.3/memcache.c:1919: 错误:提供给函数‘zend_list_insert'的实参太少 21/usr/local/src/memcache-2.2.3/memcache.c: 在函数‘zif_memcache_add_server'中: 22/usr/local/src/memcache-2.2.3/memcache.c:1975: 错误:提供给函数‘zend_is_callable'的实参太少 23/usr/local/src/memcache-2.2.3/memcache.c:2003: 错误:提供给函数‘zend_list_insert'的实参太少 24/usr/local/src/memcache-2.2.3/memcache.c: 在函数‘zif_memcache_set_server_params'中: 25/usr/local/src/memcache-2.2.3/memcache.c:2059: 错误:提供给函数‘zend_is_callable'的实参太少 26/usr/local/src/memcache-2.2.3/memcache.c: 在函数‘mmc_find_persistent'中: 27/usr/local/src/memcache-2.2.3/memcache.c:2159: 错误:提供给函数‘zend_list_insert'的实参太少 28/usr/local/src/memcache-2.2.3/memcache.c:2177: 错误:提供给函数‘zend_list_insert'的实参太少 29make: *** [memcache.lo] 错误 1 30 31# 解决方法 32# vim memcache.c 33将所有的:zend_list_insert(pool, le_memcache_pool); 34改为:zend_list_insert(pool, le_memcache_pool TSRMLS_CC); 35将所有的:zend_list_insert(mmc, le_pmemcache); 36改为:zend_list_insert(mmc, le_pmemcache TSRMLS_CC); 37 38讲所有的:if (!zend_is_callable(failure_callback, 0, NULL)) 39改为:if (!zend_is_callable(failure_callback, 0, NULL, NULL)) 40 41修改完成后,重新make编译; 42 43[root@yt-01 memcache-2.2.3]# make & make install 44Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20131226/ 45[root@yt-01 memcache-2.2.3]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/ 46memcache.so opcache.so 47 48[root@yt-01 memcache-2.2.3]# vim /usr/local/php/etc/php.ini 49搜索extension,在extension模块行的最后加上: extension="memcache.so" 50[root@yt-01 memcache-2.2.3]# /usr/local/php/bin/php -m 51有memcache 模块就可以了

2 测试

1[root@yt-01 memcache-2.2.3]# vim 1.php //编辑测试脚本 2<?php 3//连接Memcache Memcache 4$mem = new Memcache; 5$mem->connect("localhost", 11211); 6//保存数据 7$mem->set('key1', 'This is first value', 0, 60); 8$val = $mem->get('key1'); 9echo "Get key1 value: " . $val ."<br>"; 10//替换数据 11$mem->replace('key1', 'This is replace value', 0, 60); 12$val = $mem->get('key1'); 13echo "Get key1 value: " . $val . "<br>"; 14//保存数组数据 15$arr = array('aaa', 'bbb', 'ccc', 'ddd'); 16$mem->set('key2', $arr, 0, 60); 17$val2 = $mem->get('key2'); 18echo "Get key2 value: "; 19print_r($val2); 20echo "<br>"; 21//删除数据 22$mem->delete('key1'); 23$val = $mem->get('key1'); 24echo "Get key1 value: " . $val . "<br>"; 25//清除所有数据 26$mem->flush(); 27$val2 = $mem->get('key2'); 28echo "Get key2 value: "; 29print_r($val2); 30echo "<br>"; 31//关闭连接 32$mem->close(); 33?> 34# 脚本意为: 连接memcache set一个数据, 保存 替换删除 关闭 等。 35 36[root@yt-01 memcache-2.2.3]# /usr/local/php/bin/php 1.php //测试php脚本 37Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array 38( 39 [0] => aaa 40 [1] => bbb 41 [2] => ccc 42 [3] => ddd 43) 44 45 46或者,将1.php放到某个虚拟主机的根目录下,在浏览器测试 47显示如上内容就表示没问题

8. memcached中存储sessions

本节应用场景为LNMP架构下做的负载均衡。假如第一次登录是在A服务器上,第二次登录是在B服务器上,假如使用的是nginx代理upstream可以使用ip_hash;如果使用LVS呢?解决方法是:把session不存在服务器的磁盘上,而是存在memcached上去。memcached作为一个公共的服务器,任何web服务器都可以连接!

1本实例是在lamp/lnmp环境下实现 2编辑php.ini添加两行(待测试) 3session.save_handler = memcache 4session.save_path = "tcp://192.168.122.130:11211" 5或者httpd.conf中对应的虚拟主机中添加 6php_value session.save_handler "memcache" 7php_value session.save_path "tcp://192.168.122.130:11211" 8或者php-fpm.conf对应的pool中添加 9php_value[session.save_handler] = memcache 10php_value[session.save_path] = "tcp://192.168.122.130:11211 "

1 下载测试文件

1wget http://study.lishiming.net/.mem_se.txt 2将其移动到虚拟主机目录中: 3mv /root/.mem_se.txt /data/wwwroot/www.111.com 4 5cp .mem_se.txt 1.php 6在php-fpm.conf对应的pool中添加: 7 8vim /usr/local/php-fpm/etc/php-fpm.conf 9 10添加: 11php_value[session.save_handler] = memcache 12php_value[session.save_path] = "tcp://192.168.122.130:11211" 13 14注:如上要是有专门的memcache服务器,这儿就需要配置独立memcache的地址。 15 16/etc/init.d/php-fpm restart

2 测试

1[root@yt-01 www.111.com]# curl localhost/1.php 21507648188<br><br>1507648188<br><br>41026no8snqjq81phrl7ukovc6 3[root@yt-01 www.111.com]# curl localhost/1.php 41507648268<br><br>1507648268<br><br>e2apbv2kkibntt4r59llfj52r1 5[root@yt-01 www.111.com]# curl localhost/1.php 61507648269<br><br>1507648269<br><br>4mjm7v7thjldh413kuebcbjbe0 7[root@yt-01 www.111.com]# curl localhost/1.php 81507648270<br><br>1507648270<br><br>1if2vpeut27r1siebjlv87ik92 9登录 查看值: 10[root@yt-01 www.111.com]# telnet 127.0.0.1 11211 11Trying 127.0.0.1... 12Connected to 127.0.0.1. 13Escape character is '^]'. 14get i7vddchc2jdjpedsvck2tppra2 15VALUE i7vddchc2jdjpedsvck2tppra2 0 37 16TEST|i:1507648271;TEST3|i:1507648271; 17END 18如上使用get 去查看一个值! 可以查询到相关的数据。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )