Cara menggunakan Redis Streams

Roshan Kumar adalah manajer produk senior di Redis Labs.

Redis, database multi-model dalam memori, populer untuk banyak kasus penggunaan. Ini termasuk cache konten, penyimpanan sesi, analitik real-time, perantara pesan, dan streaming data. Tahun lalu saya menulis tentang cara menggunakan Redis Pub / Sub, List, dan Sorted Sets untuk pemrosesan streaming waktu nyata. Sekarang, dengan hadirnya Redis 5.0, Redis memiliki struktur data baru yang dirancang untuk mengelola aliran.

Dengan struktur data Redis Streams, Anda dapat melakukan lebih banyak hal daripada yang dapat dilakukan dengan Pub / Sub, List, dan Sorted Sets. Di antara banyak manfaat, Redis Streams memungkinkan Anda melakukan hal berikut:

  • Kumpulkan data dalam jumlah besar yang tiba dengan kecepatan tinggi (satu-satunya hambatan adalah I / O jaringan Anda);
  • Membuat saluran data antara banyak produsen dan banyak konsumen;
  • Kelola konsumsi data Anda secara efektif bahkan ketika produsen dan konsumen tidak beroperasi pada kecepatan yang sama;
  • Pertahankan data saat konsumen Anda offline atau terputus;
  • Berkomunikasi antara produsen dan konsumen secara asinkron;
  • Skala jumlah konsumen Anda;
  • Menerapkan keamanan data seperti transaksi ketika konsumen gagal di tengah konsumsi data; dan
  • Gunakan memori utama Anda secara efisien.

Bagian terbaik dari Redis Streams adalah bahwa itu ada di dalam Redis, jadi tidak ada langkah tambahan yang diperlukan untuk menerapkan atau mengelola Redis Streams. Dalam artikel ini, saya akan memandu Anda memahami dasar-dasar penggunaan Redis Streams. Kita akan melihat bagaimana kita dapat menambahkan data ke aliran, dan bagaimana kita dapat membaca data itu (semuanya sekaligus, secara asinkron, saat data itu diterima, dll.) Untuk memenuhi berbagai kasus penggunaan konsumen.

Dalam dua artikel mendatang di sini, saya akan membahas cara kerja kelompok konsumen Redis Streams, dan saya akan menunjukkan aplikasi yang berfungsi yang menggunakan Redis Streams.

Pahami aliran data di Redis Streams

Redis Streams menyediakan struktur data "hanya tambahkan" yang tampak mirip dengan log. Ini menawarkan perintah yang memungkinkan Anda untuk menambahkan sumber ke aliran, menggunakan aliran, dan memantau serta mengelola bagaimana data dikonsumsi. Struktur data Streams fleksibel, memungkinkan Anda menghubungkan produsen dan konsumen dengan beberapa cara.

Redis Labs

Gambar 1 menunjukkan penggunaan dasar Redis Streams. Produsen tunggal bertindak sebagai sumber data, dan konsumennya adalah aplikasi perpesanan yang mengirimkan data ke penerima yang relevan.

Redis Labs

Pada Gambar 2, aliran data umum dikonsumsi oleh lebih dari satu konsumen. Dengan Redis Streams, konsumen dapat membaca dan menganalisis data dengan kecepatan mereka sendiri.

Dalam aplikasi berikutnya, yang ditunjukkan pada Gambar 3, segalanya menjadi sedikit lebih kompleks. Layanan ini menerima data dari beberapa produsen, dan menyimpan semuanya dalam struktur data Aliran Redis. Aplikasi ini memiliki beberapa konsumen yang membaca data dari Redis Streams, serta kelompok konsumen, yang mendukung konsumen yang tidak dapat beroperasi pada tingkat yang sama seperti produsen.

Redis Labs

Tambahkan data ke aliran dengan Redis Streams

Diagram pada Gambar 3 hanya menunjukkan satu cara untuk menambahkan data ke Redis Stream. Meskipun satu atau lebih produsen dapat menambahkan data ke struktur data, data baru selalu ditambahkan ke akhir aliran.

Metode default untuk menambahkan data

Ini adalah cara termudah untuk menambahkan data ke Redis Streams:

XADD mystream * nama Anna

XADD mystream * nama Bert

XADD mystream * nama Cathy

Dalam perintah ini, XADD adalah perintah Redis, mystream adalah nama aliran, Anna, Bert, dan Cathy adalah nama yang ditambahkan di setiap baris, dan operator * memberi tahu Redis untuk membuat pengenal secara otomatis untuk setiap baris. Perintah ini menghasilkan tiga entri mystream:

