Lewati ke isi

Pengembangan Skrip / Cache Sederhana DFF.CACHE

DFF.CACHE adalah cache sementara berbasis Redis, dengan struktur scope + key -> value, cocok untuk penghitung, antrean, set, dan publikasi pesan ringan.

Jika perlu mempertahankan tipe JSON atau menyimpan status aplikasi berskala kecil secara persisten, gunakan DFF.STORE.

Perbedaan Utama

  • Nilai skalar yang dibaca biasanya berupa string; Anda perlu memanggil int(...), float(...), atau json.loads(...) sesuai jenis bisnis.
  • Secara default, scope adalah ID Script saat ini; saat berbagi data antar Script, Anda harus secara eksplisit meneruskan scope yang sama.
  • Setiap Key dan Topic publikasi diisolasi berdasarkan Scope; nama Key yang dikembalikan tidak menyertakan prefiks Scope internal.
  • hstrlenall(...) mengembalikan {field: panjang byte value}; satuannya adalah byte, bukan jumlah karakter Unicode.

Referensi Cepat API

Key

Metode Deskripsi
type(key, scope=None) Mengembalikan tipe data Key
keys(pattern='*', scope=None) Mengembalikan Key yang cocok
exists(key, scope=None) Mengecek apakah Key ada
expire(key, expires, scope=None) Mengatur sisa waktu kedaluwarsa dalam detik
expireat(key, timestamp, scope=None) Mengatur waktu kedaluwarsa sebagai stempel waktu UNIX dalam hitungan detik
ttl(key, scope=None) / pttl(key, scope=None) Mengembalikan sisa waktu kedaluwarsa, masing-masing dalam detik dan milidetik
rename(key, new_key, scope=None) Mengganti nama Key
renamenx(key, new_key, scope=None) Mengganti nama Key hanya jika target tidak ada
delete(key, scope=None) Menghapus satu Key, atau meneruskan daftar / tuple untuk menghapus massal
delete_pattern(pattern, scope=None) Menghapus Key yang cocok; pattern wajib diisi

String

Metode Deskripsi
set(key, value, expires=None, not_exists=False, exists=False, scope=None) Menulis nilai, dapat membatasi status keberadaan Key dan durasi kedaluwarsa dalam detik
mset(key_values, scope=None) Menulis massal; tidak mendukung pengaturan waktu kedaluwarsa secara bersamaan
get(key, scope=None) / DFF.CACHE(key, scope=None) Membaca satu nilai
mget(keys, scope=None) Membaca massal
get_pattern(pattern, scope=None) Mengembalikan {key: value} yang cocok
getset(key, value, scope=None) Menulis nilai baru dan mengembalikan nilai lama
incr(key, step=1, scope=None) / incrby(key, step, scope=None) Menambah nilai integer

Hash

Metode Deskripsi
hkeys(key, pattern='*', with_values=False, scope=None) Mengembalikan field yang cocok; jika with_values=True, juga mengembalikan nilai
hset(key, field, value, not_exists=False, scope=None) Menulis field
hsetnx(key, field, value, scope=None) Menulis hanya jika field tidak ada
hmset(key, field_values, scope=None) Menulis field secara massal
hget(key, field, scope=None) Membaca field
hstrlen(key, field, scope=None) / hstrlenall(key, scope=None) Mengembalikan panjang byte dari satu nilai field atau semua nilai field
hmget(key, fields, scope=None) Membaca field secara massal
hgetall(key, scope=None) Membaca semua field dan nilai
hincr(key, field, step=1, scope=None) / hincrby(key, field, step, scope=None) Menambah nilai field integer
hdel(key, field, scope=None) Menghapus satu field, atau meneruskan daftar / tuple untuk menghapus massal

List

