跳轉至

腳本開發 / 簡易緩存 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 參數。

示例

常用數據結構
 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。