Ini adalah catatan minggu ke-2 dari apa yang saya pelajari di kelas RU202-nya Redis University yang berjudul "Redis Streams".
Pada minggu ke-2 ini topik pembahasannya adalah:
- Producer
- Range Queries
- The Consumer
1. Producer
Pada bagian ini dijelaskan panjang lebar mengenai stream producer, disini saya rangkum saja kedalam beberapa poin dibawah ini:
- Stream Producer adalah software/aplikasi yang berperan sebagai pengirim data kedalam stream.
- Data di dalam stream disebut sebagai 'message'.
- Stream Producer menggunakan Redis Client API untuk memasukkan message kedalam stream.
- Pada Redis CLI, kita bisa menggunakan perintah
XADD stream_name message_id field value [field_2 value_2 ... field_n value_n]
untuk menambahkan message kedalam stream. Contoh untuk mengirim data temperatur kedalam stream:XADD temperature * celcius 39
.
Message ID
- Untuk generate message ID secara otomatis, gunakan
*
(seperti contoh diatas). - Message ID tidak dapat diubah.
-
Contoh message ID hasil generate:
1566533258158-0
1566533258158
: millisecond-timestamp.0
: sub-millisecond-sequence, jika terdapat pesan dalam millisecond-timestamp yang sama, maka angka ini bertambah. Dan angka ini akan 0 kembali pada millisecond-timestamp yang berbeda.
-
Contoh membuat message ID secara manual:
XADD mystream 100 x 1
.- Message ID harus berupa unsigned integer (paling kecil 0).
- Hasil ID digenerate:
100-0
dimana0
adalah urutan dari id100
. - Catatan: setelah menambahkan message dengan ID 100 kedalam stream mystream, maka kita tidak dapat menambahkan message dengan ID dibawah 100 kedalam stream mystream tersebut.
Message Payload
- Message payload pada Redis Stream memiliki struktur data seperti hash (
Map<String, String>
). - Tidak ada batasan berapa field yang dapat disimpan didalam setiap message.
-
Redis akan secara otomatis melakukan kompresi pada nama field di stream yang sama, contoh:
XADD coordinates * latitude 0.1 longitude 1.0
XADD coordinates * latitude 0.2 longitude 1.0
XADD coordinates * latitude 0.3 longitude 1.1
- Pada 3 perintah
XADD
diatas, maka redis tidak akan menyimpan nama fieldlatitude
danlongitude
pada 2 perintahXADD
bawahnya. - Tapi, jika perintah
XADD
selanjutnya memiliki field yang berbeda, entah ditambah field baru, atau ada field yang berubah, maka redis akan menyimpan nama field message tersebut secara utuh.
Managing the Length of a Stream
Untuk membatasi banyaknya message pada stream supaya tidak terlalu bengkak, dapat gunakan beberapa cara berikut:
- Gunakan
XADD
denganMAXLEN
. ContohXADD mystream * foo bar MAXLEN 1000
, maka jika ini adalah message yang ke-1001, message paling lama akan dihapus sehingga jumlah messagenya menjadi 1000. - Gunakan perintah
XDEL
. Cara ini tidak dianjurkan karena tidak efektif. - Gunakan perintah
XTRIM
. ContohXTRIM mystream MAXLEN 1000
, maka message ke 1001 sampai dengan yang paling lama akan dihapus.
Yang saya masih bingung setelah melakukan proses diatas, message pada stream memang betul akan hilang,
dalam artian ketika kita gunakan XRANGE mystream - +
message yang terhapus tidak lagi muncul. Tetapi saat digunakan MEMORY USAGE mystream
, memori yang terpakai masih sama. Dia ngasih tau sih memang saat menghapus message pada stream, message tidak secara langsung hilang, melainkan hanya diberi flag "deleted". Cuma yang masih belum saya tau, kapan memori tersebut benar-benar dihapus?
Selain cara diatas, sebetulnya ada cara lain yang disarankan, yaitu menggunakan XTRIM mystream MAXLEN ~ 1000
, atau XADD mystream * foo bar MAXLEN ~ 1000
, ini penjelasan mereka tentang tanga ~
:
The ~ argument between the MAXLEN option and the actual count means that the user is not really requesting that the stream length is exactly 1000 items, but instead it could be a few tens of entries more, but never less than 1000 items. When this option modifier is used, the trimming is performed only when Redis is able to remove a whole macro node. This makes it much more efficient, and it is usually what you want.
Kenapa saya tidak masukkan cara ini di list, karena saya belum mengerti betul cara kerja si ~
itu.
Disitu tertulis "could be a few tens of entries more", jadi saya coba buat stream dengan 100 message, dengan harapan setelah saya coba XTRIM mystream MAXLEN ~ 10
maka akan menghapus mystream
menjadi 10-50 message (few tens more). Tapi ternyata tidak terjadi apa-apa, XLEN mystream
masih tetap 100.
Entahlah, mungkin kalau messagenya ribuan bakal dihapus. Mungkin.
2. Range Queries
Untuk mengambil message dalam range ID tertentu, dapat menggunakan perintah XRANGE
dan XREVRANGE
. Perbedaannya adalah XRANGE
akan mengambil message dan mengurutkannya secara ascending (dari paling awal), XREVRANGE
akan mengambil message dan mengurutkannya secara descending (dari paling akhir).
Berikut contoh-contoh penggunaan XRANGE
dan XREVRANGE
:
# Beberapa cara mengambil semua message di dalam mystream
XRANGE mystream - +
XRANGE mystream 0-0 +
# Mengambil semua message dari 1526985054069-0 s/d data terakhir di dalam mystream
XRANGE mystream 1526985054069-0 +
# Mengambil semua message diantara 1526985054069-0 s/d 1531243452312-0 terakhir di dalam mystream
XRANGE mystream 1526985054069-0 1531243452312-0
# Mengambil 10 message PERTAMA dari mystream
XRANGE mystream - + COUNT 10
# Mengambil 10 message TERAKHIR dari mystream
XREVRANGE mystream + - COUNT 10
Tanda -
dan +
adalah special ID, -
adalah alias untuk ID awal (0-0), sedangkan +
adalah alias untuk ID terakhir (18446744073709551615-18446744073709551615).
3. The Consumer
Untuk men-consume data pada stream, dapat menggunakan perintah XREAD
. Berikut adalah beberapa contoh penggunaan XREAD
.
XREAD COUNT 1 STREAMS mystream