nosql——memcached(二)

回复 收藏

## 21.5 memcached命令行

```

[root@adailinux ~]# telnet 127.0.0.1 11211

#连接到memcached

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

###按Ctrl+]或者输入quit可以退出

set adai 0 30 2

#添加数据

ab

STORED

说明:

adai:键值名称;

0:标记,记录额外信息

30:数据保留时长

2:数据长度(字符数)

get adai

#查看数据

VALUE adai 0 2

ab

END

```

**注:** 进入memcached后可以使用Ctrl+backspace键逐个删除当前行数据,Ctrl+u一次性清除当前行数据。  

### memcached语法规则  

command name |        set/add/replace

---- | ----

key        | 查找关键字

flags        | 客户机使用它存储关于键值对的额外信息(标记)

exptime        | 该数据的存活时间,0表示永远

bytes        | 存储字节数

data block        | 存储的数据块(可直接理解为key-value结构中的value)

格式: < command name > < key > < flags > < expiretime > < bytes >\r\n   < data block >\r\n  

* <command name> 可以是"set", "add", "replace"

  *  "set"表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖

  *  "add"表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败

  *   "replace"表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败

* <key> 客户端需要保存数据的key

* <flags> 是一个16位的无符号的整数(以十进制的方式表示)

  * 该标志将和需要存储的数据一起存储,并在客户端get数据时返回

  * 客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的  

* <exptime> 过期的时间

  * 若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)

  * 如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)

* <bytes> 需要存储的字节数(不包含最后的"\r\n"),当用户希望存储空数据时,<bytes>可以为0

* 最后客户端需要加上"\r\n"作为"命令头"的结束标志(=Enter)。 

* <data block>:要存储的内容(在上述参数设置完毕后,enter后再输入数据)

**示例:**  

```

set key1 0 0 2

12

STORED

添加一个数据

get key1

VALUE key1 0 2

12

END

#查看数据

delete key1 0

DELETED

#删除一个数据

get key1

END

quit

Connection closed by foreign host.

[root@localhost ~]# telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

set adai 0 0 3

123

STORED

get adai

VALUE adai 0 3

123

END

replace adai 2 200 5

12345

STORED

#更改数据

get adai

VALUE adai 2 5

12345

END

quit

Connection closed by foreign host.

查看数据状态:

[root@localhost ~]# memcached-tool 127.0.0.1:11211 display

  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM

  1      96B        22s       1       1     yes        0        0    0

#Item_Size项目大小(类似于块的概念),该列以递增的形式显示

```

**注:** 某数据超出其expire time之后该数据就会消失,如果expire time=0,表示永不失效,可使用LRU等算法替换该数据。  

## 21.6 memcached数据导出和导入

因为memcached数据不能持久化(重启memcached服务数据会丢失),所以在重启服务之前最好将其中的数据导出,待重启完毕后再将数据导入memcached,防止数据丢失。

### 数据导出

**准备数据:**  

```

[root@adailinux ~]# telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

set name 1 0 4

adai

STORED

set age 1 0 2

26

STORED

set weight 1 0 2

80

set high 1 0 3

180

STORED

^]

telnet> quit

Connection closed.

```

**查看数据状态:**  

```

[root@adailinux ~]# memstat --servers=127.0.0.1:11211

        curr_items: 4

```

即,当前有4个项目。  

**导出数据:**  

```

[root@adailinux ~]# memcached-tool 127.0.0.1:11211 dump > /tmp/memdata.bak

Dumping memcache contents

  Number of buckets: 1

  Number of items  : 4

Dumping bucket 1 - 4 total items

[root@adailinux ~]# cat /tmp/memdata.bak

add high 1 1506759339 3

180

add name 1 1506759339 4

adai

add weight 1 1506759339 2

80

add age 1 1506759339 2

26

```

### 导入数据

```

[root@adailinux ~]# nc 127.0.0.1 11211 < /tmp/memdata.bak

NOT_STORED

NOT_STORED

NOT_STORED

NOT_STORED

#数据已经存在,所以无法导入。

[root@adailinux ~]# systemctl restart memcached

[root@adailinux ~]# date -d "+1 hour" +%s

1506768265

#获取1小时后的时间戳,

#将memdata.bak中的时间戳更改为该值

[root@adailinux ~]# vim /tmp/memdata.bak

add high 1 1506768265 3

180

add name 1 1506768265 4

adai

add weight 1 1506768265 2

80

add age 1 10000000 2

26

[root@adailinux ~]# nc 127.0.0.1 11211 < /tmp/memdata.bak

STORED

STORED

STORED

STORED

[root@adailinux ~]# 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 4

adai

END

get age

END

get high

VALUE high 1 3

180

END

get weight

VALUE weight 1 2

80

END

```

**注:** 导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果数据已经存在或者当前时间已经过了这个时间点,数据将无法成功导入。

## 21.7 php连接memcached

使用PHP连接memcached需要先编译安装PHP的memcached扩展模块。(本机之前已经安装过PHP,所以直接重新编译,如果是首次安装,需要下载安装包。)  

