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 |
|---|
| 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.