Zettelkasten

django - Cacheops 데이터 관리 방식

·수정 2026.04.24·수정 3

요약

본문

  • cacheops는 3 depth로 데이터를 관리한다.

    • q: 실제 데이터(가장 raw)
    • conj: 의존성이 있는 데이터가 변경되었을 때 함께 갱신되어야하는 캐시 키(q) 목록,
      • key: cacheops:conj:account_likeanswer:user_id=266196
      • value:[cacheops:q:2c9b0e64f126940f8eea0624ecd7a213]
    • schema
      • 쿼리에서 사용된 테이블 column들이 저장됨
  • django-cacheops 6.0.0은 default_app_config 옵션을 사용한다.

    • djagno 4.1에서 default_app_config 설정이 제거되서 자동으로 import되지 않음
  • CACHEOPS_LRU을 사용하는 경우 의존성이 있는 캐시키의 관계를 저장하는 SET 데이터(conj) 에는 TTL이 없음 따라서 실제 데이터 캐시가 TTL이 소멸되어서 삭제되어도 캐시키가 속해있던 conj:XXX는 삭제되지 않고 남아 있음

    • conj:XXX 캐시키는 검색 조건 종류별로 생성됨
    • 해당 설정은 7.0에서 제거됨
  • CACHEOPS_INSIDEOUT: conj 세트 대신 (안쪽 -> 바깥쪽) 방식으로 무결성 체크하는 모드

    • 체크섬: 어떤 데이터에서 계산한 해시, 데이터 변경을 확인함
    • q에 체크섬을 같이 저장하고

캐싱하는 방식

  • insideout 모드가 켜져 있는 경우,cache_thing_insideout.lua 사용, 아닌 경우 cache_thing.lua

Inside out 모드

  • InsideOut 모드는 위에서 설명한 conj의 메모리 사용량이 지속적으로 커지는 문제를 해결하기 위해 만든 로직
  • 간단하게 말해서 기존에 conj:{테이블}:{쿼리}에 모든 무효화 대상을 포함하는 방식에서 해당 쿼리의 데이터 변경 여부를 체크섬을 통해 관리
  • inside out 모드에서는 아래와 같은 방식으로 무효화 대상을 관리함
    • conj:{테이블}:{쿼리}에는 임의의 random 값이 들어가 있음, 해당 쿼리의 데이터가 변경되면 random값이 바뀜
    • q:{쿼리}의 value안에는 읽을 때 참조한 conj 값(랜덤값)이 같이 들어감
    • q:{쿼리}를 읽을 때, q:{쿼리}에 포함된 conj 값과 현재 conj 값을 비교하고 다르면 캐시 무효화후 다시 읽기, 같으면 읽음

참고