Skip to content

스크립트 개발 / 간단한 캐시 DFF.CACHE

DFF.CACHE는 Redis 기반의 임시 캐시로, 구조는 scope + key -> value이며 카운터, 큐, 집합 및 경량 메시지 발행에 적합합니다.

JSON 타입을 유지하거나 소규모 애플리케이션 상태를 영구 저장해야 하는 경우 DFF.STORE를 사용해야 합니다.

주요 차이점

  • 읽어낸 스칼라 값은 일반적으로 문자열이므로, 비즈니스 유형에 따라 int(...), float(...) 또는 json.loads(...)를 호출해야 합니다.
  • 기본 scope는 현재 Script ID입니다. Script 간에 데이터를 공유하려면 동일한 scope를 명시적으로 전달해야 합니다.
  • 모든 Key와 발행 Topic은 Scope별로 격리되며, 반환되는 Key 이름에는 내부 Scope 접두사가 포함되지 않습니다.
  • hstrlenall(...){field: value 바이트 길이}를 반환합니다. 길이 단위는 바이트이며 Unicode 문자 수가 아닙니다.

API 빠른 참조

Key

메서드 설명
type(key, scope=None) Key의 데이터 타입 반환
keys(pattern='*', scope=None) 일치하는 Key 반환
exists(key, scope=None) Key 존재 여부 확인
expire(key, expires, scope=None) 남은 만료 초 설정
expireat(key, timestamp, scope=None) UNIX 초 타임스탬프 형식의 만료 시간 설정
ttl(key, scope=None) / pttl(key, scope=None) 남은 만료 시간을 각각 초와 밀리초 단위로 반환
rename(key, new_key, scope=None) Key 이름 변경
renamenx(key, new_key, scope=None) 대상이 존재하지 않을 때만 Key 이름 변경
delete(key, scope=None) 단일 Key 삭제, 또는 리스트/튜플을 전달하여 일괄 삭제
delete_pattern(pattern, scope=None) 일치하는 Key 삭제; pattern은 필수

String

메서드 설명
set(key, value, expires=None, not_exists=False, exists=False, scope=None) 값 쓰기, Key 존재 상태와 만료 초 제한 가능
mset(key_values, scope=None) 일괄 쓰기; 동시에 만료 시간 설정은 지원하지 않음
get(key, scope=None) / DFF.CACHE(key, scope=None) 단일 값 읽기
mget(keys, scope=None) 일괄 읽기
get_pattern(pattern, scope=None) 일치하는 {key: value} 반환
getset(key, value, scope=None) 새 값을 쓰고 이전 값을 반환
incr(key, step=1, scope=None) / incrby(key, step, scope=None) 정수 값 증가

Hash

메서드 설명
hkeys(key, pattern='*', with_values=False, scope=None) 일치하는 필드 반환; with_values=True이면 값도 함께 반환
hset(key, field, value, not_exists=False, scope=None) 필드 쓰기
hsetnx(key, field, value, scope=None) 필드가 존재하지 않을 때만 쓰기
hmset(key, field_values, scope=None) 필드 일괄 쓰기
hget(key, field, scope=None) 필드 읽기
hstrlen(key, field, scope=None) / hstrlenall(key, scope=None) 하나 또는 전체 필드 값의 바이트 길이 반환
hmget(key, fields, scope=None) 필드 일괄 읽기
hgetall(key, scope=None) 모든 필드와 값 읽기
hincr(key, field, step=1, scope=None) / hincrby(key, field, step, scope=None) 정수 필드 값 증가
hdel(key, field, scope=None) 단일 필드 삭제, 또는 리스트/튜플을 전달하여 일괄 삭제

List

