9
回答
PHP如何优雅的建立缓存
科大讯飞通用文字识别100000次/天免费使用。立即申请   
总不能每个需要缓存的地方,都写个if缓存存在,return缓存,else 查询数据库吧
PHP
举报

以下是问题补充:

  • @悠悠知我心 :比如这样 $res=$Cache->get($key); if($res){ return $res; }else{ $res=$db->query(); $Cache->set($key,$res); return $res } 我都是这样写的,结果把代码搞得乱糟糟的 (3年前)
共有9个答案 最后回答: 3年前
abstract class CacheBase {
	public function get() {
		$data = $this->getDataByCache();
		
		if(empty($data)) {
			$data = $this->getDataBySql();
			$this->set($data);
		}
		
		return $data;
	}
	/**
	 * 设置缓存的方法
	 */
	abstract public function set($data);
	/**
	 * 从缓存中获取数据的方法
	 */
	abstract public function getDataByCache();
	/**
	 * 根据SQL查询数据
	 */
	abstract public function getDataBySql();
}

class DataA extends CacheBase {
	public function set($data) {
		return true;
		
	}
	public function getDataByCache() {
		return array();
	}
	public function getDataBySql() {
		return array('a', 'b');
	}
}

$obj = new DataA();
var_dump( $obj->get() );

这里只是举个例子,当然还有更多灵活的方式。你可以根据自己的需要去具体实现,看业务逻辑。



--- 共有 1 条评论 ---
crazymus很好的思路,这个例子很好地显示了抽象类的作用,赞! 3年前 回复

封装一个函数,比如:

S('cacheKey',function(){

    ......查询数据库,得到$res

    return $res;

},3000)

S这个函数,先判断缓存是否存在,不存在再调用第二个函数做缓存。。。


php自身实现不了, 

必须要第三方. 

--- 共有 4 条评论 ---
eechen回复 @Tuesday : 呵呵,那你说的第三方是什么? 3年前 回复
Tuesday回复 @eechen : 这就比第三方更第三方. 3年前 回复
eechen无锁共享内存缓存Yac(Yet Another Cache)是鸟哥在PHP内部实现的K/V缓存系统. http://pecl.php.net/package/yac 2.0.0-beta已于2015-10-27发布,支持PHP7. 3年前 回复
悠悠知我心我可能是没说清楚 我写个实例 比如这样 $res=$Cache->get($key); if($res){ return $res; }else{ $res=$db->query(); $Cache->set($key,$res); return $res } 我都是这样写的,结果把代码搞得乱糟糟的 到处都是if else的 有没有什么办法,把这些判断集中到一个地方 3年前 回复
function Save($sth){
  如果缓存存在return缓存+  如果开调试,调试日志记录数据是从缓存来的
   else 查询数据库
}

调用只用Save就好



封装成一个函数不就好了.
//functions.php
function get_post($id) {
    $id = intval($id);
    $mc = new Memcache;
    $mc->pconnect('127.0.0.1', 11211);
    if( $mc->get($id) ) {
        return $mc->get($id);
    }
    else {
        $db = new mysqli();
        return $db->query("select * from posts where id = $id")->fetch_all();
    }
}
//post.php?id=1024
print_r( get_post($_GET['id']) );
顶部