Php Memcache设计模式问题

时间:2014-05-01 12:00:41

标签: php caching design-patterns memcached

对于我正在研究的小型家庭项目,我一直在为Memcache实现寻找OO设计模式,但到目前为止还没有发现我觉得合适的东西,所以也许我的方法是错误的。

我有一个数据库连接类和一个baseModel类,所以我想在适当的地方在baseModel上实现缓存。 我已经实现了数据库连接和Cacher作为Singlton模式。

在基础模型“loadFromDb”函数刷新页面后,我似乎无法让Cacher类读取数据或触发echo "<p>Getting from cache";

以下是课程:

class Cacher {

protected static $cacher = null;
private static $settings;

public static function getCache() {
    if (self::$cacher != null) {
        return self::$cacher;
    }
    try {
        self::$settings = parse_ini_file("./configs/main.ini");
        self::$cacher = new Memcache();
        self::$cacher->connect(
            self::$settings['cache_server_host']
            , self::$settings['cache_server_port']
        );
    } catch (Exception $e) {
        // TODO log error and mitigate..
        echo "Error connecting memcache";
        die();
    }
    var_dump(self::$cacher->getstats());
    return self::$cacher;
}

public static function getData($key) {
    if (self::$cacher == null) {
        self::getCache();
    }
    return self::$cacher->get($key);
}

public static function setData($key, $data, $expire = 0) {
    if (self::$cacher == null) {
        self::getCache();
    }
    if (self::$cacher)
        return self::$cacher->set($key, $data, MEMCACHE_COMPRESSED, $expire);
}

}




class ModelBase {

protected $fields = array();
protected $class = null;

function __construct($class_name) {
    $this->class = $class_name;
    $this->fields = Database::getFields($class_name);
}

public function loadFromDB($id, $fromCache = true) {
    $key = "loadFromDB_{$this->class}_{$id}";

    if ($fromCache) {
        $data = Cacher::getData($key);

        if ($data) {
            echo "<p>Getting from cache";
            return unserialize($data);
        } else {
            echo "<p>No cache data. going to DB";
        }
    }
    $values = Database::loadByID($this->class, $this->fields[0], $id);

    foreach ($values as $key => $val) {
        $this->$key = $val;
    }
    $dataSet = Cacher::setData($key, serialize($this));
    echo "<p>Data set =  $dataSet";
}

}

Memcache服务正在运行,如果我在写完之后直接读取缓存,我可以直接读取数据,但我想要的是仅在第一次加载页面时从数据库读取数据,之后使用缓存....

欢迎任何评论......

1 个答案:

答案 0 :(得分:1)

尝试这样做(让缓存的结果决定你是否应该查询数据库):

<?php 
public function loadFromDB($id) {
    $key = "loadFromDB_{$this->class}_{$id}";

    //query cache
    $data = Cacher::getData($key);

    //is it found
    if (!empty($data)) {
        //echo "<p>Getting from cache";
        return unserialize($data);
    } 
    //no so lest query db
    else {
        //echo "<p>No cache data. going to DB";
        $values = Database::loadByID($this->class, $this->fields[0], $id);

        foreach ($values as $key => $val) {
            $this->$key = $val;
        }

        //store it in cache
        //$dataSet = Cacher::setData($key, serialize($this));
        $dataSet = Cacher::setData($key, serialize($values));//<<store the db result not the class
    }

    //echo "<p>Data set =  $dataSet";
    return unserialize($dataSet);
}
?>
相关问题