Mempelajari plugin KV RoadRunner untuk penyimpanan key-value: mendaftarkan store berbasis Redis, Memory, dan File, memakai API cache dengan TTL lewat package spiral/roadrunner-kv, serta memilih driver yang tepat untuk cache dan session.

Setelah di episode 7 kita memakai RPC dan di episode 9 belajar observability, pada episode kali ini kita memakai RPC untuk hal paling praktis: menyimpan data. Plugin KV RoadRunner menyediakan penyimpanan key-value (seperti Redis) yang bisa dipakai untuk cache, session, rate-limit counter, dan data cepat lainnya — diakses dari PHP tanpa mengelola koneksi Redis sendiri.
Mengapa episode ini penting? Karena di aplikasi long-running, "state" tidak boleh hidup di memory worker (itu topik episode 14). Semua state lintas-request harus hidup di store eksternal — dan KV adalah store pertama yang paling sering kalian pakai.
Plugin KV mendukung beberapa driver: memory, file, boltdb, dan redis. Setiap store punya nama bebas (di bawah blok kv), dan kalian bisa punya banyak store sekaligus:
kv:
memory:
driver: memory
config:
interval: 60
persistent: false
files:
driver: file
config:
dir: /tmp/kv-files
interval: 60
redis:
driver: redis
config:
addr: 127.0.0.1:6379
password: ""
db: 0
timeout: 10
ttl: 0| Store | Driver | Karakteristik |
|---|---|---|
memory | memory | Paling cepat, hilang saat server mati, satu node saja |
files | file | Persisten di disk, cocok untuk data kecil yang tahan lama |
redis | redis | Persisten, dibagikan lintas node, punya TTL dan expiry asli |
interval pada driver memory/file adalah detik pembersihan entry yang sudah kedaluwarsa (TTL). persistent: false berarti data hilang saat server restart.
Akses KV dari PHP memakai package spiral/roadrunner-kv:
composer require spiral/roadrunner-kvAPI-nya memakai antarmuka PSR-16 (Psr\SimpleCache\CacheInterface) — jadi kalian sudah tahu polanya:
use Spiral\RoadRunner\KeyValue\Factory;
$factory = new Factory($rpc);
$cache = $factory->select('redis');
$cache->set('user:42:profile', $profileData, 3600);
$cached = $cache->get('user:42:profile');
if ($cached === null) {
$cached = $db->queryProfile(42);
$cache->set('user:42:profile', $cached, 3600);
}select('redis') memilih store sesuai nama di config. Karena seluruh penyimpanan ditangani plugin Go via RPC, worker PHP tidak memegang koneksi Redis sendiri — hemat resource pool.
Note
Nilai yang disimpan bisa berupa array/objek — package KV men-serialize secara otomatis. Tetapi untuk struktur besar, pertimbangkan menyimpan JSON string agar lebih mudah dibaca tool eksternal (misal saat debug di Redis CLI).
TTL (time-to-live) menentukan umur entry:
$cache->set('key', 'value', 120); // kedaluwarsa 120 detik
$cache->set('key', 'value', null); // tanpa kedaluwarsa
$cache->setMultiple([
'a' => 1,
'b' => 2,
], 60);
$values = $cache->getMultiple(['a', 'b']);
$cache->delete('a');
$cache->clear();Perhatikan bahwa TTL yang disimpan server-side (Redis) atau di dalam store file (interval pembersihan). Store memory memakai interval untuk membersihkan entry lama; selama belum dibersihkan, get() tetap bisa mengembalikan data kedaluwarsa pada driver memory/file bila interval belum terlewat — desain ini membuatnya sangat cepat.
Pola cache-aside untuk halaman yang mahal di-generate:
$key = 'page:' . md5($request->getUri()->getPath());
$html = $cache->get($key);
if ($html === null) {
$html = renderExpensivePage($request);
$cache->set($key, $html, 300);
}
$psr7->respond(new Response(200, [], $html));KV store Redis ideal untuk session yang dibagikan lintas worker dan lintas node (persiapan episode 22). Simpan data session dengan key unik per user:
$sessionId = $request->getCookieParams()['session'] ?? bin2hex(random_bytes(16));
$key = 'session:' . $sessionId;
$data = $cache->get($key) ?? [];
$data['user_id'] = 42;
$cache->set($key, $data, 1800);Karena session hidup di Redis, worker mana pun di pool (atau node mana pun) bisa membaca session — tidak ada sticky session yang dipaksa.
| Kebutuhan | Driver |
|---|---|
| Cache mikro (anti query berulang) | memory — tercepat, tidak butuh setup |
| Data persisten di satu node | file — tetap ada setelah restart |
| Dibagikan lintas node / multi-replica | redis — single source of truth |
| Session terdistribusi | redis dengan TTL |
| POC / development cepat | memory atau file |
Warning
Store memory dan file (dengan persistent: false) tidak dibagikan antar instance RoadRunner. Bila kalian menjalankan banyak replica (episode 22), hanya store redis yang aman dipakai untuk data yang harus konsisten lintas node.
Pada episode 10 ini, kalian telah menguasai KV plugin.
Inti yang harus dibawa pulang:
kv mendaftarkan store: memory, file, dan redis (plus boltdb).spiral/roadrunner-kv dengan API PSR-16 (set/get/TTL).redis satu-satunya yang konsisten lintas node.Di episode 11 selanjutnya, kita belajar queue & jobs plugin — memproses pekerjaan background seperti email dan laporan lewat driver Redis, AMQP, dan SQS, membangun pipeline job, serta menulis consumer worker yang ack/reject task. Sampai jumpa di episode 11!