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

Laravel框架
433
0
0
2022-09-09

如果有一些数据是通过需要复杂的查表、需要复杂的计算、需要拉取 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;
}