`
niqingyang
  • 浏览: 44324 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Filter缓存依赖

    博客分类:
  • YII
 
阅读更多

在分页查询的时候可以指定是否从缓存中获取数据,框架中开始设定的是ajax不走缓存,而非ajax才走缓存,这样做在后期做复杂业务的时候会有一定的局限性,所以编写了过滤器缓存依赖,用来指定根据提交的数据而进行自动判断是否从缓存中后期query数据。

<?php
namespace common\caching;

use yii\caching\Dependency;
use common\base\Filter;

/**
 * Filter缓存依赖,根据指定的“get”、“post”、“request”的值,到提交的数据中进行查询返回对应的值,如果请求的数据发生变化则缓存失效
 *
 * @author niqingyang <niqy@qq.com>
 *        
 */
class FilterDependency extends Dependency
{

	public $post = [];

	public $request = [];

	public $get = [];

	public $defaults = [];

	protected function generateDependencyData ($cache)
	{
		$data = [];
		foreach((array)$this->get as $name)
		{
			$data[$name] = Filter::get($name, $this->defaults[$name]);
		}
		foreach((array)$this->post as $name)
		{
			$data[$name] = Filter::post($name, $this->defaults[$name]);
		}
		foreach((array)$this->request as $name)
		{
			$data[$name] = Filter::request($name, $this->defaults[$name]);
		}
		return $data;
	}
}

 可以用在pageList函数中:

/**
	 * 获取商品分页列表
	 *
	 * @param string $read_cache        	
	 * @param array $params        	
	 */
	public static function pageList ($read_cache = false, $params = [], Dependency $dependency = null)
	{
		// 分页设置
		$filter = Filter::getInstance($read_cache);
		
		if(isset($filter->query) && $filter->query instanceof Query)
		{
			$filter->page($filter->query);
			return $filter;
		}
		
		$defaults = [
			'shop_id' => null, 
			'goods_status' => null, 
			'goods_audit' => null
		];
		
		$params = ArrayHelper::merge($defaults, $params);
		
		$query = new Query();
		$query->select('*')->from(static::tableName())->orderBy([
			'goods_id' => 'desc'
		]);
		
		// 状态
		if(($goods_status = Filter::get('goods_status', $params['goods_status'])) !== null)
		{
			$query->andWhere([
				'goods_status' => $goods_status
			]);
		}
		
		// 加上缓存依赖
		// 此处根据查询条件进行判断是否需要从缓存中读取数据
		// 一旦指定的查询条件发生变化,则刷新缓存
		$filter->page($query, new FilterDependency([
			'get' => 'goods_status'
		]));
		
		return $filter;
	}

 通过下面的代码指定了,获取fitler的条件,一旦get提交的goods_status值发生变化则自动刷新缓存,这样无论是ajax还是非ajax都可以默认从缓存中读取数据了

// 加上缓存依赖
		// 此处根据查询条件进行判断是否需要从缓存中读取数据
		// 一旦指定的查询条件发生变化,则刷新缓存
		$filter->page($query, new FilterDependency([
			'get' => 'goods_status'
		]));

 

分享到:
评论

相关推荐

    缓存说明.doc

    oscache的部署步骤包括引入相关依赖库,如log4j、oscache、commons-logging等,并配置web.xml,启用`CacheFilter`来拦截JSP页面请求,如下所示: ```xml &lt;taglib-uri&gt;oscache &lt;taglib-location&gt;/WEB-INF/classes...

    springMVC+Ehcache的各级缓存(包括页面缓存)

    - 利用Filter或Interceptor,拦截请求并检查是否有缓存的页面,如果存在则直接返回,否则处理请求并存入缓存。 6. 缓存策略: - 时间驱动:设置缓存过期时间,超过这个时间自动清除。 - 命中率驱动:根据缓存...

    jsp 页面缓存

    这时,可以使用Servlet Filter或自定义Tag Library来拦截请求,根据条件判断是否从缓存中读取数据,或者在数据更新后更新缓存。例如,我们可以使用Spring框架的`Cache`抽象层来管理缓存,或者使用第三方库如Ehcache...

    添加了http_image_filter_module模块的Nginx

    `http_image_filter_module`模块的运行需要依赖于libgd库,这是一个用于处理多种图像格式的开源库。在Windows 64位环境中,我们通常会看到`libgd.dll`这样的动态链接库文件,它是libgd在Windows平台上的实现。在本...

    SpringBoot的Filter过滤器

    2. 在Spring Boot的配置类中注册`Filter`:这种方式更加灵活,可以利用Spring的依赖注入和配置能力。 ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework....

    tomcat-redis依赖jar包

    总结来说,"tomcat-redis依赖jar包"涉及到的是将Tomcat应用服务器与Redis缓存系统整合的过程,包括连接器选择、配置、缓存策略、性能优化、安全措施以及监控与故障排查等多个方面。正确地集成和使用这些jar包,能够...

    cors-filter-1.7.jar java-util-1.9.1.jar

    1. **添加依赖**:将`cors-filter-1.7.jar` 文件放入Tomcat的`lib`目录,这样服务器就能识别并加载这个过滤器。 2. **配置web.xml**:在你的应用的`WEB-INF/web.xml`文件中,你需要添加一个新的过滤器定义,如下所...

    NxD自动刷缓存813

    1. **Filter.DB**:这可能是一个过滤规则数据库,用于控制哪些数据会被缓存,哪些不会,从而优化缓存空间的使用。 2. **Setup.DB**:这是安装配置数据库,记录了软件的安装信息和设置参数,有助于系统初始化和升级...

    java自学===Filter类的应用,网站数量统计

    而“工具”标签可能暗示作者还分享了一些实用的工具或库,帮助简化Filter的开发和调试,比如使用日志框架记录请求信息,或者使用依赖注入框架(如Spring)来管理Filter实例。 总的来说,通过学习Filter类的应用,...

    tomcat7.0+memcached 依赖jar包

    5. **整合到Web应用**:在你的Servlet或Filter中,你可以根据需要使用Memcached来缓存数据,避免重复计算或频繁的数据库查询。 6. **配置Tomcat**:在某些情况下,你可能还需要配置Tomcat的`server.xml`文件,以...

    Laravel开发-laravel-cache-filter

    1. **添加依赖**:首先,你需要在你的项目中通过Composer安装`laravel-cache-filter`。打开终端,进入项目根目录,然后运行以下命令: ``` composer require package_name ``` 注意替换`package_name`为实际的包...

    Filter和Listener

    - **执行顺序**:Filter的执行遵循配置顺序,而Listener的执行依赖于事件的发生顺序。 - **应用场景**:Filter更适合用于处理请求的前置和后置操作,如权限检查、编码转换等;而Listener适用于监听和响应Web应用的...

    ssm框架+shiro+redis缓存(某课网代码)

    3. **Spring配置**:Spring配置文件会定义Bean的依赖注入,包括SSM框架的各个组件,如DataSource、SessionFactory、SqlSessionFactoryBean、MapperScannerConfigurer等,以及Shiro的相关Filter和Realm。 4. **...

    Java EE中Filter技术的研究与应用.zip

    - 合理规划Filter链,避免Filter之间的循环依赖。 - 使用Filter时,注意异常处理,避免Filter导致请求处理中断。 8. **Filter与其他组件的关系** Filter与Servlet、Listener等组件协同工作,共同构建了Java EE...

    AspNetTheCall 1.2

    AspNetAdditional.dll , AspNetTheCall.dll两者缺一不可 功能介绍: DataPath =传入IP库的...CreateDataSetCache =创建缓存依赖 GetAllCache =创建缓存依赖项 PostSet = POST传值 JudgeNumber = 判断是否是数字

    Servlet_Filter

    同样,Filter也可以在Servlet响应后对响应内容进行操作,如添加缓存控制头,加密敏感信息等。 在实际开发中,Filter的使用可以提高代码的可维护性和复用性,因为它们将通用的逻辑从Servlet中分离出来。例如,通过...

    vue.js的computed,filter,get,set的用法及区别详解

    计算属性是基于它们的依赖进行缓存的。只在相关依赖发生改变时它们才会重新求值。计算属性的这种响应式缓存机制使得其非常适合处理复杂逻辑,比如对数据进行过滤和排序等。使用computed可以有效提高性能,因为它只有...

    shiro-1.2.3所有依赖包以及源码

    例如,你可以查看如何实现自定义的Realm以对接自己的用户数据源,或者如何利用Shiro的Filter链来定制Web应用的安全控制。同时,对于熟悉Guice或Spring的开发者,理解Shiro与这些框架的集成方式也是非常有价值的。 ...

    spring使用ehcache实现页面缓存示例

    配置两个 Filter,一个用于添加缓存(testPageAddCachingFilter),另一个用于清除缓存(testPageRemoveCachingFilter)。这些 Filter 将对应于特定 URL 规则,例如 `/hello/list` 和 `/hello/update/*`。 ```xml...

    Laravel开发-filter

    中间件可以用于验证用户身份、日志记录、限速、缓存等任务,是实现业务逻辑和控制流程的重要手段。 在Laravel开发中,中间件的工作原理是接收一个请求,执行一些处理,然后将请求传递给下一个中间件或控制器,最后...

Global site tag (gtag.js) - Google Analytics