```

[root@adailinux src]# pwd

/usr/local/src

下载模块:

[root@adailinux src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz

[root@adailinux src]# tar -zxvf memcache-2.2.3.tgz

[root@adailinux src]# cd memcache-2.2.3/

[root@adailinux memcache-2.2.3]# /usr/local/php-fpm/bin/phpize

报错:

Cannot find autoconf. Please check your autoconf installation and the

$PHP_AUTOCONF environment variable. Then, rerun this script.

即,缺少autoconf。。此时无法生产configure文件

[root@adailinux memcache-2.2.3]# yum install -y autoconf

[root@adailinux memcache-2.2.3]# /usr/local/php-fpm/bin/phpize

搞定!!

编译:

[root@adailinux memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config

[root@adailinux memcache-2.2.3]# echo $?

0

[root@adailinux memcache-2.2.3]# make && make install

Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/

[root@adailinux memcache-2.2.3]# ls /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/

memcache.so

即,生成memcache.so模块文件。  

加载模块:

[root@adailinux memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini

添加如下参数:

extension=memcache.so

[root@adailinux memcache-2.2.3]# /usr/local/php-fpm/sbin/php-fpm -m

memcache

```

即,memcache模块加载成功!  

### 测试

下载测试脚本,查看PHP是否支持memcache扩展。  

```

测试脚本内容如下:

[root@adailinux src]# vim 1.php

<?php

//连接Memcache Memcache

$mem = new Memcache;

$mem->connect("localhost", 11211);

//保存数据

$mem->set('key1', 'This is first value', 0, 60);

$val = $mem->get('key1');

echo "Get key1 value: " . $val ."<br>";

//替换数据

$mem->replace('key1', 'This is replace value', 0, 60);

$val = $mem->get('key1');

echo "Get key1 value: " . $val . "<br>";

//保存数组数据

$arr = array('aaa', 'bbb', 'ccc', 'ddd');

$mem->set('key2', $arr, 0, 60);

$val2 = $mem->get('key2');

echo "Get key2 value: ";

print_r($val2);

echo "<br>";

//删除数据

$mem->delete('key1');

$val = $mem->get('key1');

echo "Get key1 value: " . $val . "<br>";

//清除所有数据

$mem->flush();

$val2 = $mem->get('key2');

echo "Get key2 value: ";

print_r($val2);

echo "<br>";

//关闭连接

$mem->close();

?>

```

测试:

```

[root@adailinux src]# /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>

```

该情况说明配置成功!

## 21.8 memcached中存储session

更改session存贮位置(memcached)。 

### session测试

以下为更改存储位置前,session文件的错处位置:  

```

测试脚本内容如下:

[root@adailinux ~]# cat .mem_se.txt

<?php 

session_start(); 

if (!isset($_SESSION['TEST'])) { 

$_SESSION['TEST'] = time(); 

$_SESSION['TEST3'] = time(); 

print $_SESSION['TEST']; 

print "<br><br>"; 

print $_SESSION['TEST3']; 

print "<br><br>"; 

print session_id(); 

?> 

将该脚本放到当前机器默认站点的根目录/data/wwwroot/www:

[root@adailinux ~]# cd /data/wwwroot/www

[root@adailinux www]# mv /root/.mem_se.txt 1.php

#进行移动并重命名

执行如下命令:

[root@adailinux www]# curl localhost/1.php

1506768299<br><br>1506768299<br><br>pcqf6d4r4sjeede4nkpvjni9n6 

##此时存储了一个session

[root@adailinux www]# ls /tmp/

sess_pcqf6d4r4sjeede4nkpvjni9n6

##该文件为执行上面命令生成的session文件

```

### 更改session存储路径

#### 方法1:

```

[root@adailinux ~]# vim /usr/local/php-fpm/etc/php.ini

;session.save_handler = files

默认情况值为files,存放在/tmp/下

session.save_handler = memcache

##指定存储类型

session.save_path = "tcp://192.168.8.131:11211"

##指定memcached服务器的IP和端口

重启php服务:

[root@adailinux www]# /etc/init.d/php-fpm restart

Gracefully shutting down php-fpm . done

Starting php-fpm  done

删除/tmp/下原因的session文件:

[root@adailinux www]# rm -rf /tmp/sess*

在此创建session:

[root@adailinux www]# curl localhost/1.php

1506769084<br><br>1506769084<br><br>qe73bqse8rmckfchgb7j5b8ba6

###注:此处最后面的值为key

查看session信息:

[root@adailinux www]# telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get qe73bqse8rmckfchgb7j5b8ba6

VALUE qe73bqse8rmckfchgb7j5b8ba6 0 37

TEST|i:1506769084;TEST3|i:1506769084;

END

如果无法看到session数据的键值,

就无法直接在memcached中查看,

解决办法是将memcached数据导出:  

[root@adailinux www]# memcached-tool 127.0.0.1:11211 dump > /tmp/memdata.bak

[root@adailinux www]# cat /tmp/memdata.bak

add qe73bqse8rmckfchgb7j5b8ba6 0 1506770524 37

TEST|i:1506769084;TEST3|i:1506769084;

```

成功!  

#### 方法2:

在httpd.conf中定义session的保存路径:

```

php_value session.save_handler "memcache" 

php_value session.save_path "tcp://192.168.8.130:11211"

```

#### 方法3:

在php-fpm.conf对应的pool中定义session的保存路径:  

```

php_value[session.save_handler] = memcache

php_value[session.save_path] = " tcp://192.168.8.130:11211 "

```

2017-10-11 07:47 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: