实战给AW_Blog插件添加缓存

简介:

            aheadworks公司的Blog插件可以算是Magento所有免费插件中最有名也是使用最广泛的一个插件了,就我自己来说,也是每个项目的必备插件(我一般用来做为新闻插件使用)。今天拿它做例子演示下给Block添加缓存(Cache)。

    

   这个截图是我某个项目使用aw_blog插件的实例,使用AW_Blog_Block_Blog这个block文件在首页输出某个新闻类别下的新闻列表,aw_blog插件本身是没给输出内容做过缓存处理的,也就是说,即便你一天或几天才更新一次新闻,页面每次载入时依然要从数据库里把这些数据取一遍,这个是比较没必要的。

下面来给这个Block加上缓存,Magento本身已经提供了一套给Block添加缓存的写法,只需要简单的加几句代码就可以

protected function _construct()
    {
        $this->addData(array(
            'cache_lifetime'=> 86400,
            'cache_tags'    => array(AW_Blog_Model_Post::CACHE_TAG)
        ));
}

其中cache_lifetime指缓存周期,这里我设置的是86400秒,也就是一天,cache_tags指给该缓存设定的标签,这里我设置的是post这个model的一个常量。做完这一步,这个block文件的缓存就好了,页面载入时,这块内容不会再每次去数据库取数据,而是直接载入缓存好的html,减少了页面载入所消耗的时间。

到这一步,整个工作才完成了一半,为什么这么说呢?这里可以做个实验,在加完以上的代码并刷新过一次页面后,数据已经写进缓存文件里了,这时候去后台新增或修改一篇新闻,你会发现前台页面的内容并没有跟着改变,而是维持之前的内容。那么什么时候才会变成新的内容呢,一天之后,因为之前给缓存设置的有效时间是一天,一天之内的有效期内,页面都会去读取缓存文件而不是数据库。这时候你可以这样处理,在后台修改过内容后,手动刷新后台的缓存,让效果实时可见,或者用更好的方案,通过程序控制,在每次新闻内容新增或修改时自动刷新对应的缓存。

打开AW_Blog_Model_Post这个文件,在头部定义一个常量

const CACHE_TAG       = 'aw_blog';

底部添加如下代码

  public function cleanCache()
    {
        Mage::app()->cleanCache(self::CACHE_TAG);
        return $this;
    }
    
    	public function _beforeSave(){
      $this->cleanCache();

		return parent::_beforeSave();
	}

常量即是之前给Blog添加的缓存的cache_tags,_beforeSave函数是所有Model类继承自父类的方法,可以在该Model对应的对象实体保存数据时触发,这里重写_beforeSave,去调用一个cleanCache函数,cleanCache函数里只有一句重要的代码,就是Mage::app()->cleanCache(self::CACHE_TAG),这个方法可以清除指定标签(tag)的缓存,比如这里,它只会清除tag为aw_blog的缓存,而不是全部系统缓存。

从完整的流程来说,首先前台页面第一次载入时,该Block会将内容缓存进缓存文件,然后当后台保存新闻时,通过cleanCache会清除指定Tag的缓存,这之后再次载入页面时就会生成新的缓存文件。这样就做到了缓存新闻内容以提高速度的同时,依然可以在后台做出数据改变时在页面实时显示新的数据。

新闻数据在页面上一般所占空间不大,即使缓存起来可能也不会对加载速度有很明显的提升,这里只是以此为例子展示下Magento所提供的Block缓存机制。这个例子很简单,如果要对其他东西做缓存可能会有各种更复杂的流程,这里不再探讨。

PS:本文的前提是你在后台已经把Magento的缓存打开了得意

参考文章:http://www.magentocommerce.com/wiki/5_-_modules_and_development/block_cache_and_html_ouput

     

目录
相关文章
|
3月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
42 2
|
20天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
1月前
|
缓存 弹性计算 应用服务中间件
如何使用 Wordpress?托管, 网站, 插件, 缓存
如何使用 Wordpress?托管, 网站, 插件, 缓存
|
3月前
|
缓存 NoSQL 数据库
go-zero微服务实战系列(五、缓存代码怎么写)
go-zero微服务实战系列(五、缓存代码怎么写)
|
4月前
|
缓存 NoSQL Serverless
函数计算产品使用问题之如何使用Redis作为缓存插件
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
116 8
|
3月前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
68 0
|
3月前
|
消息中间件 缓存 监控
go-zero微服务实战系列(六、缓存一致性保证)
go-zero微服务实战系列(六、缓存一致性保证)
|
4月前
|
缓存
如何彻底卸载VSCode及其原来的插件配置缓存
如何彻底卸载VSCode及其原来的插件配置缓存
499 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
77 6
|
14天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题