Sebuah key di Redis dapat dibuat menetap atau sementara. Key sementara memiliki masa hidup (time to live, TTL) dan dihapus oleh server begitu waktunya habis, sehingga pola ini cocok untuk data yang keabsahannya berbatas waktu seperti sesi login, kode OTP, dan token akses. Topik ini membahas pemasangan masa hidup dengan EXPIRE dan PEXPIRE, praktik utama SET dengan opsi EX, pembacaan sisa waktu dengan TTL dan PTTL, pencabutan masa hidup dengan PERSIST, dua mekanisme penghapusannya, serta jebakan penulisan ulang yang menghapus masa hidup. Seluruh contoh menggunakan awalan key ttl:, sehingga setiap demo dapat dijalankan ulang dengan keluaran yang sama.
Perintah masa hidup#
Perintah EXPIRE memasang masa hidup pada key yang sudah ada dengan durasi dalam satuan detik. Pasangannya, PEXPIRE, melakukan hal yang sama dalam satuan milidetik untuk kebutuhan presisi tinggi. Sisa masa hidup dibaca dengan TTL dalam satuan detik atau PTTL dalam satuan milidetik. Nilai kembalian TTL mengikuti tiga kondisi, yaitu sisa detik pada key yang masih hidup, -1 pada key yang menetap tanpa masa hidup, dan -2 pada key yang tidak ada. EXPIRE mengembalikan 1 apabila masa hidup berhasil dipasang dan 0 apabila key yang dituju tidak ada, tanpa memunculkan pesan error. Tabel berikut merangkum kelima perintah tersebut beserta fungsinya.
| Perintah | Fungsi | Satuan |
|---|---|---|
EXPIRE | memasang masa hidup pada key yang sudah ada | detik |
PEXPIRE | memasang masa hidup pada key yang sudah ada | milidetik |
TTL | membaca sisa masa hidup | detik |
PTTL | membaca sisa masa hidup | milidetik |
PERSIST | mencabut masa hidup agar key menetap | tanpa satuan |
# menyimpan key sesi tanpa masa hidup
redis-cli SET ttl:sesi "dewi"
# memasang masa hidup selama 60 detik pada key yang sudah ada
redis-cli EXPIRE ttl:sesi 60
# membaca sisa masa hidup dalam satuan detik
redis-cli TTL ttl:sesiOK
1
60EXPIRE menjawab 1 karena masa hidup berhasil dipasang, sedangkan TTL melaporkan 60 detik penuh karena pembacaan dilakukan seketika setelah pemasangan. Apabila pembacaan ditunda beberapa detik, angka tersebut bergerak turun secara bertahap hingga mencapai nol. Nilai 0 dari EXPIRE muncul apabila key yang dituju tidak ada, misalnya karena sudah dihapus dengan DEL atau sudah kedaluwarsa.
Menyimpan sekaligus memasang masa hidup#
Praktik utama untuk data sementara adalah memasang nilai dan masa hidup dalam satu perintah SET melalui opsi EX dalam satuan detik atau PX dalam satuan milidetik. Kedua opsi membuat operasi berjalan atomik, yakni pemasangan nilai dan masa hidup berlangsung sebagai satu langkah yang tidak dapat diselingi perintah lain. Pola ini tepat untuk data yang wajib memiliki batas umur sejak awal, misalnya kode OTP yang hanya sah selama lima menit atau sesi login yang masa hidupnya diperbarui pada setiap aktivitas pengguna.
Perintah lama SETEX key seconds value melakukan hal yang sama dan masih berjalan pada Redis 8. Dokumentasi Redis menetapkan SETEX sebagai deprecated sejak versi 2.6.12, yang berarti perintah tersebut sebaiknya diganti pada kode baru. Bentuk penggantinya adalah SET dengan opsi EX, sedangkan SETEX cukup dipertahankan agar kode lama tetap berjalan tanpa perubahan.
# menyimpan kode OTP sekaligus masa hidup 300 detik dalam satu perintah
redis-cli SET ttl:kode-otp "492013" EX 300
# membaca sisa masa hidup kode OTP
redis-cli TTL ttl:kode-otpOK
300Nilai 300 pada TTL menunjukkan masa hidup terpasang tepat pada saat key dibuat. Urutan SET lalu EXPIRE memisahkan langkah yang sama menjadi dua kali perintah. Jeda di antara kedua langkah tersebut menyisakan key yang sudah ada tetapi belum memiliki masa hidup.
Dua mekanisme penghapusan#
Kedaluwarsa pada Redis bersifat logis, karena begitu masa hidup habis, key langsung diperlakukan sebagai tidak ada. Penghapusan fisiknya bekerja melalui dua jalur yang saling melengkapi. Jalur pasif menghapus key pada saat key tersebut diakses, misalnya oleh GET atau EXISTS. Jalur aktif berjalan pada siklus periodik di latar server, yang mengambil sampel acak dari key yang memiliki masa hidup dan menghapus sampel yang sudah kedaluwarsa. Kombinasi keduanya memastikan key yang tidak pernah diakses pun tetap dibersihkan dari memori.
Diagram berikut merangkum siklus hidup key bermasa hidup, dari key aktif hingga dihapus melalui salah satu dari dua jalur tersebut.
Demo berikut memperlihatkan kedaluwarsa nyata pada server. Key ttl:kode-otp dibuat ulang dengan masa hidup satu detik, eksekusi menunggu dua detik, lalu kondisi key diperiksa.
# menyimpan kode OTP baru dengan masa hidup satu detik
redis-cli SET ttl:kode-otp "492013" EX 1
# menunggu dua detik agar masa hidup habis
sleep 2
# key yang sudah kedaluwarsa dilaporkan tidak ada
redis-cli EXISTS ttl:kode-otp
# sisa masa hidup key yang sudah tidak ada dilaporkan -2
redis-cli TTL ttl:kode-otpOK
0
-2EXISTS menjawab 0 dan TTL menjawab -2, yang berarti key hilang tanpa perintah DEL apa pun. Hasil ini berlaku meskipun jalur penghapusan fisiknya belum tentu sudah berjalan, karena key yang kedaluwarsa selalu diperlakukan sebagai tidak ada. Pembacaan GET terhadap key yang sama pun menjawab kosong, sebagaimana key yang tidak pernah dibuat.
Mencabut masa hidup dengan PERSIST#
Masa hidup yang sudah terpasang dapat dicabut dengan PERSIST, sehingga key kembali menjadi key menetap. Perintah ini mengembalikan 1 apabila masa hidup berhasil dicabut dan 0 apabila key tidak ada atau tidak memiliki masa hidup. Kebutuhan semacam ini muncul ketika data sementara ternyata harus dipertahankan lebih lama dari perkiraan awal, misalnya draf catatan rapat yang semula diberi batas penyimpanan tetapi kemudian diarsipkan.
Perpanjangan masa hidup tidak memerlukan PERSIST, karena cukup dilakukan dengan memanggil EXPIRE kembali terhadap key yang sama. Pemanggilan yang baru menggantikan sisa masa hidup lama dengan durasi yang disebutkan. Setelah PERSIST dijalankan, TTL melaporkan -1 kembali, sebagaimana key yang dibuat tanpa masa hidup.
# menyimpan key status dengan masa hidup 60 detik
redis-cli SET ttl:status "berjalan" EX 60
# mencabut masa hidup agar key menetap
redis-cli PERSIST ttl:status
# key tanpa masa hidup dilaporkan -1 oleh TTL
redis-cli TTL ttl:statusOK
1
-1PERSIST menjawab 1 karena masa hidup memang ada sebelumnya, lalu TTL kembali melaporkan -1. Pada key yang tidak ada atau memang tanpa masa hidup, PERSIST menjawab 0 tanpa mengubah apa pun. Kombinasi EXPIRE dan PERSIST memberikan kendali penuh atas masa hidup key, baik saat pemasangan, perpanjangan, maupun pencabutan.
Penulisan ulang yang menghapus masa hidup#
Perilaku paling penting yang perlu diwaspadai adalah hilangnya masa hidup saat key ditulis ulang. Dokumentasi SET menyatakan bahwa masa hidup yang terpasang sebelumnya dibuang pada setiap operasi SET yang berhasil. Key sementara yang rutin diperbarui dengan SET biasa pun berubah menjadi key menetap, meskipun pada penulisan pertamanya diberi opsi EX.
Demo berikut memperlihatkan urutan keliru tersebut. Token akses ditulis dengan masa hidup, ditulis ulang tanpa opsi masa hidup, lalu sisa waktunya diperiksa.
# menyimpan token akses dengan masa hidup 60 detik
redis-cli SET ttl:token "xyz789" EX 60
# masa hidup terpasang dengan benar
redis-cli TTL ttl:token
# menulis ulang token tanpa opsi masa hidup
redis-cli SET ttl:token "xyz789"
# masa hidup lama hilang dan key menetap
redis-cli TTL ttl:tokenOK
60
OK
-1TTL melaporkan -1 setelah penulisan ulang kedua, yang berarti masa hidup 60 detik sebelumnya sudah dibuang. Perbaikannya adalah menyertakan opsi masa hidup pada setiap penulisan, bukan hanya pada penulisan pertama. Apabila masa hidup lama memang ingin dipertahankan, opsi KEEPTTL pada SET menimpa nilai tanpa menyentuh masa hidup yang sudah ada.
# menulis ulang token dengan masa hidup dipasang ulang
redis-cli SET ttl:token "xyz789" EX 60
# sisa masa hidup kembali utuh pada 60 detik
redis-cli TTL ttl:tokenOK
60Ringkasan#
EXPIREdanPEXPIREmemasang masa hidup pada key yang sudah ada dalam satuan detik dan milidetik, sedangkanTTLdanPTTLmembaca sisa waktunya dengan-1untuk key menetap dan-2untuk key tidak ada.SETdengan opsiEXatauPXmenjadi praktik utama karena memasang nilai dan masa hidup secara atomik, sedangkanSETEXberstatus deprecated dan hanya dipertahankan untuk kompatibilitas.PERSISTmencabut masa hidup sehingga key kembali menetap danTTLmelaporkan-1.SETtanpa opsi masa hidup membuang masa hidup lama, sehingga setiap penulisan ulang key sementara harus menyertakanEX,PX, atauKEEPTTL.
Referensi#
- EXPIRE — Redis — Masa hidup key beserta penjelasan dua mekanisme penghapusan key yang kedaluwarsa.
- TTL — Redis
— Arti nilai yang dilaporkan TTL, termasuk
-1dan-2. - SET — Redis
— Opsi masa hidup
EX,PX, danKEEPTTLbeserta perilaku pembuangan masa hidup lama. - PERSIST — Redis — Pencabutan masa hidup key beserta nilai kembaliannya.
- SETEX — Redis — Status deprecated perintah SETEX dan penggantiannya dengan SET beserta opsi EX.