阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Yii框架分布式缓存的实现方案

191次阅读
没有评论

共计 6909 个字符,预计需要花费 18 分钟才能阅读完成。

声明:本文阅读对象最好是对 Yii 和分布式缓存有一定了解的人群,否则理解和掌握上有一些困难,建议阅读之前做好以上两点基础准备。

YiiFramework 简称 Yii, 读作易,代表简单 (easy)、高效 (efficient)、可扩展 (extensible),Yii 将面向对象思想以及代码的重用性发挥到了极致,尤其是在缓存的支持上,Yii 是最有效率的 PHP 框架之一。

Yii 的缓存支持封装在框架核心的 caching 文件夹下面,如下图是 Yii 支持的缓存存储介质。

Yii 框架分布式缓存的实现方案

如果要做跨 Session 和请求的分布式缓存,可以选用 CFileCache, 如果要做跨 WebServer 的分布式缓存,就必须用 CMemCache 或 CRedisCache 缓存。

Yii 用户登陆机制  http://www.linuxidc.com/Linux/2015-01/111602.htm

Yii 中引入 js 和 css 文件  http://www.linuxidc.com/Linux/2015-01/111603.htm

Yii 不完全解决方案  http://www.linuxidc.com/Linux/2015-01/111606.htm

Yii CGridView 基本使用 http://www.linuxidc.com/Linux/2015-01/111607.htm

1. 跨 Session 和请求分布式缓存处理方案 (只有一台 Web 服务器、利用缓存依赖实现缓存实时更新)

Yii 缓存支持需要在项目的主配置文件添加相应的配置支持。

      ‘components’=>array(

          // 设置缓存
        ‘cache’=>array(
            ‘class’=>’CFileCache’,
          ),
      ),

Yii 中不管缓存介质是磁盘、数据库还是内存,赋值和取值都是统一的,这样的话,当我们有更换缓存介质的时候就可以改一下主配置文件,程序代码一点都不用动,这也是 Yii 将代码重用性发挥到极致的一个很好体现。

A. 缓存的赋值:

    Yii::app()->cache->set(key,value, 过期时间, 依赖条件);

下面举一个具体调用案例:

      $products=[‘id’=>1,’name’=>’ 茅台酒 ’];

        Yii::app()->cache->set(‘product’,
                      $products,
                      30,
                      newCGlobalStateCacheDependency(‘version’)
        );

上面是一个常用的案例,我们将 ’product’ 作为 key,$products 数组当做 value,过期时间为 30 秒(若永不过期此处填 0),同时依赖全局缓存变量 ’version’ 这个值。

设置缓存依赖后,当 ’version’ 的值发生变化后,缓存过期,30 秒后缓存过期,这两个条件有一个成立,缓存都过期。

B. 缓存值的获取

  Yii::app()->cache->get(key);

下面举一个具体调用案例:

跨 Session 和请求分布式缓存的实现方案 Demo:

读取线程代码:

    $products=Yii::app()->cache->get(‘product’);
    // 没有读取到缓存
    if($products===false)
    {
      $pro=Yii::app()->db;
      $products=$pro->createCommand(“select*from{{product}}”)->query();

      // 设置缓存永不过期,同时依赖于全局变量 ’version’
      Yii::app()->cache->set(‘product’,
                              $products,
                              0,
                              newCGlobalStateCacheDependency(‘version’)
        );
      echo “ 从数据库获取 <br/>”;
    }
    echo json_encode($products);

写线程代码:

    $pro=Yii::app()->db;

    $command=$pro->createCommand(“INSERTINTO{{product}}(`name`,`color`,`version`)VALUES(‘ 依赖 ’,’ 黑色 ’,1)”);

    $command->execute();

    // 设置缓存依赖,让缓存过期

    $version=Yii::app()->getGlobalState(‘version’);

    Yii::app()->setGlobalState(‘version’,++$version);

上面的业务逻辑如下图:

Yii 框架分布式缓存的实现方案

读线程每次获取缓存的时候都会验证一下缓存依赖是否值发生变化,如果缓存依赖值变化了就获取不到缓存,获取不到缓存就会去数据库查询结果,查询到结果后,重新设置缓存;如果缓存依赖值没有发生变化,直接获取缓存,不再连接数据库并将值返回给浏览器,这样读线程完成了任务。

写线程直接操作数据库,将数据更新到数据库,然后他只需要更新 Denp 缓存依赖就可以返回浏览器了,当然,写线程也可以直接清除对应的缓存,这样写线程完成任务。

