百万级项目用到的缓存

介绍

有幸参加到百万并发的项目中来,第一件事情当然是翻看并发的接口是如何编写的,下面是伪代码(场景也是造的)

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,下面来简单的介绍一下

静态变量

  1. 简介
    在本次进程中进行内存共享

  2. 优势
    快速释放,不需要复杂的回收,删除机制
    同进行中共享一份数据

  3. 应用场景
    在一次访问中频繁访问的数据可以进行缓存,比如说:单例模式,在一个进程中,需要访问同一个对象,会进行多次实例化,使用静态变量对对象进行存储,只有第一次访问的时候进行实例化

apc

  1. 简介
    系统数据缓存:把php文件源码编译后的结果缓存在共享内存中使用,优化php的执行过程,避免从磁盘读取代码再编译的流程
    用户数据缓存(当然主要指这一块):将数据存储在共享内存中,可以多个php-fpm进程共享

  2. 优势
    在本地机器中的缓存中,和redis等相比不存在网络消耗
    和进程间缓存相比,可以多个进程公用一个缓存数据
    数据存储在内存中,读取速度更快

  3. 应用场景
    存储共用的数据,不要存储较个性化的数据(举例说:如果是一个集群机器,存储用户A的个人信息,A的访问是随机的打到集群的任意一台机器的,而当请求打到新的机器上又要进行一次缓存的读写,不仅浪费内存还要做更复杂的操作)

yac

  1. 类似于apc缓存,具体解决了什么问题,请看作者的文章介绍

    http://www.laruence.com/2013/03/18/2846.html

redis

  1. 简介
    不想介绍了

  2. 优势
    contentcache,可以多机共享,但是会有网络的消耗
    可以提供给多种语言访问(不限于php)

  3. 应用场景
    主要用来应对高并发场景,数据存储在内存中响应速度较快

坚持原创技术分享,您的支持将鼓励我继续创作!