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