요약
본문
-
cacheops는 3 depth로 데이터를 관리한다.
- q: 실제 데이터(가장 raw)
conj: 의존성이 있는 데이터가 변경되었을 때 함께 갱신되어야하는 캐시 키(q) 목록,- key:
cacheops:conj:account_likeanswer:user_id=266196 - value:
[cacheops:q:2c9b0e64f126940f8eea0624ecd7a213]
- key:
- 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 값을 비교하고 다르면 캐시 무효화후 다시 읽기, 같으면 읽음