项目中简单的用 mysql 缓存数据

如果有一些数据是通过需要复杂的查表、需要复杂的计算、需要拉取 api 获得,而实时性要求不高的,为了减少系统消耗,就可以考虑缓存,这样这部分数据可以通过一条 sql 获得。

首先创建表,表的要素就是最后更新时间,比如创建一个简单的 key-value 用于存储页面的某个区域的数据 page_caches 表,

CREATE TABLE `page_caches` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'cache',
  `cache_key` varchar(50) DEFAULT NULL,
  `cache_val` text,
  `refresh_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

然后在 Model/PageCache 中定义

class PageCache extends Model
{
    //修改器 读取将json转成array
    public function getCacheValAttribute($value)
    {
        $decode = json_decode($value, true);
        return is_array($decode) ? $decode : $value;
    }
    //修改器 设置时将array的转成json存储
    public function setCacheValAttribute($value)
    {
        $this->attributes['cache_val'] = is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
    }
    //获取某个Key的数据
    public static function getValue($cache_key) {
        return self::where('cache_key', $cache_key)->first();
    }
    //设置某个key
    public static function setValue($cache_key, $cache_value)
    {
        if ($cache = self::where('cache_key', $cache_key)->first()) {
            $cache->cache_val = $cache_value;
            $cache->refresh_at = date('Y-m-d H:i:s',time());
            $cache->save();
        } else {
            $cache = new self();
            $cache->cache_key = $cache_key;
            $cache->cache_val = $cache_value;
            $cache->refresh_at = date('Y-m-d H:i:s',time());
            $cache->save();
        }
    }
}

在业务中使用

protected function getInfoCache($param1 = 0, $param2 = 1) {
    $cache_key = 'page-tuijian-' . $param1 . '-' .$param2;

    $cache = PageCache::getValue($cache_key);

    $expire = 1*3600; // 缓存时间
    if ($cache && strtotime($cache->refresh_at) >  time() - $expire) {
        return $cache->cache_val;
    }

    $data = $this->getData($param1, $param2);//获取最新数据
    PageCache::setValue($cache_key, $data);

    return $data;
}

protected function getData($param1 = 0, $param2 = 1) {
  //复杂的逻辑
  return $data;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
welcome come back
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
95
粉丝
24
喜欢
156
收藏
347
排名:323
访问:2.9 万
私信
所有博文
社区赞助商