当你想更新缓存介质的时候,如 Memcached 做分布式缓存介质,前提是 web 服务器安装 php 的 memcached 扩展,在 web 程序内只需要在主配置文件中做如下修改:

    ‘components’=>array(
      // 设置缓存
      ‘cache’=>array(
          ‘class’=>’CMemCache’,
          ‘servers’=>array(
            array(‘host’=>’192.168.1.16’,’port’=>11211,’weight’=>60),
            array(‘host’=>’192.168.1.16’,’port’=>11212,’weight’=>40),
          ),
        ),
    ),

更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2015-02/113828p2.htm

2. 跨 Web 服务器分布式缓存处理方案

跨 Web 服务器的分布式缓存就得借助于 Memcached 或 Redis 了,如下图:

Yii 框架分布式缓存的实现方案

浏览器将读 / 写请求交给反向代理 Nginx 或者 F5 硬件,再由 Nginx 将请求分发给各自的 Web 服务器,各自 Web 服务器共享缓存服务器。

上图是利用 Cache Server 来实现的分布式缓存实时更新,处理流程:

1 号读线程开始请求缓存,请求不到,读取数据库,设置缓存,将查询结果返回给浏览器;2 号读线程,请求缓存,请求到缓存,将结果返回给浏览器;写线程直接操作数据库,删除缓存,返回浏览器;1 号读线程读不到缓存,读取数据库,设置缓存,将查询结果返回给浏览器。

读线程代码:

/** 读线程
*@return mixed
*/
public function actionWide()
{
    $products=$this->getCache();
    if(!$products)
    {
      $products=$this->getProducts();
      $this->setCache($products);
      echo “ 没有获取到缓存,从数据库读取数据。<br/>”;
    }
    echo json_encode($products);
}

/** 从缓存中读取数据
*@return mixed
*/
private function getCache()
{
    return Yii::app()->cache->get(‘product’);
}

/** 从数据库读取数据
*@return mixed
*/
private function getProducts()
{
    $pro=Yii::app()->db;
    $products=$pro->createCommand(“select*from{{product}}”)->query();
    $products=$products->readAll();
    return $products;
}

/**
* 更新缓存
*/
private function setCache($products)
{
    Yii::app()->cache->set(‘product’,$products);
}

写线程代码:

/**
* 模拟写操作
*/
public function actionWrite()
{
    $pro=Yii::app()->db;
    $command=$pro->createCommand(“INSERTINTO{{product}}(`name`,`color`,`version`)VALUES(‘ 依赖 ’,’ 黑色 ’,1)”);
    $command->execute();
    $this->delCache(‘product’);
    echo “ 写成功 ”;
}

/** 根据键值删除缓存
*@param$key 键值
*/
private function delCache($key)
{
    Yii::app()->cache->delete($key);
}

如果你想用 Redis 或 Memcached 做缓存,最好用 Linux 做缓存服务器,连接 Web 服务器就不做限制了,但是有一点,如果你想用 Redis 做缓存,或者 Web 服务器安装 php 对 Redis 的扩展,或者去 Yii 官网下载 Yii 对 Redis 的支持扩展,否则 Yii 不是不能利用 Redis 做缓存的,也可以在这里下载,这是我下好的。

RedisCache 下载:

 

下载解压放在 extensions 目录,在主配置文件里做如下修改:

 ‘components’=>array(
    // 设置缓存
    ‘cache’=>array(
        ‘class’=>’ext.redis.CRedisCache’,
        ‘servers’=>array(
            array(‘host’=>’192.168.1.16’,’port’=>6379,),
        ),
    ‘keyPrefix’=>”,
    ),
),

最后补充一下,为什么加这个 keyPrefix 配置,因为,如果你想用 telnet 通过 key 获取 memcached 或者 Redis 中的缓存 value,是获取不到的,因为 Yii 框架给 key 会加上默认前缀,如果你在这里配置了,Yii 框架就不会再对 key 进行处理了,这样你就可以通过 telnet 获取到缓存数据了。

好了,就到这里了。

Yii 的详细介绍 :请点这里
Yii 的下载地址 :请点这里

声明:本文阅读对象最好是对 Yii 和分布式缓存有一定了解的人群,否则理解和掌握上有一些困难,建议阅读之前做好以上两点基础准备。

YiiFramework 简称 Yii, 读作易,代表简单 (easy)、高效 (efficient)、可扩展 (extensible),Yii 将面向对象思想以及代码的重用性发挥到了极致,尤其是在缓存的支持上,Yii 是最有效率的 PHP 框架之一。

