Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Triển khai Redis Pub/Sub với Jedis: Hướng dẫn từng bước

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách triển khai hệ thống Redis pub/sub (publish/subscribe) sử dụng thư viện Jedis.

Thư viện Jedis

Jedis là thư viện client Java cho kho dữ liệu Redis. Nó nhỏ gọn, rất dễ sử dụng, và tương thích hoàn toàn với Redis 2.8.x, 3.x.x và các phiên bản mới hơn. Bạn có thể tìm thêm thông tin về thư viện Jedis tại đây.

Hệ thống Redis Pub/Sub

Redis triển khai mô hình messaging Publish/Subscribe. Theo mô hình này, người gửi (publisher) của thông điệp không được lập trình để gửi thông điệp trực tiếp đến một người nhận cụ thể (subscriber). Chúng gửi (publish) thông điệp của mình đến một kênh (channel) cụ thể, mà không biết người nhận nào (nếu có) sẽ tiêu thụ thông điệp. Người nhận, muốn tiêu thụ thông điệp, thể hiện sự quan tâm bằng cách đăng ký (subscribe) một hoặc nhiều kênh, và họ sẽ chỉ nhận được các thông điệp được publish đến những kênh đó, mà không biết người gửi nào đã gửi thông điệp. Bạn có thể tìm thêm thông tin về hệ thống Redis Pub/Sub tại đây.

Thiết lập dự án (Project Setup)

Tạo một dự án Maven đơn giản trong IDE yêu thích và thêm dependency sau vào file pom.xml:

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.0.1</version>
</dependency>

Để lấy phiên bản mới nhất của thư viện Jedis, hãy xem trang này.

Cài đặt Redis

Bạn sẽ cần cài đặt phiên bản mới nhất của Redis. Xem trang này để biết thêm thông tin về cài đặt Redis.

Kết nối Jedis

Tạo một đối tượng Jedis (redis.clients.jedis.Jedis) để kết nối code Java của bạn với Redis.

Jedis jedis = new Jedis();

Nếu bạn đã khởi động một dịch vụ Redis trên máy local và cổng mặc định (6379), constructor mặc định sẽ hoạt động tốt. Ngược lại, bạn phải truyền đúng URL host và số cổng làm đối số vào constructor.

Đăng ký kênh (Subscribe To Channels)

Tạo lớp "ChannelSubscribe", lớp này sẽ đăng ký kênh C1 và C2 bằng cách tạo một client. Client này sẽ nhận thông điệp khi bất kỳ client nào khác publish thông điệp đến kênh C1 hoặc C2.

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class ChannelSubscribe {
    public static void main(String[] args) {
        Jedis jedis = null;
        try {
            /* Tạo đối tượng Jedis để kết nối với Redis server */
            jedis = new Jedis();
            /* Tạo đối tượng JedisPubSub để đăng ký kênh */
            JedisPubSub jedisPubSub = new JedisPubSub() {
                @Override
                public void onMessage(String channel, String message) {
                    System.out.println("Channel " + channel + " has sent a message : " + message);
                    if(channel.equals("C1")) {
                        /* Hủy đăng ký khỏi kênh C1 sau khi nhận tin nhắn đầu tiên. */
                        unsubscribe(channel);
                    }
                }
                @Override
                public void onSubscribe(String channel, int subscribedChannels) {
                    System.out.println("Client is Subscribed to channel : " + channel);
                    System.out.println("Client is Subscribed to " + subscribedChannels + " no. of channels");
                }
                @Override
                public void onUnsubscribe(String channel, int subscribedChannels) {
                    System.out.println("Client is Unsubscribed from channel : " + channel);
                    System.out.println("Client is Subscribed to " + subscribedChannels + " no. of channels");
                }
            };
            /* Đăng ký kênh C1 và C2 */
            jedis.subscribe(jedisPubSub, "C1", "C2");
        } catch(Exception ex) {
            System.out.println("Exception : " + ex.getMessage());
        } finally {
            if(jedis != null) {
                jedis.close();
            }
        }
    }
}

Đầu ra (Output)

Khi bạn chạy lớp "ChannelSubscribe", đầu ra sẽ như sau:

Triển khai Redis Pub/Sub với Jedis: Hướng dẫn từng bước

Publish đến kênh (Publish To Channels)

Tạo lớp "ChannelPublish", lớp này sẽ kết nối đến Redis server bằng Jedis và publish hai thông điệp đến kênh C1 và C2.

import redis.clients.jedis.Jedis;

