Memcached介绍、安装、使用、数据导入导出、连接php、存储session

本文详细介绍了Memcached,一种NoSQL数据库,包括其Slab分配、Growth Factor和数据过期方式。讲解了安装过程、运行状态检查、存储数据语法以及如何通过PHP连接和存储session。此外,还涉及数据导入导出的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是NoSQL?

1.非关系型数据库就是NoSQL,关系型数据库代表MySQL、Oracle、SQLserver等

2.对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索

3.NoSQL数据库存储原理非常简单(典型的数据类型为key-value),不存在繁杂的关系链,比如mysql查询的时候,需要找到对应的库、表(通常是多个表)以及字段

4.NoSQL数据可以存储在内存里,查询速度非常快

5.NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库

6.NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式

常见的NoSQL数据库

1.k-v形式的(key-value):memcached、redis 适合储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择

2.文档数据库:mongodb 将数据以文档的形式储存。每个文档都是一系列数据项的集合(相当于多个k-v数据的集合),每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储

Memcached介绍

Memcached是国外社区网站LiveJournal团队开发,目的是为了通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能

在这里插入图片描述

1.Slab allocation

1.Slab allocation:Memcached的自主内存存储处理,将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab
2.Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定
3.Slab是由多个Page组成的,Page按照指定大小切割成多个chunk
在这里插入图片描述

2.Growth factor

1.Memcached在启动时通过-f选项可以指定 Growth Factor(自增因子)。该值控制chunk大小的差异。默认值为1.25。
2.通过memcached-tool命令查看指定Memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25
3.命令:# memcached-tool 127.0.0.1:11211 display

3.数据过期方式

1.Lazy Expiration
Memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration,因此,Memcached不会在过期监视上耗费CPU时间

2.LRU
Memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想

安装Memcached

memcached基于libevent,所以安装前先确定系统是否已安装libevent

查看:

[root@linux ~]# rpm -qa libevent
libevent-2.0.21-4.el7.x86_64

#如过没有则安装libevent:yum -y install libevent

安装memcached:

[root@linux ~]# yum -y install memcached

#如要安装最新版,在官网下载即可

启动memcached:

[root@linux ~]# systemctl start memcached

查看进程信息:

[root@linux ~]# ps aux|grep memcached
memcach+ 29070  0.0  0.1 344096  1672 ?        Ssl  20:15   0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024

-u:启动用户
-p:监听端口
-m:分配的内存,单位m
-c:最大并发数
#以上参数可以在启动时指定(绝对路径方式启动),也可以在配置文件/etc/sysconfig/memcached中指定

配置文件内容:

[root@linux ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

#如果要添加监听的ip,定义options配置项的值为指定ip即可即可

Memcache运行状态

查看Memcached运行状态的三种方式:

1.memcached-tool

[root@linux ~]# memcached-tool 127.0.0.1:11211 stats

2.nc工具

[root@linux ~]# echo stats |nc 127.0.0.1 11211

#如没有nc需要先安装:yum -y install nc

3.memstat

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

#需要先安装libmemcached:yum -y install libmemcached

状态显示数据中需要关注cmd_get(缓存查询次数)和get_hits(缓存命中次数)
缓存命中率 = get_hits/cmd_get * 100%

Memcached存储数据语法

语法:
<command name> <key> <flags> <exptime> <bytes>
<data block>

参数说明:
<command name> 可以是set, add, replace
set表示按照相应的<key>存储该数据,没有的时候增加,有的时候覆盖
add表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败
replace表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败

<key> 表示需要保存数据的key名称

<flags> 是一个16位的无符号的整数(以十进制的方式表示),该标志将和需要存储的数据一起存储,并在客户端get数据时返回,客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的

<exptime> 表示数据过期的时间,若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换,或者重启memcached会消失),如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)

<bytes> 表示需要存储的字节数,当用户希望存储空数据时<bytes>可以为0

<data block>表示需要存储的内容

示例:

连接memcached:

