PHP如何优雅的建立缓存

悠悠知我心 发布于 2015/10/29 09:24
阅读 788
收藏 1
PHP
总不能每个需要缓存的地方,都写个if缓存存在,return缓存,else 查询数据库吧

以下是问题补充:

@悠悠知我心:比如这样 $res=$Cache->get($key); if($res){ return $res; }else{ $res=$db->query(); $Cache->set($key,$res); return $res } 我都是这样写的,结果把代码搞得乱糟糟的 (2015/10/29 09:49)
加载中
1
老陌
老陌
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() );

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



crazymus
crazymus
很好的思路,这个例子很好地显示了抽象类的作用,赞!
1
eechen_
eechen_

封装一个函数,比如:

S('cacheKey',function(){

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

    return $res;

},3000)

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


0
Tuesday
Tuesday

php自身实现不了, 

必须要第三方. 

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

把机制改成:1,发出通知“我要读缓存啦”。 2,读缓存

#1和#2之间的事情,让其他程序(比如MQ、Java)处理。

0
inuxor
inuxor
永远默念三个词:封装 继承 多态
0
梅开源
梅开源
function Save($sth){
  如果缓存存在return缓存+  如果开调试,调试日志记录数据是从缓存来的
   else 查询数据库
}

调用只用Save就好



0
ArEs_BB
ArEs_BB

封装个方法就好了啊

0
eechen
eechen
封装成一个函数不就好了.
//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']) );
0
crazymus
crazymus
当你发现不停地在写“类似”的代码的时候,就要考虑封装了。
返回顶部
顶部