public class ChannelPublish {
    public static void main(String[] args) {
        Jedis jedis = null;
        try {
            /* Tạo đối tượng Jedis để kết nối với Redis server */
            jedis = new Jedis();
            /* Publish thông điệp đến kênh C1 */
            jedis.publish("C1", "First message to channel C1");
            /* Publish thông điệp đến kênh C2 */
            jedis.publish("C2", "First message to channel C2");
            /* Publish thông điệp đến kênh C1 */
            jedis.publish("C1", "Second message to channel C1");
            /* Publish thông điệp đến kênh C2 */
            jedis.publish("C2", "Second message to channel C2");
        } catch(Exception ex) {
            System.out.println("Exception : " + ex.getMessage());
        } finally {
            if(jedis != null) {
                jedis.close();
            }
        }
    }
}

Đầu ra (Output)

Khi bạn chạy lớp "ChannelPublish", đầu ra trong console ChannelSubscribe sẽ như sau:

Triển khai Redis Pub/Sub với Jedis: Hướng dẫn từng bước

Đăng ký mẫu (Subscribe To Patterns)

Tạo lớp "PatternSubscribe", lớp này sẽ đăng ký mẫu C* và D? bằng cách tạo một client.

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class PatternSubscribe {
    public static void main(String[] args) {
        Jedis jedis = null;
        try {
            /* Tạo đối tượng Jedis để kết nối với Redis server */
            jedis = new Jedis();
            /* Tạo đối tượng JedisPubSub để đăng ký kênh */
            JedisPubSub jedisPubSub = new JedisPubSub() {
                @Override
                public void onPMessage(String pattern, String channel, String message) {
                    System.out.println("Channel " + channel + " has sent a message : " + message + " on pattern " + pattern);
                    if(pattern.equals("C*")) {
                        /* Hủy đăng ký khỏi mẫu C* sau khi nhận tin nhắn đầu tiên. */
                        punsubscribe(pattern);
                    }
                }
                @Override
                public void onPSubscribe(String pattern, int subscribedChannels) {
                    System.out.println("Client is Subscribed to pattern : " + pattern);
                    System.out.println("Client is Subscribed to " + subscribedChannels + " no. of patterns");
                }
                @Override
                public void onPUnsubscribe(String pattern, int subscribedChannels) {
                    System.out.println("Client is Unsubscribed from pattern : " + pattern);
                    System.out.println("Client is Subscribed to " + subscribedChannels + " no. of patterns");
                }
            };
            /* Đăng ký mẫu C* và D? */
            jedis.psubscribe(jedisPubSub, "C*", "D?");
        } catch(Exception ex) {
            System.out.println("Exception : " + ex.getMessage());
        } finally {
            if(jedis != null) {
                jedis.close();
            }
        }
    }
}

Đầu ra (Output)

Khi bạn chạy lớp "PatternSubscribe", đầu ra sẽ như sau:

Triển khai Redis Pub/Sub với Jedis: Hướng dẫn từng bước

Publish đến mẫu (Publish To Patterns)

Tạo lớp "PatternPublish", lớp này sẽ kết nối đến Redis server bằng Jedis và publish thông điệp đến kênh C13, D2, C134, và D3.

import redis.clients.jedis.Jedis;

public class PatternPublish {
    public static void main(String[] args) {
        Jedis jedis = null;
        try {
            /* Tạo đối tượng Jedis để kết nối với Redis server */
            jedis = new Jedis();
            /* Publish thông điệp đến kênh C13 */
            jedis.publish("C13", "Message to channel C13");
            /* Publish thông điệp đến kênh D2 */
            jedis.publish("D2", "Message to channel D2");
            /* Publish thông điệp đến kênh C134 */
            jedis.publish("C134", "Message to channel C134");
            /* Publish thông điệp đến kênh D3 */
            jedis.publish("D3", "Message to channel D3");
        } catch(Exception ex) {
            System.out.println("Exception : " + ex.getMessage());
        } finally {
            if(jedis != null) {
                jedis.close();
            }
        }
    }
}

Đầu ra (Output)

Khi bạn chạy lớp "PatternPublish", đầu ra trong console PatternSubscribe sẽ như sau:

Triển khai Redis Pub/Sub với Jedis: Hướng dẫn từng bước

Tài liệu tham khảo:

  1. Tài liệu lệnh Pub/Sub

Trên đây là tất cả về cách triển khai hệ thống Redis pub/sub sử dụng thư viện Jedis. Nếu bạn thấy hữu ích, hãy chia sẻ suy nghĩ của bạn trong phần bình luận và lan tỏa cho người khác nhé.