博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcached的一些简单使用
阅读量:7217 次
发布时间:2019-06-29

本文共 8317 字,大约阅读时间需要 27 分钟。

笔记内容:memcached命令行,memcached数据导出和导入,php连接memcached,memcached中存储sessions

笔记日期: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 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.

创建数据:

[root@server ~]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set key2 0 30 2  # 创建一个可以存两个字节的key12  # 这是上面这个key的valueSTORED  # 存储成功set key1 0 30 3   # 创建一个可以存三个字节的keyabc   # 这是上面这个key的valueSTORED   # 存储成功

查询数据:

get key2   # 查询key2的数据VALUE key2 0 2   # key2的信息12   # key2的valueEND  # 查询结束get key1    # 查询key1的数据VALUE key1 0 3   # key1的信息abc     # key1的valueEND     # 查询结束

数据过期了的话就不存在了:

# 数据过期后就查询不到了get key2ENDget key1END

创建数据命令释义:

set key2 0 30 2

set: 创建数据命令(command name)
key2: 创建一个名为key2的key (key)
0 : 特殊标记位(flags)
30 : 定义这个数据的过期时间为30秒(exptime)
2 : 定义这个key所能够存储的value长度,单位是字节 (bytes)

Memcached语法规则:

·   
\r\n
\r\n 注:\r\n在windows下是Enter键 · 可以是set, add, replace· set表示按照相应的
存储该数据,没有的时候增加,有的时候覆盖· add表示按照相应的
添加该数据,但是如果该
已经存在则会操作失败· replace表示按照相应的
替换数据,但是如果该
不存在则操作失败。·
客户端需要保存数据的key·
是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。·
为过期的时间。若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。·
需要存储的字节数,当用户希望存储空数据时
可以为0·
需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)作为结束标志。

replace替换数据示例:

set key1 1 100 4        1234STOREDget key1VALUE key1 1 41234ENDreplace key1 1 200 512345STOREDget key1VALUE key1 1 512345END

delete删除数据示例:

set key1 0 200 512345STOREDget key1VALUE key1 0 512345ENDdelete key1DELETEDget key1END

add添加数据示例:

add key2 0 50 512345STOREDget key2VALUE key2 0 512345END

21.6 memcached数据导出和导入


因为memcached的数据是存储在内存中的,当服务需要重启的时候,需要先让memcached里的数据写到磁盘中,不然数据会丢失。所以介绍一下memcached如何导出和导入数据。

memcached中添加了如下几个不过期的数据:

set name 1 0 6zero01STOREDset age 1 0 216STOREDset key1 1 0 512345 STORED

添加完之后,memcached的状态如下:

[root@server ~]# memstat --servers=127.0.0.1:11211Server: 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.txtDumping memcache contents  Number of buckets: 1  Number of items  : 3Dumping bucket 1 - 3 total items[root@server ~]# cat data.txt   # 查看文件内容add name 1 1514343151 6zero01add key1 1 1514343151 512345add age 1 1514343151 216[root@server ~]#

重启服务后将数据导入到memcached里:

[root@server ~]# systemctl restart memcached[root@server ~]# nc 127.0.0.1 11211 < data.txtSTOREDSTOREDSTORED[root@server ~]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.get nameENDget key1ENDget ageEND

如果导入后发现没有数据,这是因为备份文件里记录的时间戳已经过期了,可以修改文件中的时间戳保证数据的有效期。可以写一个简单的脚本批量替换这些文件中的时间戳:

[root@server ~]# vim replace.sh#!/bin/bashhour=`date -d "+1 hour" +%s`data_time=`cat data.txt |grep add |awk '{print $4}' |sort -n |uniq`for i in $data_timedo   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 6zero01add key1 1 1514434454 512345add age 1 1514434454 216[root@server ~]# nc 127.0.0.1 11211 < data.txt  # 再次导入STOREDSTOREDSTORED[root@server ~]#

然后再到memcached里查看数据:

[root@server ~]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.get nameVALUE name 1 6zero01ENDget key1VALUE key1 1 512345ENDget ageVALUE age 1 216END

可以看到,数据正常导入了。

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]# lsconfig9.m4  CREDITS      memcache_consistent_hash.c  memcache_queue.h          php_memcache.hconfig.m4   example.php  memcache.dsp                memcache_session.c        READMEconfig.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:         20131106Zend Module Api No:      20131226Zend 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.iniextension=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 memcachememcache[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.phpGet key1 value: This is first value
Get key1 value: This is replace value
Get key2 value: Array( [0] => aaa [1] => bbb [2] => ccc [3] => ddd)
Get key1 value:
Get key2 value:
[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 restartGracefully shutting down php-fpm . doneStarting 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
1514470099
0rmd502kjrsvrnqhqtn1a0eih6 [root@localhost ~]#

那个 0rmd502kjrsvrnqhqtn1a0eih6 就是memcached中的key,通过这个key才能去memcached里拿值,如果没有这个key的话,可能是配置文件没配置对。

4.进入memcached命令行,看看有没有存储到对应的session数据:

[root@localhost ~]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.get 0rmd502kjrsvrnqhqtn1a0eih6VALUE 0rmd502kjrsvrnqhqtn1a0eih6 0 37TEST|i:1514470099;TEST3|i:1514470099;END

如上,可以看到get到了该键的值,证明没问题,能够正常存储。

转载于:https://blog.51cto.com/zero01/2055498

你可能感兴趣的文章
谈谈NITE 2的第一个程序HandViewer
查看>>
VS2008 未响应 假死
查看>>
html5、css3及响应式设计入门
查看>>
Win10還原成最乾淨的狀態
查看>>
Java_InvokeAll_又返回值_多个线程同时执行,取消超时线程
查看>>
SaltStack作业
查看>>
单例设计
查看>>
springboot+缓存
查看>>
/*10个filter的属性*/ ---毛玻璃效果
查看>>
折半查找习题解答
查看>>
51单片机的P1
查看>>
[32]JSON
查看>>
3689: 异或之
查看>>
字符串模式匹配KMP算法
查看>>
Android Drawable和Bitmap图片之间转换
查看>>
Debian 8 安装 Nvidia 显卡驱动
查看>>
nginx静态文件访问
查看>>
SharePoint 2013中的默认爬网文件扩展名和分析文件类型
查看>>
c#-冒泡排序-算法
查看>>
IP釋放、清除、以及刷新DNS
查看>>