Tipe string adalah struktur data paling dasar di Redis, yakni satu nilai biner yang tersimpan pada sebuah key. Topik ini membahas operasi string yang paling sering digunakan, yaitu menyimpan dan membaca nilai dengan SET dan GET, membuat penghitung dengan INCR, menandai keberadaan key dengan SETNX, menulis dan membaca banyak key sekaligus dengan MSET dan MGET, serta menambahkan teks ke akhir nilai dengan APPEND. Setiap pola disertai perintah redis-cli yang dijalankan langsung beserta keluarannya, sehingga perilaku tiap perintah dapat dibandingkan dengan ekspektasi.
Menyimpan dan membaca nilai#
SET menyimpan nilai string pada sebuah key dan menimpa nilai lama apabila key tersebut sudah ada. GET membaca nilai key yang sama, sedangkan DEL menghapus key beserta nilainya. Apabila key yang diminta tidak ada, GET mengembalikan balasan nil dan bukan pesan error, sehingga pemeriksaan keberadaan key sering dilakukan hanya dengan membacanya. Nilai string di Redis bersifat binary-safe, artinya teks biasa, angka, maupun deret byte apa pun dapat disimpan apa adanya hingga batas 512 megabyte per nilai.
# menyimpan nilai pada key
redis-cli set string:status "aktif"
# membaca nilai kembali
redis-cli get string:status
# membaca key yang belum pernah dibuat
redis-cli get string:tidak-adaOK
aktifPada contoh tersebut, baris ketiga kosong karena GET mengembalikan nil untuk key yang tidak ada.
Penghitung dengan INCR#
INCR menambah nilai pada sebuah key sebesar satu, lalu mengembalikan nilai setelah ditambah. Operasi ini bersifat atomik, yakni penambahan dilakukan sepenuhnya oleh server tanpa jeda baca lalu tulis di sisi klien. Dua klien yang memanggil INCR pada key yang sama secara bersamaan tetap memperoleh nilai kembalian yang berbeda dan tidak saling menimpa, sehingga pola ini cocok untuk penghitung kunjungan, jumlah unduhan, atau pembatas laju. Sebenarnya Redis menyimpan nilai itu sebagai string, dan penafsirannya sebagai bilangan bulat baru dilakukan ketika INCR dipanggil. INCRBY menambah sebesar argumen yang diberikan, sementara INCR pada key yang belum ada memperlakukan nilainya sebagai 0 sehingga hasil pertamanya adalah 1. Agar keluaran contoh tetap sama pada setiap eksekusi, contoh berikut menimpa nilai menjadi 0 sebelum menaikkannya.
# menimpa nilai agar penghitung selalu mulai dari 0
redis-cli set string:kunjungan 0
# menaikkan penghitung dua kali
redis-cli incr string:kunjungan
redis-cli incr string:kunjungan
# menaikkan sebesar 98 sekaligus
redis-cli incrby string:kunjungan 98
# membaca akhir dari penghitung
redis-cli get string:kunjunganOK
1
2
100
100Flag dengan SETNX#
SETNX menyimpan nilai hanya apabila key belum ada, singkatan dari set if not exists. Balasannya bernilai 1 apabila penyimpanan berhasil dan 0 apabila key sudah ada sehingga penulisan diabaikan. Pola ini menghasilkan flag yang dijamin hanya ditulis satu kali, misalnya penanda bahwa inisialisasi aplikasi sudah dilakukan atau penanda bahwa suatu pekerjaan sudah diambil. Karena pemeriksaan dan penulisan dilakukan dalam satu langkah atomik di server, dua klien yang berlomba menulis pada key yang sama hanya menghasilkan satu pemenang. Pola yang sama menjadi dasar bagi lock terdistribusi yang dibahas pada modul pola aplikasi.
# menyiapkan key contoh agar keadaan awal selalu sama
redis-cli set string:bendera 1
# menghapus key supaya SETNX diuji dari keadaan kosong
redis-cli del string:bendera
# berhasil karena key belum ada
redis-cli setnx string:bendera 1
# diabaikan karena key sudah ada
redis-cli setnx string:bendera 1
# memastikan nilai pertama yang tersimpan
redis-cli get string:benderaOK
1
1
0
1Penulisan batch dengan MSET dan MGET#
MSET menyimpan beberapa pasangan key dan nilai dalam satu perintah, sedangkan MGET membaca beberapa key dalam satu perintah dan mengembalikan nil untuk key yang tidak ada. Keduanya mengurangi jumlah permintaan jaringan secara signifikan apabila aplikasi menyentuh banyak key dalam satu alur kerja. Penulisan pada MSET juga bersifat atomik, sehingga tidak mungkin sebagian key baru tersimpan sementara yang lain belum. Pasangan key dan nilai pada MSET dituliskan berurutan, dan key yang sudah ada akan ditimpa tanpa pesan kesalahan.
# menyimpan tiga key dalam satu perintah
redis-cli mset string:artikel:1 "Menyimpan data" string:artikel:2 "Struktur key" string:artikel:3 "Persistensi"
# membaca tiga key sekaligus ditambah satu key yang tidak ada
redis-cli mget string:artikel:1 string:artikel:2 string:artikel:3 string:artikel:99OK
Menyimpan data
Struktur key
PersistensiMenambah teks dengan APPEND#
APPEND menambahkan teks di akhir nilai yang tersimpan dan mengembalikan panjang nilai setelah penambahan, dihitung dalam byte. Apabila key belum ada, APPEND berperilaku sama seperti SET dan menciptakan key tersebut. Pola ini cocok untuk menyusun catatan secara bertahap atau menambah potongan baris log kecil tanpa membaca dan menulis ulang seluruh nilainya. Perlu diingat bahwa panjang dihitung dalam byte, sehingga karakter non-ASCII dapat lebih panjang daripada jumlah karakter yang tampak di layar.
# nilai awal catatan
redis-cli set string:alarm "Alarm 06:30"
# menambah potongan pertama
redis-cli append string:alarm ", lantai dua"
# menambah potongan kedua
redis-cli append string:alarm ", prioritas tinggi"
# membaca catatan utuh
redis-cli get string:alarmOK
23
41
Alarm 06:30, lantai dua, prioritas tinggiKesalahan umum#
Kesalahan pertama adalah memanggil INCR pada nilai yang bukan angka. Redis menafsirkan nilai sebagai bilangan bulat saat perintah penghitung dipanggil, sehingga nilai “banyak” memicu error seperti pada contoh berikut. Perbaikannya adalah menyimpan angka sebelum menghitung, atau mengembalikan nilai awal dengan SET.
# menyimpan nilai yang bukan angka
redis-cli set string:kunjungan "banyak"
# INCR menolak nilai tersebut
redis-cli incr string:kunjungan
# memulihkan nilai awal
redis-cli set string:kunjungan 0
# penghitung berjalan kembali
redis-cli incr string:kunjunganOK
ERR value is not an integer or out of range
OK
1Kesalahan kedua adalah menganggap APPEND menimpa nilai, padahal APPEND selalu menambah di akhir nilai. Gunakan SET apabila nilai lama ingin diganti sepenuhnya. Kesalahan ketiga adalah menafsirkan balasan nil sebagai error. Balasan nil berarti key tidak ada, dan bukan tanda kegagalan perintah, sehingga alur aplikasi dapat langsung melanjutkan logika pembuatan nilai baru.
Ringkasan#
- SET menimpa nilai lama dan GET mengembalikan nil apabila key belum ada, bukan pesan error.
- INCR, INCRBY, dan SETNX diproses atomik oleh server sehingga aman dipanggil bersamaan oleh banyak klien.
- MSET dan MGET menulis serta membaca banyak key dalam satu permintaan jaringan.
- APPEND menambah teks di akhir nilai dan mengembalikan panjang baru dalam byte.
Referensi#
- Strings — Redis — Dokumentasi tipe data string beserta perintah-perintah utamanya.
- INCR — Redis — Dokumentasi perintah INCR beserta perilaku atomiknya.
- APPEND — Redis — Dokumentasi perintah APPEND dan nilai kembalian panjangnya.