MST

星途 面试题库

面试题:Redis频道订阅退订自动化脚本实现 - 基础实现

请用你熟悉的一种编程语言(如Python、Java等)编写一个简单的脚本,实现对Redis频道的订阅与退订功能。假设已经安装好了相应的Redis客户端库,描述一下脚本实现的主要步骤并给出核心代码。
42.7万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Python 实现

  1. 主要步骤
    • 导入 Redis 客户端库。
    • 连接到 Redis 服务器。
    • 定义订阅和退订函数,在订阅函数中创建 pubsub 对象并订阅指定频道,使用 listen 方法监听消息;在退订函数中通过 pubsub 对象退订频道。
  2. 核心代码
import redis


def subscribe(redis_client, channel):
    pubsub = redis_client.pubsub()
    pubsub.subscribe(channel)
    print(f"已订阅频道 {channel}")
    for message in pubsub.listen():
        if message['type'] =='message':
            print(f"收到消息: {message['data']}")


def unsubscribe(redis_client, channel):
    pubsub = redis_client.pubsub()
    pubsub.unsubscribe(channel)
    print(f"已退订频道 {channel}")


if __name__ == '__main__':
    r = redis.Redis(host='localhost', port=6379, db=0)
    channel_name = 'test_channel'
    subscribe(r, channel_name)
    # 如需退订,可调用如下代码
    # unsubscribe(r, channel_name)

Java 实现

  1. 主要步骤
    • 导入 Redis 客户端库相关依赖。
    • 创建 Redis 连接工厂并获取连接。
    • 定义订阅和退订方法,订阅方法中创建 JedisPubSub 子类实例并使用 subscribe 方法订阅频道;退订方法使用 unsubscribe 方法退订频道。
  2. 核心代码
import redis.clients.jedis.*;
import java.util.concurrent.TimeUnit;


public class RedisSubscriber {
    private Jedis jedis;

    public RedisSubscriber(String host, int port) {
        jedis = new Jedis(host, port);
    }

    public void subscribe(String channel) {
        JedisPubSub jedisPubSub = new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                System.out.println("收到消息: " + message);
            }
        };
        jedis.subscribe(jedisPubSub, channel);
        System.out.println("已订阅频道 " + channel);
    }

    public void unsubscribe(String channel) {
        JedisPubSub jedisPubSub = new JedisPubSub() {};
        jedis.unsubscribe(jedisPubSub, channel);
        System.out.println("已退订频道 " + channel);
    }

    public static void main(String[] args) {
        RedisSubscriber subscriber = new RedisSubscriber("localhost", 6379);
        String channelName = "test_channel";
        subscriber.subscribe(channelName);
        // 如需退订,可调用如下代码
        // subscriber.unsubscribe(channelName);
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        subscriber.jedis.close();
    }
}