스크립트 개발 / 간단한 캐시 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.API의 delayed_cron_job, timeout, expires, queue 매개변수에만 사용됩니다.
예제
| 일반적인 데이터 구조 |
|---|
| 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를 명시적으로 전달해야 합니다.