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