21.5-21.8 memcached命令行、导出与导入、PHP连接memcached、存储会话

21.5 memcached命令行

创建数据

yum install -y telnet

利用telnet命令连接memcached数据库

telnet 127.0.0.1 11211

#写入数据

set key2 0 30 2

12

STORED

这个是错误的示范,因为0 30 已经存在

set key 0 30 3

12

CLIENT_ERROR bad data chunk

ERROR

检测存储状态

#利用get key值查看

get key

END

get key2

END

#因为定义了过期时间,且已经过期,所以get key是没有任何数据显示

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

Memcached数据示例

set key3 1 100 4

abcd

STORED

get key3

VALUE key3 1 4

abcd

END

replace key3 1 200 5

abcdx

STORED

get key3

VALUE key3 1 5

abcdx

END

delete key3

DELETED

get key3

END

21.6 memcached数据导出和导入

mamcached-tool命令能实现数据导出导入

1 首先telnet进去memcached数据库创建测试数据

set name 1 0 5

Kevin

STORED

set age 1 0 2

18

STORED

set sex 1 0 4

male

STORED

2 退出telnet:ctrl+]

^] ctrl+]

telnet> quit 输入quit命令退出

Connection closed. 退出

3 查看memcached状态

memstat --servers=127.0.0.1:11211

Server: 127.0.0.1 (11211)

pid: 617

uptime: 79684

time: 1530688689

version: 1.4.15

libevent: 2.0.21-stable

pointer_size: 64

rusage_user: 1.421258

rusage_system: 0.940525

curr_connections: 10

total_connections: 17

connection_structures: 11

reserved_fds: 20

cmd_get: 13

cmd_set: 16

cmd_flush: 0

cmd_touch: 0

get_hits: 8

get_misses: 5

delete_misses: 2

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: 716

bytes_written: 10871

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: 216

curr_items: 3

total_items: 12

expired_unfetched: 0

evicted_unfetched: 0

evictions: 0

reclaimed: 2

其中 cmd_set: 16 是刚刚创建的数据项目数量

delete_hits: 2 刚刚删除的项目

4 把数据导出

memcached-tool 127.0.0.1:11211 dump

Dumping memcache contents

Number of buckets: 1

Number of items  : 3

Dumping bucket 1 - 3 total items

add name 1 1530609005 5

Kevin

add age 1 1530609005 2

18

add sex 1 1530609005 4

male

如果不加重定向操作,会显示预览效果

导出重定向到指定文件

memcached-tool 127.0.0.1:11211 dump > mem_data0704.txt

Dumping memcache contents

Number of buckets: 1

Number of items  : 3

Dumping bucket 1 - 3 total items

cat !$

cat mem_data0704.txt

add name 1 1530609005 5

Kevin

add age 1 1530609005 2

18

add sex 1 1530609005 4

male

5 从文件导入数据库

nc 127.0.0.1 11211 < mem_data0704.txt

NOT_STORED

NOT_STORED

NOT_STORED

NOT_STORED的原因,是因为刚刚建立的数据是add进去的,所以数据存在,再导入的话就是覆盖操作,无意义,

所以需要重启一下memcached服务来清空数据库,别忘了memcached的容量是保存在内存中,服务重启了,数据就会被清空。

systemctl restart memcached

再次导入数据,导入成功。

nc 127.0.0.1 11211 < mem_data0704.txt

STORED

STORED

STORED

注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的

要使数据保存时间久点的话,需要修改导出文件的时间戳。

例如,要加一天的时间戳,先把1天的时间戳值取出来

date -d "+1 day" +%s

1530776745

查看 导出时间的文件戳是多少

cat mem_data0704.txt

add name 1 1530609005 5

Kevin

add age 1 1530609005 2

18

add sex 1 1530609005 4

male

修改理想的时间戳

sed -i 's/1530609005/1530776745/g' mem_data0704.txt

cat mem_data0704.txt

add name 1 1530776745 5

Kevin

add age 1 1530776745 2

18

add sex 1 1530776745 4

male

再次导入数据库,

nc 127.0.0.1 11211 < mem_data0704.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

VALUE name 1 5

Kevin

END

get age

VALUE age 1 2

18

END

get sex

VALUE sex 1 4

male

END

导入成功,done.

Q&A:

为什么建库的时候,定义的过期时间值与实际不同,导出的时候数据变成一个时间戳的值?

