你好,游客 登录 注册 搜索
背景:
阅读新闻

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

[日期:2015-02-22] 来源:Linux社区  作者:jhq0113 [字体: ]

声明:本文阅读对象最好是对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

linux
相关资讯       Yii  Yii缓存 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中���人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款