deles 发表于 2018-12-24 13:15:33

memcached的一些简单使用

  笔记内容: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命令行:

# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
  创建数据:

# 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语法规则:

·      \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      
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的状态如下:

# 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
#
  将数据导出到一个文件里:
注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的

# 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
# cat data.txt   # 查看文件内容
add name 1 1514343151 6
zero01
add key1 1 1514343151 5
12345
add age 1 1514343151 2
16
#
  重启服务后将数据导入到memcached里:

# systemctl restart memcached
# nc 127.0.0.1 11211 < data.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
END
get key1
END
get age
END
  如果导入后发现没有数据,这是因为备份文件里记录的时间戳已经过期了,可以修改文件中的时间戳保证数据的有效期。可以写一个简单的脚本批量替换这些文件中的时间戳:

# 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
# sh ./replace.sh
# cat data.txt
add name 1 1514434454 6
zero01
add key1 1 1514434454 5
12345
add age 1 1514434454 2
16
# nc 127.0.0.1 11211 < data.txt# 再次导入
STORED
STORED
STORED
#
  然后再到memcached里查看数据:

# 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环境的并且在之前已经安装好了,所以现在进行扩展即可:

# 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
# ls
config9.m4CREDITS      memcache_consistent_hash.cmemcache_queue.h          php_memcache.h
config.m4   example.phpmemcache.dsp                memcache_session.c      README
config.w32memcache.c   memcache_queue.c            memcache_standard_hash.c
# /usr/local/php-fpm/bin/phpize# 生成config文件
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
# echo $?
0
# make && make install
# echo $?
0
#
  安装完后会有类似这样的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/

# ls /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
memcache.soopcache.aopcache.so
#
  然后修改php.ini添加一行extension=&quot;memcache.so“

# vim /usr/local/php-fpm/etc/php.ini
extension=memcache.so
  检查/usr/local/php-fpm/bin/php -m里是否有memcache模块:

# /usr/local/php-fpm/bin/php -m |grep memcache
memcache
#
  测试:
1.下载测试脚本:

  curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null

  2.执行测试脚本:

# /usr/local/php-fpm/bin/php 1.php
Get key1 value: This is first valueGet key1 value: This is replace valueGet key2 value: Array
(
=> aaa
=> bbb
=> ccc
=> ddd
)
Get key1 value: Get key2 value:
#
  测试输出如上,代表没问题。

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 = &quot;tcp://192.168.77.130:11211&quot;# 指定memcached服务器的ip和端口

  或者php-fpm.conf对应的pool中添加以下两行:

  php_value = memcache
php_value = &quot; tcp://192.168.77.130:11211&quot;

  2.修改完之后重启服务:

# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpmdone
#
  3.测试,下载测试文件 + 移动文件到默认站点目录并更名 + curl测试,素质三连:

# wget http://study.lishiming.net/.mem_se.txt
# mv .mem_se.txt/data/wwwroot/default/1.php
# curl localhost/1.php   # 输出内容如下格式,代表没毛病
151447009915144700990rmd502kjrsvrnqhqtn1a0eih6
#
  那个 0rmd502kjrsvrnqhqtn1a0eih6 就是memcached中的key,通过这个key才能去memcached里拿值,如果没有这个key的话,可能是配置文件没配置对。
  4.进入memcached命令行,看看有没有存储到对应的session数据:

# 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到了该键的值,证明没问题,能够正常存储。



页: [1]
查看完整版本: memcached的一些简单使用