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
③、数据操作同上