这是因为系统在创建数据的时候会指定过期时间的,而导出的文件是从memcached导出的。

21.7 php连接memcached

先安装php的memcache扩展

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

/usr/local/php-fpm/bin/phpize

./configure --with-php-config=/usr/local/php-fpm/bin/php-config

make && make install

安装完后会有类似这样的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/

vim /usr/local/php-fpm/etc/php.ini

找到extension=

添加一行extension="memcache.so"

检查 memcached是否被加进去了

/usr/local/php/bin/php-fpm -m

/usr/local/php-fpm/sbin/php-fpm -m

[PHP Modules]

cgi-fcgi

Core

ctype

curl

date

dom

ereg

exif

fileinfo

filter

ftp

gd

hash

iconv

json

libxml

mbstring

mcrypt

memcache

mysql

mysqli

openssl

pcre

PDO

pdo_mysql

pdo_sqlite

Phar

posix

Reflection

session

SimpleXML

soap

SPL

sqlite3

standard

tokenizer

xml

xmlreader

xmlwriter

zlib

下载测试脚本

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

1.php内容也可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php

执行脚本

/usr/local/php-fpm/bin/php 1.php

或者将1.php放到某个虚拟主机根目录下面,在浏览器访问,即可看到效果

最终可以看到数据如下:

[0] => aaa

[1] => bbb

[2] => ccc

[3] => ddd

21.8 memcached中存储session

查看session存放方式

vim /usr/local/php-fpm/etc/php.ini

session.save_handler = files

files表示sesision存放在本地/tmp/,每产生一个session会产生一个文件

测试如下:

测试前的文件ls状态

ls -lt /tmp/

srw-rw-rw- 1 root    root       0 Jul  4 18:18 aming.sock

srw-rw-rw- 1 root    root       0 Jul  4 18:18 php-fcgi.sock

srw-rw-rw- 1 root    root       0 Jul  4 17:29 aaa.sock

drwxr-xr-x 2 root    root    4096 Jul  2 10:59 hsperfdata_root

srwxrwxrwx 1 mysql   mysql      0 Jun 30 15:48 mysql.sock

-rw-r--r-- 1 root    root    1283 Jun 27 18:02 fuxi.com_access.log

srwxr-xr-x 1 root    root       0 Jun 26 04:06 Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>

drwx------ 3 root    root    4096 Apr 19 14:24 systemd-private-f7277ce00b84475293449af32306aba8-ntpd.service-bg2rEZ

在虚拟主机目录创建php脚本

cd /data/wwwroot/

wget http://study.lishiming.net/.mem_se.txt

mv .mem_se.txt  11.php

curl localhost/11.php

1530699618<br><br>1530699618<br><br>vt380k4sru58kad7k7qfsio8a6

curl localhost/11.php

1530699618<br><br>1530699618<br><br>vt380k4sru58kad7k7qfsio8a6

curl localhost/11.php

1530699618<br><br>1530699618<br><br>vt380k4sru58kad7k7qfsio8a6

curl了3次后,发现多了3个php-fpm产生临时文件,这个正是要找的会话文件

ls -lt /tmp/

total 24

-rw------- 1 php-fpm php-fpm   37 Jul  4 18:25 sess_0j4a3r7b5ec00668rn0hjsonk4

-rw------- 1 php-fpm php-fpm   37 Jul  4 18:20 sess_vt380k4sru58kad7k7qfsio8a6

-rw------- 1 php-fpm php-fpm   37 Jul  4 18:18 sess_jbv3fihdervat4dceo879mccs7

srw-rw-rw- 1 root    root       0 Jul  4 18:18 aming.sock

srw-rw-rw- 1 root    root       0 Jul  4 18:18 php-fcgi.sock

srw-rw-rw- 1 root    root       0 Jul  4 17:29 aaa.sock

drwxr-xr-x 2 root    root    4096 Jul  2 10:59 hsperfdata_root

srwxrwxrwx 1 mysql   mysql      0 Jun 30 15:48 mysql.sock

-rw-r--r-- 1 root    root    1283 Jun 27 18:02 fuxi.com_access.log

srwxr-xr-x 1 root    root       0 Jun 26 04:06 Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>

drwx------ 3 root    root    4096 Apr 19 14:24 systemd-private-f7277ce00b84475293449af32306aba8-ntpd.service-bg2rEZ

要修改这些会话文件的存放路径,需要做如下操作。