메서드 설명
lpush(key, value, scope=None) / rpush(key, value, scope=None) 왼쪽 / 오른쪽에서 값 또는 값 리스트 푸시
lpop(key, count=None, scope=None) / rpop(key, count=None, scope=None) 왼쪽 / 오른쪽에서 하나 이상의 값 팝
blpop(key, timeout=0, scope=None) / brpop(key, timeout=0, scope=None) 블로킹 팝
rpoplpush(key, dest_key=None, scope=None, dest_scope=None) 소스 리스트 오른쪽에서 팝하여 대상 리스트 왼쪽으로 푸시
brpoplpush(key, dest_key=None, timeout=0, scope=None, dest_scope=None) 블로킹 팝 및 푸시
llen(key, scope=None) 리스트 길이 반환
lrange(key, start=0, stop=-1, scope=None) 지정된 범위 반환
ltrim(key, start, stop, scope=None) 지정된 범위만 유지

blpop(...)brpop(...)[원래 키 이름, value]를 반환하고, 타임아웃 시 [None, None]을 반환합니다. rpoplpush(...)brpoplpush(...)에서 대상 Key를 생략하면 소스 Key를 사용하며, dest_scope는 명시적인 Scope 간 이동에 사용할 수 있습니다.

Set

메서드 설명
sadd(key, member, scope=None) / srem(key, member, scope=None) 멤버 또는 멤버 리스트 추가 / 삭제
scard(key, scope=None) 멤버 수 반환
smembers(key, scope=None) 전체 멤버 반환
sismember(key, member, scope=None) 멤버 존재 여부 확인

ZSet

메서드 설명
zadd(key, member_scores, scope=None) / zrem(key, member, scope=None) 멤버 추가 / 삭제
zcard(key, scope=None) 멤버 수 반환
zrange(key, start=0, stop=-1, with_scores=False, scope=None) 위치 기준 멤버 반환
zrangebyscore(key, min_score='-inf', max_score='+inf', with_scores=False, scope=None) 점수 기준 멤버 반환
zpop_below_all(key, score, scope=None) / zpop_above_all(key, score, scope=None) 지정된 점수 이하 / 이상인 전체 멤버 팝
zpop_below_lpush_all(key, dest_key, score, scope=None) / zpop_above_lpush_all(key, dest_key, score, scope=None) 점수 조건에 맞는 멤버를 팝하여 대상 리스트로 푸시합니다

ZSet 팝 또는 이동 확장을 실행하기 전에 소스 Key, 대상 Key 및 점수 경계를 확인해야 합니다.

게시 및 동적 참조

메서드 설명
publish(topic, message, scope=None) Scope 접두사가 있는 Topic에 메시지 게시
ref(key, scope=None, default=None) 동적 값 조회를 지원하는 DFF.API 매개변수의 지연 참조를 생성합니다

ref(...)에서 scope를 생략하면 전용 REF Scope를 사용합니다. String, List, Hash, Set, ZSet은 각각 대응하는 읽기 작업으로 참조를 해석합니다. 참조는 DFF.APIdelayed_cron_job, timeout, expires, queue 매개변수에만 사용됩니다.

예제

일반적인 데이터 구조
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import json

DFF.CACHE.set('count', 1, expires=60, scope='job')
count = int(DFF.CACHE.get('count', scope='job') or 0)

DFF.CACHE.hmset('user:001', {'name': 'Tom', 'age': 20}, scope='users')
age = int(DFF.CACHE.hget('user:001', 'age', scope='users') or 0)

DFF.CACHE.rpush('queue', json.dumps({'id': 1}), scope='jobs')
item = json.loads(DFF.CACHE.lpop('queue', scope='jobs'))

사용 시 주의사항

  • 블로킹 작업에는 적절한 timeout을 설정하여 Func 타임아웃을 방지해야 합니다.
  • delete_pattern(...)을 실행하기 전에 먼저 keys(...)로 일치 항목을 확인해야 합니다.
  • 매우 큰 Hash에 hstrlenall(...)을 호출하지 마세요. 공유 캐시 서비스가 차단될 수 있습니다.
  • publish(...)의 Topic에는 Scope 접두사가 있으므로 구독 측은 일관된 Scope 규칙을 사용해야 합니다.
  • 여러 Script가 데이터를 공유할 때는 scope를 명시적으로 전달해야 합니다.