亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel ORM對Model::find方法進行緩存的示例

發布時間:2021-01-25 12:33:57 來源:億速云 閱讀:164 作者:小新 欄目:編程語言

這篇文章主要介紹Laravel ORM對Model::find方法進行緩存的示例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

前段時間做項目時候,想要在不改變方法簽名的情況下,給 Model::find 方法做個緩存。而且想要做到即插即用。

1.先看一下當我們調用 find 方法時,框架干了什么?

找到 Illuminate\Database\Eloquent\Model 的代碼,搜索 find,沒有該方法。看來是走了 __callStatic 這個魔術方法。該方法里只有一行代碼:

return (new static)->$method(...$parameters);

static 指的是調用該靜態方法的類(如果使用的是 UserModel::find(1),則 static 就代表 UserModel 類)。看來是實例化了一個對象,并調用了成員方法。

2.分析如何優雅地在中間插一腳

為了能夠在調用 find 時候,先走我們的緩存,所以我們需要覆蓋 __callStatic 方法,并檢測如果是 find 方法,則優先返回緩存中的數據。

另外,為了能夠達到即插即用的效果,我們使用繼承的方式,而是使用了 Trait。核心邏輯如下:

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 ORM對Model::find方法進行緩存的示例”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卫辉市| 随州市| 大英县| 彭阳县| 若羌县| 渝中区| 武功县| 长汀县| 马公市| 绥化市| 拉孜县| 新绛县| 道孚县| 承德县| 平湖市| 普定县| 澄城县| 庄浪县| 衡水市| 方山县| 南靖县| 台安县| 林西县| 曲周县| 沈阳市| 女性| 阿图什市| 罗山县| 安义县| 浦东新区| 明星| 武胜县| 沐川县| 巴林右旗| 迭部县| 来宾市| 利辛县| 道真| 蕲春县| 壶关县| 平顶山市|