Laravel ORM에 대한 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 방법이라면 캐시에 있는 데이터를 우선적으로 되돌려줍니다.
또 플러그 앤 플레이 효과를 낼 수 있도록 계승하는 방식이 아닌 트레이트를 사용했다.핵심 논리는 다음과 같습니다.
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. 디테일 보완
데이터를 수정하거나 삭제할 때 캐시된 내용을 삭제해야 합니다.
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;
}
얼른 가서 해봐.
추가 PHP 콘텐츠는 다음을 참조하십시오.
텐센트 T3-T4 표준 정품 PHP 프로그래머 튜토리얼 목록 전체, 당신이 보고 나면 급여가 한 단계 상승합니다(지속 업데이트)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.