周梦康 发表于 2016-10-09 2099 次浏览 标签 : redis未来的一本书
public function getRoundTable($id)
{
    $cacheKey = self::$keyPrefix . $id;
    $getFn = function() use ($id) {
        $rt = RoundTableInfoStore::getInfo($id);
        $rt['gifts'] = RoundTableGiftStore::getGiftsWithNameForQuestion($id);
        return $rt;
    };
    return \Tool\Cache::fetch($cacheKey, $getFn);
}
public static function getBasicInfo($qid,$isdel=0)
{
    $qid = intval($qid);
    $isdel = intval($isdel);
    $key = self::keyForBaseInfo($qid);
    
    $get_func = function () use ($qid,$isdel) {
        $select = array(
            'qid', 'uid', 'ctime', 'is_anony', 'is_markdown',
        );
        
        $row = \MCore_Dao_DB::create()->select(self::$table, $select, $where)->first();
        if ($row && $row['type'] == AskModel::TYPE_ROUNDTABLE) {
            $m = new \Models\RoundTable\RoundTableModel();
            $row = array_merge($row, $m->getRoundTable($qid));
        }
        return empty($row) ? null : $row;
    };
    return \Tool\Cache::fetch($key, $get_func);
}

冗余的缓存导致了一个礼物的数据更新,而必须更新所有的关联数据,这是一个噩梦。

我们应该将缓存的颗粒度设计的更小一些,再通过关联关系关联起来。

/**
 * 根据 id 获取礼物详情列表
 * 仅仅缓存一些静态数据,计数数据不在这里缓存
 *
 * @param array $ids
 * @return array
 * @author 楚松 <mengkang.zmk@alibaba-inc.com>
 */
public static function getGiftListByIds(array $ids)
{
    $key = RedisKeyManager::get("gifts");

    $getListFn = function ($ids){
        $where = "gid in (" . implode(",", $ids) . ")";
        $rows = \MCore_Dao_DB::create()->selectRawWhere(self::$table, 0, ["gid","name","intro","cate_id","picture"], $where);
        $res = [];
        if ($rows["data"]) {
            foreach ($rows["data"] as $row){
                $res[$row["gid"]] = $row;
            }
        }
        return $res;
    };

    return Cache::hMGet($key,$ids,$getListFn);
}


👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表

回复 路人甲 2017-09-25 14:35:00
意思说推荐用redis咯?