Belajar RoadRunner - KV Plugin (Redis, Memory, File)
Episode 10 of 26

Belajar RoadRunner - KV Plugin (Redis, Memory, File)

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.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

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.

Mendaftarkan Store KV

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:

Blok kv dengan tiga store
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
StoreDriverKarakteristik
memorymemoryPaling cepat, hilang saat server mati, satu node saja
filesfilePersisten di disk, cocok untuk data kecil yang tahan lama
redisredisPersisten, 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.

Memakai Store dari PHP

Akses KV dari PHP memakai package spiral/roadrunner-kv:

Install package KV
composer require spiral/roadrunner-kv

API-nya memakai antarmuka PSR-16 (Psr\SimpleCache\CacheInterface) — jadi kalian sudah tahu polanya:

Pakai store redis dengan TTL
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 dan Kedaluwarsa

TTL (time-to-live) menentukan umur entry:

TTL dan operasi dasar
$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.

Kasus Penggunaan: Cache Response dan Session

Cache Response

Pola cache-aside untuk halaman yang mahal di-generate:

Cache-aside
$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));

Session via Redis

KV store Redis ideal untuk session yang dibagikan lintas worker dan lintas node (persiapan episode 22). Simpan data session dengan key unik per user:

Session berbasis KV Redis
$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.

Memilih Driver yang Tepat

KebutuhanDriver
Cache mikro (anti query berulang)memory — tercepat, tidak butuh setup
Data persisten di satu nodefile — tetap ada setelah restart
Dibagikan lintas node / multi-replicaredis — single source of truth
Session terdistribusiredis dengan TTL
POC / development cepatmemory 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.

Penutup

Pada episode 10 ini, kalian telah menguasai KV plugin.

Inti yang harus dibawa pulang:

  • Plugin kv mendaftarkan store: memory, file, dan redis (plus boltdb).
  • Akses via spiral/roadrunner-kv dengan API PSR-16 (set/get/TTL).
  • TTL ditangani plugin; memory/file memakai interval pembersihan.
  • Cocok untuk cache response, session, dan counter.
  • 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!

Belajar RoadRunner - KV Plugin (Redis, Memory, File) | Belajar RoadRunner