1518951481323-0 nama Cathy

1518951480723-0 nama Bert

1518951480106-0 nama Anna

Menambahkan data dengan ID yang dikelola pengguna untuk setiap entri

Redis memberi Anda opsi untuk mempertahankan pengenal Anda sendiri untuk setiap entri (lihat di bawah). Meskipun ini mungkin berguna dalam beberapa kasus, biasanya lebih mudah mengandalkan ID yang dibuat secara otomatis.

XADD mystream 10000000 nama Anna

XADD mystream 10000001 nama Bert

XADD mystream 10000002 nama Cathy

Ini menghasilkan entri mystream berikut:

10000002-0 nama Cathy

10000001-0 nama Bert

10000000-0 nama Anna

Menambah data dengan batas maksimal

Anda dapat membatasi streaming Anda dengan jumlah entri maksimum:

XADD mystream MAXLEN 1000000 * nama Anna

XADD mystream MAXLEN 1000000 * nama Bert

XADD mystream MAXLEN 1000000 * nama Cathy

Perintah ini mengusir entri yang lebih lama ketika aliran mencapai panjang sekitar 1.000.000.

Tip: Redis Streams menyimpan data di node makro dari pohon radix. Setiap node makro memiliki beberapa item data (biasanya, dalam kisaran beberapa puluh). Menambahkan perkiraan nilai MAXLEN seperti yang ditunjukkan di bawah ini menghindari keharusan memanipulasi node makro untuk setiap penyisipan. Jika beberapa puluh angka - misalnya, apakah 1000000 atau 1000050 - membuat sedikit perbedaan bagi Anda, Anda dapat mengoptimalkan kinerja Anda dengan memanggil perintah dengan karakter perkiraan (~).

XADD mystream MAXLEN ~ 1000000 * nama Anna

XADD mystream MAXLEN ~ 1000000 * nama Bert

XADD mystream MAXLEN ~ 1000000 * nama Cathy

Konsumsi data dari aliran dengan Redis Streams

Struktur Redis Streams menawarkan serangkaian perintah dan fitur yang kaya untuk menggunakan data Anda dalam berbagai cara.

Baca semuanya dari awal streaming

Situasi: Aliran sudah memiliki data yang Anda butuhkan untuk diproses, dan Anda ingin memproses semuanya dari awal.

Perintah yang akan Anda gunakan untuk ini adalah XREAD, yang memungkinkan Anda membaca semua atau N entri pertama dari awal aliran. Sebagai praktik terbaik, membaca data halaman demi halaman merupakan ide yang baik. Untuk membaca hingga 100 entri dari awal streaming, perintahnya adalah:

XREAD COUNT 100 STREAMS mystream 0

Dengan asumsi 1518951481323-0 adalah ID terakhir dari item yang Anda terima di perintah sebelumnya, Anda dapat mengambil 100 entri berikutnya dengan menjalankan:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Konsumsi data secara asinkron (melalui panggilan pemblokiran)

Situasi: Konsumen Anda mengonsumsi dan memproses data lebih cepat daripada kecepatan penambahan data ke aliran.

Ada banyak kasus penggunaan di mana konsumen membaca lebih cepat daripada produsen menambahkan data ke aliran Anda. Dalam skenario ini, Anda ingin konsumen menunggu dan diberi tahu saat data baru tiba. Opsi BLOK memungkinkan Anda untuk menentukan lamanya waktu menunggu data baru: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Di sini, XREAD mengembalikan semua data setelah 1518951123456-1. Jika tidak ada data setelah itu, kueri akan menunggu N = 60 detik hingga data baru tiba, dan kemudian waktu habis. Jika Anda ingin memblokir perintah ini tanpa batas, panggil XREAD sebagai berikut:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Catatan : Dalam contoh ini, Anda juga bisa mengambil data halaman demi halaman dengan menggunakan perintah XRANGE. 

Baca hanya data baru setelah diterima

Situasi: Anda tertarik untuk memproses hanya kumpulan data baru mulai dari titik waktu saat ini.

Saat Anda membaca data berulang kali, sebaiknya mulai ulang dari bagian terakhir yang Anda tinggalkan. Misalnya, pada contoh sebelumnya, Anda melakukan panggilan pemblokiran untuk membaca data yang lebih besar dari 1518951123456-1. Namun, untuk memulainya, Anda mungkin tidak tahu ID terbaru. Dalam kasus seperti itu, Anda dapat mulai membaca aliran dengan tanda $, yang memberi tahu perintah XREAD untuk hanya mengambil data baru. Karena panggilan ini menggunakan opsi BLOKIR dengan 60 detik, panggilan ini akan menunggu hingga ada beberapa data di aliran.

