Episode ini membahas cara menjalankan logika kompleks di server Redis secara atomik: EVAL dan EVALSHA untuk Lua scripting dengan conditional logic, serta Redis Functions di Redis 7 yang mendaftarkan function secara permanen untuk dipanggil dengan FCALL.

MULTI/EXEC di episode 9 hanya bisa menjalankan deretan perintah tanpa logika. Tapi bagaimana jika kalian butuh keputusan di dalam batch — misalnya "kurangi stok hanya jika stok masih cukup, lalu catat pesanan"? Episode 10 ini menjawab dengan Lua scripting dan Redis Functions.
Lua scripting memindahkan logika aplikasi ke dalam server Redis, dieksekusi secara atomik tanpa interupsi. Redis Functions (Redis 7+) menyempurnakannya dengan pendaftaran permanen di server. Ini salah satu kemampuan yang membuat Redis begitu powerful untuk rate limiting, distributed lock, dan counter presisi tinggi.
Lua dipilih karena ringan, cepat, dan mudah di-embed. Ketika sebuah script Lua dijalankan, seluruh script berjalan atomik — tidak ada perintah lain yang menyela di tengah jalan, seperti MULTI/EXEC namun dengan logika conditional, variabel, dan loop. Ini tidak bisa dilakukan transaksi biasa.
redis-cli EVAL "return redis.call('GET', KEYS[1])" 1 user:1:nameredis-cli EVAL "return redis.call('GET', KEYS[1])" 1 user:1:name mengeksekusi script Lua yang memanggil GET. Di dalam script, redis.call() menjalankan perintah Redis, KEYS[1] mengambil key pertama, dan ARGV[1] mengambil argumen non-key.
Inilah kekuatan utamanya — logika keputusan di dalam server:
local stok = tonumber(redis.call('GET', KEYS[1]))
if not stok or stok < tonumber(ARGV[1]) then
return -1
end
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1Script di atas membaca stok, mengecek kecukupannya, dan hanya mengurangi jika aman — semuanya atomik. Panggil lewat EVAL:
redis-cli EVAL "local s = tonumber(redis.call('GET', KEYS[1])); if not s or s < tonumber(ARGV[1]) then return -1 end; redis.call('DECRBY', KEYS[1], ARGV[1]); return 1" 1 stock:sku-1 2Script mengembalikan 1 jika berhasil, -1 jika stok kurang — hasil keputusan bisnis langsung dari server, tanpa perlu lock di sisi aplikasi.
Mengirim script penuh setiap kali boros. EVALSHA memakai SHA1 hash dari script yang sudah dikirim sekali:
redis-cli SCRIPT LOAD "return 1"
redis-cli EVALSHA <sha1_hasil_load> 0SCRIPT LOAD menyimpan script dan mengembalikan hashnya, lalu EVALSHA memanggil script via hash — menghemat bandwidth. Pola client: SCRIPT LOAD sekali, lalu EVALSHA terus-menerus; jika hash belum dikenal (error NOSCRIPT), fallback ke EVAL.
Danger
Script Lua yang panjang dan mahal akan memblokir seluruh server selama dieksekusi — sama seperti perintah lambat lainnya. Jaga script tetap singkat, dan gunakan SCRIPT KILL hanya jika eksekusi tidak menulis apa pun.
Redis 7 memperkenalkan Redis Functions: mendaftarkan function secara permanen di server. Bedanya dengan EVAL: script didaftarkan sekali (FUNCTION LOAD), lalu dipanggil kapan saja dengan FCALL tanpa perlu mengirim ulang script atau menangani hash. Function juga punya nama yang jelas dan library yang terorganisir.
#!lua name=mylib
redis.register_function('increment', function(keys, args)
return redis.call('INCRBY', keys[1], args[1])
end)Baris #!lua name=mylib mendeklarasikan library bernama mylib, lalu redis.register_function mendaftarkan function increment yang bisa dipanggil kapan saja.
redis-cli -x FUNCTION LOAD < script.lua
redis-cli FCALL mylib.increment 1 counter 5FUNCTION LOAD < script.lua mendaftarkan script ke server (opsi -x membaca dari stdin). Setelah terdaftar, FCALL mylib.increment 1 counter 5 memanggil function kapan pun dibutuhkan — tanpa mengirim ulang script, dan function tetap ada meski ada client baru.
| Aspek | EVAL/EVALSHA | Redis Functions |
|---|---|---|
| Registrasi | Per client, via hash | Permanen di server |
| Pemanggilan | EVALSHA + hash | FCALL + nama function |
| Manajemen | Manual, per aplikasi | Terpusat, terorganisir per library |
| Cocok untuk | Script sekali pakai | Logika bisnis reusable |
Untuk produksi, preferensikan Redis Functions: script didefinisikan sekali, mudah di-version, dan tidak bergantung pada state tiap client.
Episode 10 membekali kalian Lua scripting dan Redis Functions: EVAL untuk eksekusi atomik dengan conditional logic, EVALSHA untuk menghemat bandwidth via hash, serta FUNCTION LOAD/FCALL untuk mendaftarkan function permanen di Redis 7.
Inti yang harus dibawa pulang:
redis.call() menjalankan perintah Redis dari dalam script.EVALSHA menghemat bandwidth dengan memakai hash script.FCALL memanggil function tanpa mengirim ulang script.Di episode 11 selanjutnya kita membahas Caching Strategies & Design Patterns — bagaimana Redis dipakai di dunia nyata. Kalian akan belajar Cache-Aside, Write-Through, dan Write-Behind, kebijakan eviction allkeys-lru dan allkeys-lfu, rate limiter dengan Sorted Set, distributed lock ala Redlock, serta pola session store. Lanjut!