一、什么是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 | 关闭连接 |
四、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);