关于缓存的话题

当前状况

有一个项目,大家都直接使用Yii::app()->memcache->get方法从缓存中获取数据。咋一看,好像没有什么不妥。但是随着项目的扩大,流程越来越复杂,缓存内容的增多,这个方法所带来的隐患就越发明显了。每一次的改版或数据变动,都需要查找一大片的代码进行修改(有可能还会有隐式的组装调用)。哪怕漏掉了一个地方没有更正过来都会造成系统的BUG,甚至是找不到根源的未知错误。

面对以上问题,我说说我的改进方案。以下的改进方法仅代表我的个人看法,如果有更好的方法,欢迎大家一起讨论。


优化改进

计算机界有句老话,大意是:只要再多添一层间接,计算机科学中就没有解决不了的问题(引用自《Object-C基础教程》第19页)。我的处理方法就是增加一层,避免下层及协作开发人员直接接触到数据。为避免缓存过多容易造成混乱,我们需要对缓存进行归类封装。以网店的缓存为例:

class EShopCache{
	private $_cacheKey = array(‘userName’,’shopTitle’,’isValPro’,’isValShop’);
	private $_cache = array();

public function __get($key) {
	if ( array_in($key, $this->_cacheKey) ){
		if ( !array_key_exixts($key, $this->_cache) ) {
			$this->_cache[$key] = Yii::app()->memcache->get($key);
		}
		return $this->_cache[$key];
}
return false;
}
}

这样改进之后,不但使用方法更简单,而且更具语义化。

$eshopCache = new EShopCache;
echo $ eshopCache ->username;
if ( $ eshopCache ->isValShop == 1 ) {
	echo ‘网店已经进行实体认证’;
}

如果需求有变更需要对数据费进行修改,我们只需要对这个类进行修改,不需要对下一层的每一个接口进行修改,也不用担心忘了修改下层的封装及隐蔽调用。


持续改进

还有一个问题,如果需求再变化。网店要显示的是用户自定义的昵称(nickName),而不再是用户名(userName),难道我们只能翻遍文件修改了吗?改进方案如下:

class EShopCache{
	private $_cacheKey = array(‘userName’,’shopTitle’,’isValPro’,’isValShop’);
	private $_aliaeses = array(‘userName’=>’nickName’); 
	private $_cache = array();

public function __get($key) {
	if ( array_in($key, $this->_cacheKey) ){
		if ( !array_key_exixts($key, $this->_cache) ) {
			$_key = array_key_exists($key, $this->_aliases)? $this->_aliases[$key] : $key;
			$this->_cache[$key] = Yii::app()->memcache->get($_key);
		}
		return $this->_cache[$key];
}
return false;
}
}

到此,这个类的功能已经可以满足我们使用。我提供的方案就是使用设计模式中的“代理模式”来间接地访问缓存数据。如果有什么异议,欢迎大家发邮件到yagas@sina.com 共同讨论。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 感谢您的问题!数据缓存是提高数据库访问效率的一种常用技术,一般可以通过在程序中使用缓存来实现。具体实现方式有很多种,比如可以使用内存缓存或者分布式缓存,也可以借助第三方组件来进行缓存管理。缓存的设计需要考虑到缓存方式、缓存数据的有效期以及缓存的一致性等问题。如果您有具体的需求或者问题,也可以给我留言,我们可以一起来深入的探讨这个话题。 ### 回答2: 数据库的数据缓存可以通过以下几种方式来实现: 1. 缓存层:在应用程序与数据库之间添加一个缓存层,将一部分数据存储在该缓存中,减少从数据库中获取数据的次数。应用程序在读取数据时,首先尝试从缓存中获取,如果缓存中有数据,直接返回,如果缓存中没有数据,再从数据库中获取并存储到缓存中,以供下一次读取时使用。 2. 查询结果缓存:将查询语句的结果缓存起来,当下一次有相同的查询请求时,直接从缓存中返回结果,而不需要再次执行查询操作。这种方式适用于查询不经常变化的数据,可以大大提高查询效率。 3. 数据预取:在应用程序启动时,将一部分经常使用的数据预先加载到缓存中,以供后续的查询使用。这样可以避免每次查询都需要从数据库中获取数据的开销,提高了查询的响应速度。 4. 延迟写入:将应用程序对数据库的更新操作暂时存储在缓存中,而不是立即写入到数据库中。当缓存达到一定大小或者一定时间间隔时,再批量将缓存中的数据写入到数据库中。这样可以减少频繁的写操作对数据库的负载,提高写入效率。 需要注意的是,数据缓存的实现需要考虑缓存的大小、缓存过期策略、缓存一致性等问题。在实际应用中,选择合适的缓存方案需要根据具体的业务需求和系统架构进行评估和选择。 ### 回答3: 数据库的数据缓存是通过将数据库中的数据暂时存储在内存中,以提高数据访问的速度和效率的一种机制。常见的数据库数据缓存实现方法包括以下几种。 1. 查询结果缓存:将查询结果存储在缓存中,当再次进行相同查询时,可以直接从缓存中读取结果,避免了重复访问数据库的开销。 2. 对象缓存:将数据库中的对象数据(如记录、实体对象等)存储在缓存中,以便在后续的访问中可以直接从缓存中读取,而无需再次访问数据库。 3. 查询计划缓存:将数据库的查询计划(如执行计划、查询优化器生成的中间结果等)存储在缓存中,以避免重复的查询计划生成和优化过程,提高查询的执行效率。 4. 数据页缓存:将数据库中的数据页(即磁盘上的数据块)存储在缓存中,以避免频繁的磁盘读写操作。当需要读取或写入数据时,首先在缓存中查找数据页,如果找到则直接进行读写操作,否则再从磁盘中读取或写入相应的数据。 数据库的数据缓存可以通过数据库管理系统(DBMS)的缓存管理模块来实现。该模块负责管理缓存的分配、释放和替换等操作。一般情况下,缓存采用LRU(最近最少使用)等算法进行替换,以保证缓存中存储的是最常使用的数据。 需要注意的是,数据库的数据缓存需要考虑数据的一致性和可靠性。通常情况下,数据库会提供事务机制和缓存刷新策略来确保缓存数据与数据库中的数据保持一致,并在需要时进行刷新操作,以避免数据不一致的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yagas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值