XREAD BLOCK 60000 STREAMS mystream $

Dalam kasus ini, Anda akan mulai membaca data baru dengan opsi $. Namun, Anda tidak boleh melakukan panggilan berikutnya dengan opsi $. Misalnya, jika 1518951123456-0 adalah ID dari data yang diambil dalam panggilan sebelumnya, panggilan Anda berikutnya harus:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Iterasi aliran untuk membaca data sebelumnya

Situasi: Aliran data Anda sudah memiliki cukup data, dan Anda ingin menanyakannya untuk menganalisis data yang dikumpulkan sejauh ini.

Anda dapat membaca data antara dua entri baik dalam arah maju atau mundur menggunakan XRANGE dan XREVRANGE. Dalam contoh ini, perintah membaca data antara 1518951123450-0 dan 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE juga memungkinkan Anda membatasi jumlah item yang dikembalikan dengan bantuan opsi COUNT. Misalnya, kueri berikut mengembalikan 10 item pertama di antara dua interval. Dengan opsi ini, Anda dapat melakukan iterasi melalui aliran seperti yang Anda lakukan dengan perintah SCAN:

XRANGE mystream 1518951123450-0 1518951123460-0 COUNT 10

Saat Anda tidak mengetahui batas bawah atau atas dari kueri Anda, Anda bisa mengganti batas bawah dengan - dan batas atas dengan +. Misalnya, kueri berikut mengembalikan 10 item pertama dari awal streaming Anda:

XRANGE mystream - + COUNT 10

Sintaks untuk XREVRANGE mirip dengan XRANGE, kecuali Anda membalik urutan batas bawah dan atas Anda. Misalnya, kueri berikut mengembalikan 10 item pertama dari akhir aliran Anda dalam urutan terbalik:

XREVRANGE mystream + - COUNT 10

Partisi data di antara lebih dari satu konsumen

Situasi: Konsumen mengonsumsi data Anda jauh lebih lambat daripada produsen yang memproduksinya.

Dalam kasus tertentu, termasuk pemrosesan gambar, pembelajaran mendalam, dan analisis sentimen, konsumen bisa menjadi sangat lambat jika dibandingkan dengan produsen. Dalam kasus ini, Anda mencocokkan kecepatan data yang tiba ke data yang dikonsumsi dengan menyebarkan konsumen Anda dan mempartisi data yang dikonsumsi oleh masing-masing.

Dengan Redis Streams, Anda dapat menggunakan grup konsumen untuk melakukannya. Jika lebih dari satu konsumen menjadi bagian dari sebuah grup, Redis Streams akan memastikan bahwa setiap konsumen menerima sekumpulan data eksklusif.

XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream>

Tentu saja, masih banyak yang perlu dipelajari tentang cara kerja kelompok konsumen. Grup konsumen Redis Streams dirancang untuk mempartisi data, memulihkan dari bencana, dan memberikan keamanan data transaksi. Saya akan menjelaskan semua ini di artikel saya berikutnya di sini.

Seperti yang Anda lihat, mudah untuk memulai dengan Redis Streams. Cukup unduh dan instal Redis 5.0 dan selami tutorial Redis Streams di situs web proyek.

Roshan Kumar adalah manajer produk senior di  Redis Labs . Dia memiliki pengalaman luas dalam pengembangan perangkat lunak dan pemasaran teknologi. Roshan telah bekerja di Hewlett-Packard dan banyak perusahaan rintisan Silicon Valley yang sukses termasuk ZillionTV, Salorix, Alopa, dan ActiveVideo. Sebagai programmer yang antusias, dia merancang dan mengembangkan mindzeal.com, platform online yang menyelenggarakan kursus pemrograman komputer untuk siswa muda. Roshan memegang gelar sarjana dalam ilmu komputer dan MBA dari Santa Clara University.

-

Forum Teknologi Baru menyediakan tempat untuk mengeksplorasi dan mendiskusikan teknologi perusahaan yang sedang berkembang secara mendalam dan luas. Pemilihan ini subjektif, berdasarkan pilihan teknologi yang kami yakini penting dan paling menarik bagi pembaca. tidak menerima jaminan pemasaran untuk publikasi dan berhak untuk mengedit semua konten yang dikontribusikan. Kirim semua pertanyaan ke  [email protected] .