在Laravel的Model层做数据缓存的实现(2)
这里的 $touches
属性是个数组,包含了在评论的创建、保存和删除时会引起“触发”的关联信息。
缓存的属性
我们先回到 $article->cached_comments_count
访问器。该方法的实现可能象 App\Article
模型中的样子:
public function getCachedCommentsCountAttribute() { return Cache::remember($this->cacheKey() . ':comments_count', 15, function () { return $this->comments->count(); }); }
我们使用唯一键值的 cacheKey()
方法缓存模型 15 分钟,然后简单地在闭包方法中返回评论计数值。
注意,我们也用到了 Cache::rememberForever()
方法,靠着缓存机制的垃圾回收策略以删除过期的键值。我设置了一个定时器,以便在每隔 15 分钟的缓存刷新间隔里,缓存可在该时间的多数范围内有最高的命中率。
cacheKey()
方法要用到模型的唯一键值,并且在模型更新时对应缓存失效。下面是我的 cacheKey
实现代码:
public function cacheKey() { return sprintf( "%s/%s-%s", $this->getTable(), $this->getKey(), $this->updated_at->timestamp ); }
模型的 cacheKey()
方法示例输出结果可能返回下面的字串信息:
articles/1-1515650910
这个键值是由表名、模型id值及当前 updated_at
的 timestamp 值组成。一旦我们触发这个模型,timestamp 值就会更新,并且我们的模型缓存就会相应地失效。
以下是 Article
模型的完整代码:
<?php namespace App; use App\Comment; use Illuminate\Support\Facades\Cache; use Illuminate\Database\Eloquent\Model; class Article extends Model { public function cacheKey() { return sprintf( "%s/%s-%s", $this->getTable(), $this->getKey(), $this->updated_at->timestamp ); } public function comments() { return $this->hasMany(Comment::class); } public function getCachedCommentsCountAttribute() { return Cache::remember($this->cacheKey() . ':comments_count', 15, function () { return $this->comments->count(); }); } }
然后是关联的 Comment
模型:
<?php namespace App; use App\Article; use Illuminate\Database\Eloquent\Model; class Comment extends Model { protected $guarded = []; protected $touches = ['article']; public function article() { return $this->belongsTo(Article::class); } }
内容版权声明:除非注明,否则皆为本站原创文章。