NOSQL之memcache

一、什么是memcache

单张表

名字 数据类型
key varchar(255)
value text

MemCache和MemCached的区别:

1、MemCache是项目的名称
2、MemCached是MemCache服务器端可以执行文件的名称

二、Memcache使用场景

1、非持久化存储:对数据存储要求不高
2、分布式存储:不适合单机使用。尽量不要和数据库放置同一台机器
3、key/value存储:格式简单,不支持List、Array数据格式

三、安装和启动memcache

【安装telnet】  
yum install telnet.* 安装telnet客户端

安装

1、Yum安装

# yum -y update
# yum -y install memcached
# memcached -h  
# vim /etc/sysconfig/memcached  //修改默认配置
# systemctl restart memcached
# systemctl start memcached
# systemctl enable memcached
# systemctl status memcached
# systemctl stop memcached

2、lnmp一键包环境

cd lnmp1.4/
./addons.sh install memcached

3、源码安装

yum install libevent libevent-devel
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
// 编译安装 要指向你的php安装目录的配置文件
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config   

make && make install

查看进程

# ps aux | grep memcached

如果没有启动

# find / -name memcached  //找到memcached路径
# /usr/local/memcached/bin/memcached -p 11211 -m 64m -c 1024 -u root -d

- d 守护进程,默默的在后台运行
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数
-p 端口11211
-m 设置 memcached 可以使用的内存大小,单位为 M
-c 最大运行的并发连接数,默认为1024
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户

MemCache指令

命 令 作 用
get 返回Key对应的Value值
add 添加一个Key值,没有则添加成功并提示STORED,有则失败并提示NOT_STORED
set 无条件地设置一个Key值,没有就增加,有就覆盖,操作成功提示STORED
replace 按照相应的Key值替换数据,如果Key值不存在则会操作失败
stats 返回MemCache通用统计信息(下面有详细解读)
stats items 返回各个slab中item的数目和最老的item的年龄(最后一次访问距离现在的秒数)
stats slabs 返回MemCache运行期间创建的每个slab的信息(下面有详细解读)
version 返回当前MemCache版本号
flush_all 清空所有键值,但不会删除items,所以此时MemCache依旧占用内存
quit 关闭连接

聂哥建议学习:https://www.w3cschool.cn/memcached/iure12ko.html

四、PHP结合memcached实例

1、原生使用

$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('foo', 'bar');
$m->get('foo');

使用memcached-client类

//包含 memcached 类文件
require_once('memcached-client.php');

//选项设置
$options = array(
    'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
    'debug'   => true,  //是否打开 debug
    'compress_threshold' => 10240,  //超过多少字节的数据时进行压缩
    'persistant' => false  //是否使用持久连接
    );

//创建 memcached 对象实例
$mc = new memcached($options);

//设置此脚本使用的唯一标识符
$key = 'mykey';

//往 memcached 中写入对象
$mc->add($key, 'some random strings');
$val = $mc->get($key);
echo "n".str_pad('$mc->add() ', 60, '_')."n";
var_dump($val);

//替换已写入的对象数据值
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo "n".str_pad('$mc->replace() ', 60, '_')."n";
var_dump($val);

//删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo "n".str_pad('$mc->delete() ', 60, '_')."n";
var_dump($val);

做数据库查询缓存

$sql = 'SELECT * FROM users';
$key = md5($sql);   //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
    //在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
    echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
    $conn = mysql_connect('localhost', 'test', 'test');
    mysql_select_db('test');
    $result = mysql_query($sql);
      while ($row = mysql_fetch_object($result))
      $datas[] = $row;
    //    将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
    $mc->add($key, $datas);
} else {
      echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);