Yii 的缓存支持封装在框架核心的 caching 文件夹下面,如下图是 Yii 支持的缓存存储介质。

Yii 框架分布式缓存的实现方案

如果要做跨 Session 和请求的分布式缓存,可以选用 CFileCache, 如果要做跨 WebServer 的分布式缓存,就必须用 CMemCache 或 CRedisCache 缓存。

Yii 用户登陆机制  http://www.linuxidc.com/Linux/2015-01/111602.htm

Yii 中引入 js 和 css 文件  http://www.linuxidc.com/Linux/2015-01/111603.htm

Yii 不完全解决方案  http://www.linuxidc.com/Linux/2015-01/111606.htm

Yii CGridView 基本使用 http://www.linuxidc.com/Linux/2015-01/111607.htm

1. 跨 Session 和请求分布式缓存处理方案 (只有一台 Web 服务器、利用缓存依赖实现缓存实时更新)

Yii 缓存支持需要在项目的主配置文件添加相应的配置支持。

      ‘components’=>array(

          // 设置缓存
        ‘cache’=>array(
            ‘class’=>’CFileCache’,
          ),
      ),

Yii 中不管缓存介质是磁盘、数据库还是内存,赋值和取值都是统一的,这样的话,当我们有更换缓存介质的时候就可以改一下主配置文件,程序代码一点都不用动,这也是 Yii 将代码重用性发挥到极致的一个很好体现。

A. 缓存的赋值:

    Yii::app()->cache->set(key,value, 过期时间, 依赖条件);

下面举一个具体调用案例:

      $products=[‘id’=>1,’name’=>’ 茅台酒 ’];

        Yii::app()->cache->set(‘product’,
                      $products,
                      30,
                      newCGlobalStateCacheDependency(‘version’)
        );

上面是一个常用的案例,我们将 ’product’ 作为 key,$products 数组当做 value,过期时间为 30 秒(若永不过期此处填 0),同时依赖全局缓存变量 ’version’ 这个值。

设置缓存依赖后,当 ’version’ 的值发生变化后,缓存过期,30 秒后缓存过期,这两个条件有一个成立,缓存都过期。

B. 缓存值的获取

  Yii::app()->cache->get(key);

下面举一个具体调用案例:

跨 Session 和请求分布式缓存的实现方案 Demo:

读取线程代码:

    $products=Yii::app()->cache->get(‘product’);
    // 没有读取到缓存
    if($products===false)
    {
      $pro=Yii::app()->db;
      $products=$pro->createCommand(“select*from{{product}}”)->query();

      // 设置缓存永不过期,同时依赖于全局变量 ’version’
      Yii::app()->cache->set(‘product’,
                              $products,
                              0,
                              newCGlobalStateCacheDependency(‘version’)
        );
      echo “ 从数据库获取 <br/>”;
    }
    echo json_encode($products);

写线程代码:

    $pro=Yii::app()->db;

    $command=$pro->createCommand(“INSERTINTO{{product}}(`name`,`color`,`version`)VALUES(‘ 依赖 ’,’ 黑色 ’,1)”);

    $command->execute();

    // 设置缓存依赖,让缓存过期

    $version=Yii::app()->getGlobalState(‘version’);

    Yii::app()->setGlobalState(‘version’,++$version);

上面的业务逻辑如下图:

Yii 框架分布式缓存的实现方案

读线程每次获取缓存的时候都会验证一下缓存依赖是否值发生变化,如果缓存依赖值变化了就获取不到缓存,获取不到缓存就会去数据库查询结果,查询到结果后,重新设置缓存;如果缓存依赖值没有发生变化,直接获取缓存,不再连接数据库并将值返回给浏览器,这样读线程完成了任务。

写线程直接操作数据库,将数据更新到数据库,然后他只需要更新 Denp 缓存依赖就可以返回浏览器了,当然,写线程也可以直接清除对应的缓存,这样写线程完成任务。

当你想更新缓存介质的时候,如 Memcached 做分布式缓存介质,前提是 web 服务器安装 php 的 memcached 扩展,在 web 程序内只需要在主配置文件中做如下修改:

    ‘components’=>array(
      // 设置缓存
      ‘cache’=>array(
          ‘class’=>’CMemCache’,
          ‘servers’=>array(
            array(‘host’=>’192.168.1.16’,’port’=>11211,’weight’=>60),
            array(‘host’=>’192.168.1.16’,’port’=>11212,’weight’=>40),
          ),
        ),
    ),

更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2015-02/113828p2.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计6909字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中