Berbagi teknologi

Menerapkan antrian pesan menggunakan Redis: Praktek Daftar, Pub/Sub dan Aliran

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Ringkasan

Redis adalah sistem penyimpanan nilai kunci berkinerja tinggi, dan berbagai struktur datanya menjadikannya pilihan ideal untuk mengimplementasikan antrean pesan. Artikel ini akan mempelajari cara menggunakan struktur data Daftar, Pub/Sub, dan Aliran Redis untuk mengimplementasikan sistem antrean pesan yang efisien.

1. Konsep dasar antrian pesan

Antrian pesan adalah mekanisme komunikasi antar aplikasi yang memungkinkan aplikasi mengirim dan menerima pesan secara asinkron. Ini digunakan dalam sistem terdistribusi untuk memisahkan komponen layanan dan meningkatkan skalabilitas dan keandalan sistem.

2. Keunggulan Redis sebagai antrian pesan

  • kinerja tinggi: Redis adalah operasi berbasis memori dengan kecepatan membaca dan menulis yang sangat cepat.
  • Berbagai struktur data: Mendukung berbagai struktur data seperti Daftar, Set, Pub/Sub, dll., cocok untuk skenario penggunaan yang berbeda.
  • Kegigihan: Mendukung persistensi data dan memastikan pesan tidak hilang.
  • Operasi atom: Mendukung transaksi dan operasi atom untuk memastikan konsistensi operasi antrian pesan.

3. Gunakan Daftar untuk mengimplementasikan antrian pesan

Daftar adalah salah satu struktur data dasar di Redis dan dapat digunakan sebagai antrian pesan sederhana.

3.1 Operasi dasar

  • produsen:menggunakanLPUSHPerintah tersebut menyisipkan pesan ke bagian atas Daftar.
  • konsumen:menggunakanBRPOPPerintah memblokir pesan dari akhir Daftar.

3.2 Contoh implementasi

// 生产者
jedis.lpush("queue", "message");

// 消费者
String message = jedis.brpop(0, "queue");
  • 1
  • 2
  • 3
  • 4
  • 5

4. Gunakan Pub/Sub untuk mengimplementasikan model terbitkan/berlangganan

Pub/Sub adalah penerbitan pesan dan model berlangganan yang dapat mencapai pengiriman pesan satu-ke-banyak.

4.1 Operasi dasar

  • penyiar:menggunakanPUBLISHPerintah tersebut menerbitkan pesan ke saluran tertentu.
  • pelanggan:menggunakanSUBSCRIBEPerintah untuk berlangganan saluran dan menerima pesan.

4.2 Contoh implementasi

// 发布者
jedis.publish("channel", "message");

// 订阅者
jedis.subscribe(new JedisPubSub() {
    @Override
    public void onMessage(String channel, String message) {
        System.out.println("Received: " + message);
    }
}, "channel");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. Gunakan Stream untuk mengimplementasikan antrian pesan

Stream adalah struktur data persisten baru yang diperkenalkan di Redis 5.0, yang dirancang khusus untuk fungsi antrian pesan dan pencatatan.

5.1 Operasi dasar

  • produsen:menggunakanXADDCommand menambahkan pesan ke Stream.
  • konsumen:menggunakanXREADPerintah membaca pesan dari Stream.

5.2 Contoh implementasi

// 生产者
String messageId = jedis.xadd("stream", StreamEntry.entry("field1", "value1"));

// 消费者
List<Map.Entry<String, String>> messages = jedis.xread(StreamsXReadParams.STREAMS.entry("stream", messageId));
  • 1
  • 2
  • 3
  • 4
  • 5

5.3 Gunakan skrip Lua dan Redis Stream untuk mengimplementasikan antrian pesan yang efisien

1. Keuntungan skrip Lua di Redis
  • atomisitas: Skrip Lua dijalankan di dalam Redis, memastikan atomisitas operasi.
  • pertunjukan: Mengurangi jumlah perjalanan bolak-balik jaringan dan meningkatkan efisiensi eksekusi.
  • fleksibilitas: Dapat menulis logika kompleks untuk beradaptasi dengan kebutuhan bisnis yang berbeda.
2. Gunakan skrip Lua untuk mengoperasikan Redis Stream
2.1 Operasi dasar
  • produsen:menggunakanXADDCommand menambahkan pesan ke Stream.
  • konsumen:menggunakanXREADPerintah membaca pesan dari Stream.
  • kelompok konsumen:menggunakanXREADGROUPPerintah tersebut mengimplementasikan fungsi grup konsumen.
2.2 Contoh skrip Lua

Berikut ini adalah contoh skrip Lua sederhana untuk mengimplementasikan operasi dasar produsen dan konsumen.

-- 生产者脚本
local function produce(streamKey, message)
    local result = redis.call('XADD', streamKey, '*', 'message', message)
    return result
end

-- 消费者脚本
local function consume(streamKey, groupName, consumerName)
    local result = redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, 0)
    return result
end

-- 调用脚本
local streamKey = 'myStream'
local message = 'Hello, Redis Stream!'
local groupName = 'myGroup'
local consumerName = 'myConsumer'

-- 生产消息
local messageId = produce(streamKey, message)

-- 消费消息
local messages = consume(streamKey, groupName, consumerName)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3. Penggunaan kelompok konsumen

Grup konsumen adalah fitur Redis Stream yang memungkinkan beberapa instance konsumen mengoordinasikan pekerjaan mereka dan bersama-sama menggunakan pesan di Stream.

3.1 Buat grup konsumen
redis.call('XGROUP', 'CREATE', streamKey, groupName, '$', 'MKSTREAM')
  • 1
3.2 Membaca kelompok konsumen
redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, '>')
  • 1

4. Ringkasan

Menggunakan skrip Lua dan Redis Stream untuk mengimplementasikan antrian pesan dapat memanfaatkan sepenuhnya kinerja tinggi Redis dan atomisitas skrip Lua untuk membangun sistem antrian pesan yang efisien dan andal. Fitur kelompok konsumen semakin meningkatkan ketersediaan dan skalabilitas antrian pesan.

5. Tindakan Pencegahan
  • Pastikan skrip Lua diuji sepenuhnya sebelum dieksekusi.
  • Mempertimbangkan persistensi dan keamanan pesan, konfigurasikan strategi persistensi Redis dengan tepat.
  • Dalam lingkungan produksi, pantau kinerja dan status antrian pesan untuk memastikan pengoperasian sistem yang stabil.
6. Referensi

6. Ringkasan

Redis menyediakan berbagai cara untuk mengimplementasikan antrean pesan, yang masing-masing memiliki skenario yang dapat diterapkan. Daftar cocok untuk persyaratan antrean sederhana, Pub/Sub cocok untuk mode terbitkan/berlangganan, dan Stream menyediakan fungsi antrean pesan yang lebih kuat, termasuk persistensi, grup konsumen, dan fitur lainnya.
Masukkan deskripsi gambar di sini

7. Referensi