PHP简单操作Memcache

本文详细介绍了Memcache的工作原理及使用方法,包括其作为数据库缓存的应用、分布式缓存服务器的概念及其在PHP中的实现方式。同时探讨了Memcache与Redis的区别、失效机制等关键特性。


1、Memcache原理 2、使用Memcached 3、分布式缓存服务器 4、使用Memcache作为数据库缓存

1、Memcache原理
分布式内存缓存服务器,Memcache使用方便简单且更快速
Memcache和redis有类似地方(内存存储),不同点redis为数据库系统,Memcache为缓存系统
作为服务器与数据库之间的中间缓存层,Memcache会首先被查询,如果Memcache中查询不到则到数据库中获取数据,并把数据缓存到Memcache中以备下次使用

失效机制
1)懒惰机制
超过有效期后不会自动删除,而是在执行一次get获取操作时被删除,其他如session也是采用懒惰机制
2)强制删除
若空间被占用满,就会把不常使用的key删除,既LRU机制
若不需要该机制则在启用服务的时候加上 -M 参数,就会返回错误信息而不删除key


2、使用Memcache
PHP是作为操作Memcache缓存服务器的客户端
PHP操作Memcache即操作一个Memcache类
设置:
add(key,value,压缩标志,有效期) 存在就报错,不存在则添加
set(key,value,压缩标志,有效期) 存在则修改,不存在则添加
replace(key,value,压缩标志,有效期) 替换value值
increment(key,value) 把当前元素的值转换成数值然后加上value,相当于给该key元素作加法
decrement(key,value) 把当前元素的值转换成数值然后减去value,相当于给该key元素作减法
获取:
get(key)
释放:
close()
删除:
delete(key[,value]) 删除某个key,若设置value则会倒计时value秒后删除
flush() 删除全部
关闭连接
close()
缓存有效期:
1)单位秒,如60秒
2)单位时间戳,当前时间戳+秒数,如time()+60
数据类型:
is_scalar() 判断变量是否为标量类型
标量类型(number、string、bool)会以string字符串方式存储
非标量类型(对象、数组、null)是以原型方式存储,消耗的资源、空间更大
把非标量类型序列化serialize存储,保持原有数据类型,在使用时进行反序列化unserialize,但资源型(文件、链接)无法被序列化

PHP的操作方法
$mem = new Memcache;			//new出Memcache对象
$mem->connect("127.0.0.1",11211)	//连接Memcached
$mem->set( key, 存入的值, MEMCACHE_COMPRESSED, 缓存时间)    //参数:key ,value ,0/MEMCACHE_COMPRESSED 不压缩/压缩 ,缓存时间
$mem->get(key)				//获取该key的值
$mem->replace( key, 替换的值, MEMCACHE_COMPRESSED, 缓存时间)	//替换该key的值


3、分布式缓存服务器
分布式:
使用多台Memcached服务器,形成Memcached集群,目的是提升Memcached所能使用的硬件资源数量
Memcached分布式:
Memcached服务器之间是不互相通讯
Memcached分布式算法:
由于缓存服务器之间是互相不通讯的,需要由分布式算法管理(缓存key映射服务器)各个缓存服务器中的数据
在PHP中是由Memcache类来实现的
实现分布式:
使用Memcache对象的AddServer()方法,可以添加多台Memcached服务器到集群中
常规操作Memcached:set()、add()、get()
例如:
在PHP中,Memcache类中的AddServer()会自动完成分布式的管理,只需要添加不同服务器的地址和端口即可
$mem = new Memcache();
$mem -> addserver("地址1","端口1");
$mem -> addserver("地址2","端口2");
分布式算法:
采用取模算法来确定key所对应的服务器的,所以在存取时,对服务器的数量和顺序有严格要求
在使用时必须严格对应服务器的数量和顺序,否则无法正常存取


4、使用Memcache作为数据库缓存
原理:
使用查询SQL语句作为key唯一标识符
使用该key从Memcache获取数据get
判断是否有数据,如果有则返回,没有则连接数据库并使用该SQL语句获取数据库数据,最后存入缓存中add并返回该数据
示例:
/** 该函数用于执行有结果集的SQL语句,并将结果缓存到memcached服务器中
@param string $sql      有结果集的查询语句SQL
@param object $memcache  Memcache类的对象
@return    $data           返回结果集的数据    */
function select($sql, Memcache $memcache){
    /* md5 SQL命令 作为 memcache的唯一标识符*/
    $key = md5($sql);
    /* 先从memcached服务器中获取数据 */
    $data = $memcache->get($key);
    /* 如果$data为false那么就是没有数据, 那么就需要从数据库中获取 */
    if(!$data) {
        try{     //很有必要将连接数据库的过程单独处理
            $pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
        }catch(PDOException $e){
            die("连接失败:".$e->getMessage());
        }
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        /* 从数据库中获取数据,返回二维数组$data */
        $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
        /* 这里向memcached服务器写入从数据库中获取的数据*/
        $memcache -> add($key, $data,  MEMCACHE_COMPRESSED, 0);
    }
    return $data;
}

$memcache = new Memcache;
/* 可以使用addServer()方法添加多台memcached服务器 */
$memcache -> connect('localhost', 11211);
/* 第一次运行还没有缓存数据, 会读取一次数据库, 当再次访问程序时, 就直接从memcache获取*/
$data = select("SELECT * FROM shoppingcar", $memcache);
md5("SELECT * FROM shoppingcar");
var_dump($data);   //输出数据


5、session存储到memcache中
session信息默认在服务器中以文件形式存储的(使用便捷但是多台服务器之间session不能共享)
当网站的访问量比较高的时候需要使用服务器集群支撑时就需要session信息的共享

具体操作
1)php.ini配置文件
session.save_handler = files //设置存储方式
	session.save_path = "/tmp" //设置存储路径

2)php文件中使用函数配置
安装的扩展是memcache
ini_set("session.save_handler","memcache")
        ini_set("session.save_path","tcp://127.0.0.1:11211") //需要使用多台时以;分割 ini_set("session.save_path","tcp://127.0.0.1:11211;tcp://127.0.0.1:11212")

安装的扩展是memcached
ini_set("session.save_handler","memcached")
	    ini_set("session.save_path","127.0.0.1:11211")



获取配置方式和值
ini_get("session.save_handler") ssession的存储方式 ini_get("session.save_path") ssession的存储路径
session在memcache中的key就是 session_id()


5、客户端操作memcached
1)SecureCRT使用telnet操作memcached
①、telnet添加数据到memcached:
add key值 0 时间(秒)  长度(存放多长时间由你指定, 键名不能重复,但是值可以重复) 回车后在输入需要添加的value数据

②、获取数据
get key值  【key-val   key不能重复,但是val可以重复】

③、修改数据
replace key值 0 60 5 【如果key值不存在,则失败】
set key值 0 60 5  【如果key值不存在,相当于添加,如果存在,则相当于修改.】

④、删除数据
delete 键值

④、查看memcached状态
stats

2)windows客户端telnet操作memcached
①、进入控制面板->程序->启用或关闭windows功能 打开telnet服务即可
②、打开cmd.exe输入telnet 127.0.0.1 11211连接memcached
③、数据操作同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值