Laravel ORM에 대한 Model:::find 메소드 캐시 정보

2538 단어
얼마 전에 프로젝트를 할 때, 방법 서명을 바꾸지 않은 상태에서 모델::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 프로그래머 튜토리얼 목록 전체, 당신이 보고 나면 급여가 한 단계 상승합니다(지속 업데이트)

좋은 웹페이지 즐겨찾기