캐시 만료되기전 강제로 캐시를 put 하게 되면 안되게 되어있나요?
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.2 |
어제부터 뭐좀 해보려고
위쪽 라인에 캐시가에 데이터가 있다면 이라는 조건에서 조건에 안걸리는 대상을 만들어
데이터를 새로 만들고 이후에 아래 코드가 진행되도록 해보았는데요.
if ($oCacheHandler->isSupport()) {
$oCacheHandler->put($cache_key_c, $data, $ttl);
}
데이터가 날아가고 캐시로 저장이 안되더라고요.
그래서 다른 대상이 다시 접속해도 빈데이터 입니다.
다른 과정이 필요한가요? 해당 캐시가 서버에 아직 있는 시간 입니다.
댓글 13
제가 판단하기에는 문제점을 찾아내기 어렵네요.
알려주신 것에 특별히 그냥 리턴에 포함되지 않을 조건을 하나 더 추가해줬습니다.
function getMyDataFromAPI()
{
$cache_key_c = 'coronadata';
$oCacheHandler = CacheHandler::getInstance('object');
if ($oCacheHandler->isSupport() && $data = $oCacheHandler->get($cache_key_c) && !무사통과될 조건)) {
return $data;
}
$data = json_decode($response);
$ttl = 600;
if ($oCacheHandler->isSupport()) {
$oCacheHandler->put($cache_key_c, $data, $ttl);
}
return $data;
}
위와 같이 코드를 짜서 작동의도
1.무사통과조건 대상은 리턴되지 않아서 새로 데이터를 생성하고 캐시에 새롭게 저장한다.
2.다른 대상들은 위 조건에 걸려 무조건 저장된 data를 받게 된다.
입니다.
그런데 실제 동작
1.무사통과조건 대상은 조건에서 벗어나 아래 새롭게 데이터생성 코드로 접근
2.다른 대상으로 접속을 해보면 데이터가 없습니다.
*추론 저 코드로 동작될때 특정대상만 통과되어 그 대상이 데이터를 잘 생성하고
이후 그 데이터를 캐시에 넣을때 빈값이 들어가는 듯 합니다.
만료전에 put해서 cache stampede 방지로 쓰곤 하지요 ㅎ
캐시 로직을 다시 점검 해보시는것 밖에 방법이 없을듯합니다.
캐싱데이터를 변화를 검사하는 경우라면 사실 백엔드에 캐싱을 하나 안하나 api요청하는건 같아서 캐싱의 의미가 없을 수 있어요.
10분 주기의 캐시는 이미 잘 구현을 했구요.
위젯 캐시를 사용할 수 없는게 html 전체를 캐시해 버리기 때문에 반응형의 경우 디자인에 문제가 생깁니다.
지금 데이터를 오브젝트 캐시에 저장해서 잘 사용하고 있어요.
이게 답일지 확신 할 수 없는데
첫번째 리턴에서 return $data; 를
return $data = $oCacheHandler->get($cache_key_c);
이렇게 바꾸니 캐시에 들어간 것이 불러와 지네요.
아마 이게 문제였던 것 같습니다. 만료 전에 캐시를 특정 대상이 새롭게 넣었는데
리턴 대상이라 리턴을 받을때 $data 로만 받으니 빈 값이었던 듯 합니다.
만료될때 누구나 캐시를 갱신하는 상황과 다른 상황이 발생하는 이유는 지식이 없어서 파악은 안되네요.
매일 오전 10시 즈음 한번만 갱신이 되는 데이터여서 굳이 자주 데이터를 조회할 필요가 없는 상황이었습니다.
1.캐시를 아주 길게 설정했습니다.
2.주소에 특정 매개변수가 들어간 접속에만 캐시가 갱신되도록 처리했습니다.
- 이 질문글이 올라온 이유죠.
3.크론탭으로 오전 10시 2분 경부터 수차례 매개변수를 포함한 주소로 페이지에 접속을 하도록 했습니다.
일반 방문자의 경우 항상 캐시된 데이터를 바로 출력되는 화면을 제공 받을 수 있게 되었습니다.
뭐 우연히 이번 제 문제는 편법 같지만 해결은 되었지만 생각나 적어봅니다.