[root@linux ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

set:创建key,value

set test 0 60 5
abcde
STORED

#key名为test,flags为0,数据过期时间60秒,字节为5,value值:abcde,按回车后显示STORED表示存储成功

get:获取key的值

get test
VALUE test 0 5
abcde
END

replace:替换key的值

replace test 1 100 3  
123
STORED

get test
VALUE test 1 3
123
END

#使用replace替换key的value值时可以重新定义flags,数据过期时间和字节数,如果key不存在,则显示NOT_STORED

delete:删除key

delete test
DELETED

get test
END

#如果被删除的key不存在,则显示NOT_FOUND

Memcached数据导入与导出

memcached导出数据:

[root@linux ~]# memcached-tool 127.0.0.1:11211 dump > data.bak

查看导出的数据:

[root@linux ~]# cat data.bak 
add test 0 1575893722 5
abcde
add key_1 0 1575893722 3
123
add key_2 0 1575893722 8
qwertyui

memcached导入数据:

[root@linux ~]# nc 127.0.0.1 11211 < data.bak
STORED
STORED
STORED

#如果提示nc命令不存在,则安装:yum -y install nc

注意:
1.导出的语句为add,所以导入时,需要删除已经存在的key或重启memcached(重启后所有数据都会消失),否则会显示NOT_STORED
2.导出的数据会带时间截,如果导入时,该时间截对应的数据有效期已过,那么该数据无法get获取到
3.如果数据过期时间设置为0永不过期(不重启memcached服务的前提下,服务重启后,所有数据都会过期),那么导出时带的时间截为key创建时间,重新导入时也会过期,无法get获取到

PHP连接Memcached

克隆memcache拓展包:

[root@linux src]# git clone https://github.com/websupport-sk/pecl-memcache

进入memcache拓展包目录:

[root@linux src]# cd pecl-memcache/

执行phpize生成configure文件:

[root@linux pecl-memcache]# /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即可:yum install -y autoconf

指定php配置文件:

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

安装:

[root@linux pecl-memcache]# make && make install

编辑php配置文件php.ini:

[root@linux pecl-memcache]# vi /usr/local/php-fpm/etc/php.ini 

添加以下内容:

extension=memcache.so

查看memcache是否添加成功:

[root@linux pecl-memcache]# /usr/local/php-fpm/bin/php -m |grep mem
memcache

#添加的memcache拓展模块已显示

测试:

1.创建测试脚本

[root@linux ~]# vi test.php

2.添加以下内容:

<?php
//连接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();
?>

3.执行php脚本:

[root@linux ~]# /usr/local/php-fpm/bin/php test.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>

#显示以上内容即表示成功,也可以将该php脚本放到网站的目录中,通过浏览器访问

Memcached中存储session

在LAMP/LNMP环境中,当后端有多台web时,要保证同一个用户的多次请求都被分配到同一台web,避免让用户多次登录的情况,在nginx负载均衡中可以直接使用ip_hash算法即可,但未使用nginx负载均衡的情况下,需要将session存储到缓存中

编辑php-fpm.conf配置文件:

[root@linux ~]# vi /usr/local/php-fpm/etc/php-fpm.d/www.conf

在pool中添加以下内容:

php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.234.128:11211 "

#需指定memcached服务器的IP

重启php-fpm

[root@linux ~]# service php-fpm restart

在网站目录下创建测试php脚本:

[root@linux ~]# vi /data/www/test.bbs.com/se_test.php

添加以下内容:

<?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(); 
?> 

测试:

[root@linux ~]# curl localhost/se_test.php
1575966574<br><br>1575966574<br><br>k94vq3m9qemjsfs1iceu009mut 

#前两段数字为value值,第三段为key名

连接memcached查看存储的session:

[root@linux ~]# telnet 127.0.0.1 11211

get k94vq3m9qemjsfs1iceu009mut
VALUE k94vq3m9qemjsfs1iceu009mut 0 37
TEST|i:1575966574;TEST3|i:1575966574;
END

#已经获取到session,配置成功

补充:在未配置memcached存储session的情况下,session默认存放在/tmp目录下

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值