튜토리얼 — Cache의 기본 연산

튜토리얼 — Cache의 기본 연산

DiskCache의 핵심은 diskcache.Cache예요. 익숙한 파이썬 매핑 인터페이스 위에 캐시·성능 파라미터가 더해진 형태죠. 여기서는 Cache를 만들고 값 저장, 만료, 태그 축출 등을 살펴볼게요.

출처: https://grantjenks.com/docs/diskcache/tutorial.html

먼저 Cache를 만들어요. 디렉터리 경로를 지정하면 없으면 자동 생성하고, 지정하지 않으면 임시 디렉터리를 써요.

>>> from diskcache import Cache
>>> cache = Cache()

Cache 객체는 스레드 간에 공유할 수 있고, 두 Cache 객체가 같은 디렉터리를 참조해 프로세스 간 통신도 지원해요. 모든 연산은 원자적이고, with 문으로 close를 안전하게 처리할 수 있어요.

>>> with Cache(cache.directory) as reference:
...     reference.set('key', 'value')
True

일반 연산자로 값을 넣고 읽고 지워요.

>>> cache['key'] = 'value'
>>> cache['key']
'value'
>>> 'key' in cache
True
>>> del cache['key']

set 메서드는 expire, read, tag 같은 키워드 파라미터를 추가로 지원해요. 아래 예시는 키를 5초 후 만료시키고, 값을 파일 객체로 읽고, tag 메타데이터를 저장해요.

>>> from io import BytesIO
>>> cache.set('key', BytesIO(b'value'), expire=5, read=True, tag='data')
True

getdefault, read, expire_time, tag 파라미터로 추가 정보를 조회할 수 있어요.

>>> result = cache.get('key', read=True, expire_time=True, tag=True)
>>> reader, timestamp, tag = result

만료 시간을 갱신하려면 touch를 써요.

>>> cache.touch('key', expire=None)
True

값을 증가·감소시키고 싶으면 incrdecr을 써요. 이들 연산은 원자적이고 SQLite의 64비트 정수 컬럼을 가정해요.

>>> cache.incr(b'test')
124
>>> cache.decr(b'test', 24)
100

태그 기반 축출도 가능해요. evict('even') 같은 호출로 특정 태그가 붙은 키들을 한 번에 제거할 수 있고, tag_index=True로 태그 인덱스를 만들면 축출을 빠르게 할 수 있어요.

>>> for num in range(100):
...     _ = cache.set(num, num, tag='odd' if num % 2 else 'even')
>>> cache.evict('even')
50

더 알아보기