Metode Deskripsi
lpush(key, value, scope=None) / rpush(key, value, scope=None) Mendorong satu nilai atau daftar nilai dari kiri / kanan
lpop(key, count=None, scope=None) / rpop(key, count=None, scope=None) Mengeluarkan satu atau beberapa nilai dari kiri / kanan
blpop(key, timeout=0, scope=None) / brpop(key, timeout=0, scope=None) Pop pemblokiran
rpoplpush(key, dest_key=None, scope=None, dest_scope=None) Mengeluarkan dari kanan daftar sumber dan mendorong ke kiri daftar tujuan
brpoplpush(key, dest_key=None, timeout=0, scope=None, dest_scope=None) Pop dan push pemblokiran
llen(key, scope=None) Mengembalikan panjang daftar
lrange(key, start=0, stop=-1, scope=None) Mengembalikan rentang yang ditentukan
ltrim(key, start, stop, scope=None) Hanya mempertahankan rentang yang ditentukan

blpop(...) dan brpop(...) mengembalikan [nama kunci asli, value], dan mengembalikan [None, None] saat waktu habis. rpoplpush(...) dan brpoplpush(...) akan menggunakan kunci sumber jika kunci tujuan dihilangkan; dest_scope dapat digunakan untuk perpindahan lintas Scope yang eksplisit.

Set

Metode Deskripsi
sadd(key, member, scope=None) / srem(key, member, scope=None) Menambahkan / menghapus satu anggota atau daftar anggota
scard(key, scope=None) Mengembalikan jumlah anggota
smembers(key, scope=None) Mengembalikan semua anggota
sismember(key, member, scope=None) Memeriksa apakah anggota ada

ZSet

Metode Deskripsi
zadd(key, member_scores, scope=None) / zrem(key, member, scope=None) Menambahkan / menghapus anggota
zcard(key, scope=None) Mengembalikan jumlah anggota
zrange(key, start=0, stop=-1, with_scores=False, scope=None) Mengembalikan anggota berdasarkan posisi
zrangebyscore(key, min_score='-inf', max_score='+inf', with_scores=False, scope=None) Mengembalikan anggota berdasarkan skor
zpop_below_all(key, score, scope=None) / zpop_above_all(key, score, scope=None) Mengeluarkan semua anggota yang skornya tidak lebih tinggi / tidak lebih rendah dari skor yang ditentukan
zpop_below_lpush_all(key, dest_key, score, scope=None) / zpop_above_lpush_all(key, dest_key, score, scope=None) Mengeluarkan anggota yang memenuhi kondisi skor, lalu mendorongnya ke daftar tujuan

Sebelum menjalankan ekstensi pop atau pemindahan ZSet, pastikan kunci sumber, kunci tujuan, dan batas skor.

Publikasi dan Referensi Dinamis

Metode Deskripsi
publish(topic, message, scope=None) Mempublikasikan pesan ke Topic dengan prefiks Scope
ref(key, scope=None, default=None) Membuat referensi tertunda untuk parameter DFF.API yang mendukung pengambilan nilai dinamis

Jika scope dihilangkan dalam ref(...), akan digunakan Scope REF khusus. String, List, Hash, Set, dan ZSet masing-masing akan menggunakan operasi baca yang sesuai untuk menyelesaikan referensi. Referensi hanya digunakan untuk parameter delayed_cron_job, timeout, expires, dan queue pada DFF.API.

Contoh

Struktur Data Umum
 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'))

Catatan Penggunaan

  • Operasi pemblokiran harus mengatur timeout yang wajar, agar Func tidak mengalami waktu habis.
  • Sebelum menjalankan delete_pattern(...), periksa dulu item yang cocok menggunakan keys(...).
  • Hindari memanggil hstrlenall(...) pada Hash yang sangat besar agar tidak memblokir layanan cache bersama.
  • Topic pada publish(...) memiliki prefiks Scope; subscriber harus menggunakan konvensi Scope yang konsisten.
  • Saat beberapa Script berbagi data, scope harus diteruskan secara eksplisit.