如何封装一个公共的缓存处理. 没想到好的解决方案. 望告知.
在 laravel 的 model 中, 使用缓存. 方式如下.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
class Banner extends Model
{
protected $table = 'banners';
public function getImageUrlAttribute($value)
{
return config('database.imageDomain') . '/v2' . $value;
}
/**
* @param int $limit
* @param int $cacheTime
* @return array|mixed
*/
public function getBanner(int $limit = 0, int $cacheTime = 10)
{
// 有缓存则使用缓存.
$cacheName = __METHOD__ . '@' . implode(',', func_get_args());
if (($cacheTime && !config('app.debug')) || config('app.isCache')) {
$cache = Cache::tags(['home', 'banner'])->get($cacheName);
if ($cache) {
return $cache;
}
}
// 没有缓存, 则查询.
$data = $this->query()->where('status', 1)->orderByDesc('sort')->orderByDesc('id')
->when($limit, function ($query, $limit) {
return $query->limit($limit);
})->get(['image_url', 'link'])->toArray();
// 把查询的数据, 放入缓存.
if ($cacheTime && $data && (!config('app.debug') || config('app.isCache'))) {
Cache::tags(['home', 'banner'])->put($cacheName, $data, $cacheTime);
}
// 返回.
return $data;
}
}
在 getBanner
这个方法中, 我使用当前的 类名 + 方法名 + 参数值
作为缓存名称.
缓存存在就直接返回缓存的数据, 不存在就查询数据库, 把结果放入缓存, 返回数据.
感觉每次使用缓存, 都写一遍这样的代码, 很啰嗦. 有没有什么好的方式, 封装一下. 能解决这个问题.
- 问题 1 : 缓存名称我用的是
__METHOD__
,func_get_args()
, 如果封装一个方法 A, 那么得到的就是方法 A 的结果了. 这个怎么办? - 问题 2 : 能封装的应该是
有缓存则使用缓存.
和把查询的数据, 放入缓存.
对应的代码, 而没有缓存, 则查询.
对应的代码, 是在中间位置, 如何处理? 使用Closure
?
如果有更高的处理方式, 请告知.
推荐文章: