首页 > php框架 > Laravel > 正文

关于 Laravel ORM 对 Model::find 方法进行缓存

藏色散人
发布: 2020-05-26 11:55:45
转载
3220人浏览过

下面由Laravel开发教程栏目给大家介绍Laravel ORM 中你不知道的骚操作,希望对需要的朋友有所帮助!

关于 Laravel ORM 对 Model::find 方法进行缓存

前段时间做项目时候,想要在不改变方法签名的情况下,给 Model::find 方法做个缓存。而且想要做到即插即用。

1.先看一下当我们调用 find 方法时,框架干了什么?

找到 IlluminateDatabaseEloquentModel 的代码,搜索 find,没有该方法。看来是走了 __callStatic 这个魔术方法。该方法里只有一行代码:

return (new static)->$method(...$parameters);
登录后复制

static 指的是调用该静态方法的类(如果使用的是 UserModel::find(1),则 static 就代表 UserModel 类)。看来是实例化了一个对象,并调用了成员方法。

2.分析如何优雅地在中间插一脚

为了能够在调用 find 时候,先走我们的缓存,所以我们需要覆盖 __callStatic 方法,并检测如果是 find 方法,则优先返回缓存中的数据。

另外,为了能够达到即插即用的效果,我们使用继承的方式,而是使用了 Trait。核心逻辑如下:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
public static function create($data = null){
    if ($data == null){
        return null;
    }
    $instance = new static;
    foreach ($data as $key => $value){
        $instance[$key] = $value;
    }
    return $instance;
}
/**
 * 如果方法是 find($id, $nocache)
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
    if ($method == 'find'){
        // 从缓存中获取数据
        $obj = static::create(json_decode(Redis::get(static::getCacheKey($parameters[0])), true));
        if (null == $obj){
            $obj = (new static)->$method(...$parameters);
            if (null == $obj){
                return null;
            } else {
                $key = static::getCacheKey($parameters[0]);
                // 设置缓存及过期时间
                Redis::set($key, $obj);
                Redis::expire($key, static::$expire_time);
                return $obj;
            }
        } else {
            $obj->exists = true;
            return $obj;
        }
    } else if($method == 'findNoCache'){
        $method = 'find';
        return (new static)->$method(...$parameters);
    }
    return (new static)->$method(...$parameters);
}
private static function getCacheKey($id){
    $name = str_replace('\', ':', __CLASS__);
    return "{$name}:{$id}";
}
登录后复制

大体逻辑上面已经介绍过了:覆盖 __callStatic 方法,判断如果是调用 find ,则走缓存(无缓存,查询后需要设置缓存)。另新增 findNoCache 方法。

3.细节补充

当修改(或删除)数据(调用 save 方法)时需要删除已缓存的内容。

private static function clearCache($id){
    Redis::del(self::getCacheKey($id));
}
/**
 * when save, should clear cache
 * @param array $options
 */
public function save(array $options = []){
    static::clearCache($this[$this->primaryKey]);
    return parent::save($options);
}
// delete 方法我暂时写,内容类似 save 方法
如何使用。在需要使用 find 缓存的 Model 类里,加上一行就够了。
class User extends BaseModel
{
    use MemoryCacheTrait;
}
登录后复制

快去试试吧。

更多laravel框架技术文章,请访问laravel教程!

以上就是关于 Laravel ORM 对 Model::find 方法进行缓存的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号