把会话文件存到memcached,如下操作:

php-fpm.conf对应的pool中添加

php_value[session.save_handler] = memcache

php_value[session.save_path] = "tcp://ip:port"

重启php

/etc/init.d/php-fpm restart

删除/tmp/下面的会话文件

rm -f /tmp/se*

再次进入可以看到会话文件没有加载到/tmp下面

ls -lt /tmp/

进行curl测试

curl localhost/11.php

1530701432<br><br>1530701432<br><br>e75l0ab8qpp36oapkmun763h53

e75l0ab8qpp36oapkmun763h53是key值,有key值才是正常的输出,如果无key值是错误输出

进入memcached查看k-v

telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get e75l0ab8qpp36oapkmun763h53

VALUE e75l0ab8qpp36oapkmun763h53 0 37

TEST|i:1530701432;TEST3|i:1530701432;

END

正常输出,done.

原文地址:http://blog.51cto.com/13578154/2136248

时间: 2024-08-02 12:22:37

21.5-21.8 memcached命令行、导出与导入、PHP连接memcached、存储会话的相关文章

用命令行导出和导入MySQL数据库

php 用命令行导出和导入MySQL数据库 命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server 4.1\bin2,导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 如我输入的命令行:mysqldump -u root -p news > news.sql   (输入后会让你输入进入MySQL的密码)(如果导出单张表的话在数据库

php 用命令行导出和导入MySQL数据库

命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server 4.1\bin2,导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 如我输入的命令行:mysqldump -u root -p news > news.sql   (输入后会让你输入进入MySQL的密码)(如果导出单张表的话在数据库名后面输入表名即可)3.会看到文件news.

MySQL命令行导出、导入 Select 查询结果

<!-- 环境: Windows 2003 SP2 + MySQL5.5.28 --> 有的时候需要把在一张表中用 select 语句查询出来的结果保存到另一张结构相同的表中,可以在命令行下使用一对SQL语句完成该操作: 导出查询结果:Select语句 into outfile '保存路径+文件名'; 导入查询结果:load data local infile '保存路径+文件名' into table 表明 character set utf8; 例如: 查询出数据库jc1992中表jc_a

MySQL 命令行导出、导入Select 查询结果

有的时候需要把在一张表中用 select 语句查询出来的结果保存到另一张结构相同的表中,可以有几种方法来实现: 方法一: 在命令行下使用一对SQL语句完成该操作: 导出查询结果:Select语句 into outfile '保存路径+文件名'; 导入查询结果:load data local infile '保存路径+文件名' into table 表明 character set utf8; 例如: 查询出数据库jc1992中表jc_archives中发布时间晚于2014年9月1日的数据并保存在

21.5 memcached命令行;21.6 memcached数据导出和导入;21.7 php连接

21.5 memcached命令行 Memcached语法规则: 1. <command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n 注:\r\n在windows下是Enter键 2. <command name> 可以是set, add, replace 3. set表示按照相应的<key>存储该数据,没有的时候增加,有的时候覆盖 4.

memcached命令行以及数据导出和导入、 php连接memcached以及储到sessions

memcached命令行 进入到memcached中,如果没有可以yum安装telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set key2 0 30 2set:是用来储存数据的key:这里面key2是key的名字,因为memcached是属于key- valux,存数据要有一个key,也要有一个valux.2:这里面的2是你要存到数值是两位的,或者是两个字节.比如我

memcached命令行memcached数据导入和导出PHP链接memcached memcach

memcached命令行 memcached数据导入和导出 PHP链接memcached 先安装php的memcache扩展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/usr/local/php-fpm/bin/phpize./configure --with-php

MySQL用命令行导出数据库

MySQL命令行导出数据库:首先进入cmd然后:1. cd C:\Program Files (x86)\MySQL\MySQL Server 5.1\bin2. mysqldump -uroot -p labos1502 > labos1502.sql3. 提示输入密码时,输入该数据库用户名的密码(如果导出单张表的话在数据库名后面输入表名即可)如果提示locktable错误:则在mysqldump -uroot -p abc后面空一格加上--skip-lock-tables4. 会看到文件la

MySQL命令行导出数据库

MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server 4.1\bin(或者直接将windows的环境变量path中添加该目录) 2,导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 如我输入的命令行:mysqldump -u root -p news > news.sql   (输入后会让你输入进入MySQL的密码)(