Q&A

캐시 만료되기전 강제로 캐시를 put 하게 되면 안되게 되어있나요?

2020.04.24 03:17
425
0
CMS/프레임워크 XE 1.x
개발 언어 PHP 7.2

어제부터 뭐좀 해보려고

 

위쪽 라인에 캐시가에 데이터가 있다면 이라는 조건에서 조건에 안걸리는 대상을 만들어 

데이터를 새로 만들고 이후에 아래 코드가 진행되도록 해보았는데요.

 

 

if ($oCacheHandler->isSupport()) {

    $oCacheHandler->put($cache_key_c, $data, $ttl);
}

 

 

데이터가 날아가고 캐시로 저장이 안되더라고요. 

그래서 다른 대상이 다시 접속해도 빈데이터 입니다.

 

다른 과정이 필요한가요? 해당 캐시가 서버에 아직 있는 시간 입니다.

댓글 13

  • 2020.04.24 03:25 #1384606
    만료 전에 put 해도 아무 문제 없습니다. 새 데이터로 덮어씌워져야 정상입니다. 저장하고 불러오는 로직을 다시 꼼꼼히 점검해 보세요. 캐시 로직 제대로 짜기 은근히 어렵습니다. ㅠ
  • 2020.04.24 03:27 #1384611
    만료 전이라도 상관 없는거군요. 더 살펴볼게요.
  • 2020.04.24 03:39 #1384625

    제가 판단하기에는 문제점을 찾아내기 어렵네요.
    알려주신 것에 특별히 그냥 리턴에 포함되지 않을 조건을 하나 더 추가해줬습니다.

    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.다른 대상으로 접속을 해보면 데이터가 없습니다.

     

    *추론 저 코드로 동작될때 특정대상만 통과되어 그 대상이 데이터를 잘 생성하고 

    이후 그 데이터를 캐시에 넣을때 빈값이 들어가는 듯 합니다.

  • 2020.04.24 04:36 #1384658

    만료전에 put해서 cache stampede 방지로 쓰곤 하지요 ㅎ

     

    캐시 로직을 다시 점검 해보시는것 밖에 방법이 없을듯합니다.

  • 2020.04.24 04:54 #1384676
    캐시 로직이 위 댓글이 전부에요.
  • 2020.04.24 06:17 #1384688
    무사통과되는 조건은 어떤 환경에서 실행되는 것인가요? 예를 들어 크론탭에서 php example.php 이런 식으로 실행한다면 웹에서 사용하는 APC 캐시를 공유하지 않기 때문에, 캐시에 데이터를 저장하더라도 그냥 증발하는 것처럼 보일 수 있습니다.
  • 2020.04.24 06:19 #1384695
    일반적인 환경으로 만들려고 제 pc의 ip로 구분해서 테스트 햇습니다.
  • 2020.04.24 06:18 #1384692
    사용하실곳이 위젯이라면 결국 10분주기로 캐싱데이터를 갱신하고 싶으시다면 그냥 위젯케시를 사용하시는게 좋습니다.

    캐싱데이터를 변화를 검사하는 경우라면 사실 백엔드에 캐싱을 하나 안하나 api요청하는건 같아서 캐싱의 의미가 없을 수 있어요.
  • 2020.04.24 06:19 #1384699

    10분 주기의 캐시는 이미 잘 구현을 했구요.
    위젯 캐시를 사용할 수 없는게 html 전체를 캐시해 버리기 때문에 반응형의 경우 디자인에 문제가 생깁니다.

     

    지금 데이터를 오브젝트 캐시에 저장해서 잘 사용하고 있어요. 

  • 2020.04.24 06:47 #1384714
    반응에 따라 HTML이 바뀌는게 백엔드에서 처리하나보군요 ㄸ
  • 2020.04.24 09:25 #1384897

    이게 답일지 확신 할 수 없는데
    첫번째 리턴에서 return $data; 를
    return $data = $oCacheHandler->get($cache_key_c);

    이렇게 바꾸니 캐시에 들어간 것이 불러와 지네요.

    아마 이게 문제였던 것 같습니다. 만료 전에 캐시를 특정 대상이 새롭게 넣었는데
    리턴 대상이라 리턴을 받을때 $data 로만 받으니 빈 값이었던 듯 합니다.

     

    만료될때 누구나 캐시를 갱신하는 상황과 다른 상황이 발생하는 이유는 지식이 없어서 파악은 안되네요.

  • 2020.04.24 10:00 #1384916
    어찌 되었던 원하던 대로 구현은 완료되었습니다.
    매일 오전 10시 즈음 한번만 갱신이 되는 데이터여서 굳이 자주 데이터를 조회할 필요가 없는 상황이었습니다.

    1.캐시를 아주 길게 설정했습니다.
    2.주소에 특정 매개변수가 들어간 접속에만 캐시가 갱신되도록 처리했습니다.
    - 이 질문글이 올라온 이유죠.
    3.크론탭으로 오전 10시 2분 경부터 수차례 매개변수를 포함한 주소로 페이지에 접속을 하도록 했습니다.

    일반 방문자의 경우 항상 캐시된 데이터를 바로 출력되는 화면을 제공 받을 수 있게 되었습니다.
  • 2020.04.24 12:28 #1385012
    이거 왠지 예전에 로그인갱신 애드온에서 회원정보 캐시 클리어 시켰을때 서명 하고 프로필 이미지 사라졌던 거랑 비슷한 케이스 같은 느낌적 느낌입니다.
    뭐 우연히 이번 제 문제는 편법 같지만 해결은 되었지만 생각나 적어봅니다.