介绍
有幸参加到百万并发的项目中来,第一件事情当然是翻看并发的接口是如何编写的,下面是伪代码(场景也是造的)
class user {
static $user;
function getUserInfo($uid) {
if (self::$user) {
return self::$user[$uid];
}
if ($info = Apc::get($uid)) {
self::$user[$uid] = $info;
return $info;
}
if ($info = Redis::get($uid)) {
self::$user[$uid] = $info;
Apc::set($uid) = $info;
return $info;
}
if ($info = Mysql::get($uid)) {
self::$user[$uid] = $info;
Apc::set($uid) = $info;
Redis::set($uid) = $info
return $info;
}
return array();
}
}
其实主要是用到了三级缓存,静态变量做了进程内缓存,Apc做了进程间缓存,Redis做了content cache,下面来简单的介绍一下
静态变量
简介
在本次进程中进行内存共享优势
快速释放,不需要复杂的回收,删除机制
同进行中共享一份数据应用场景
在一次访问中频繁访问的数据可以进行缓存,比如说:单例模式,在一个进程中,需要访问同一个对象,会进行多次实例化,使用静态变量对对象进行存储,只有第一次访问的时候进行实例化
apc
简介
系统数据缓存:把php文件源码编译后的结果缓存在共享内存中使用,优化php的执行过程,避免从磁盘读取代码再编译的流程
用户数据缓存(当然主要指这一块):将数据存储在共享内存中,可以多个php-fpm进程共享优势
在本地机器中的缓存中,和redis等相比不存在网络消耗
和进程间缓存相比,可以多个进程公用一个缓存数据
数据存储在内存中,读取速度更快应用场景
存储共用的数据,不要存储较个性化的数据(举例说:如果是一个集群机器,存储用户A的个人信息,A的访问是随机的打到集群的任意一台机器的,而当请求打到新的机器上又要进行一次缓存的读写,不仅浪费内存还要做更复杂的操作)
yac
- 类似于apc缓存,具体解决了什么问题,请看作者的文章介绍
redis
简介
不想介绍了优势
contentcache,可以多机共享,但是会有网络的消耗
可以提供给多种语言访问(不限于php)应用场景
主要用来应对高并发场景,数据存储在内存中响应速度较快