Redis 发布订阅(Pub/Sub)是一种轻量级的消息通信模式,广泛应用于实时消息推送、聊天系统、消息广播等场景。本文详细介绍在 CentOS 系统上如何安装、配置 Redis 并实现发布订阅功能,提供多种编程语言的实战代码示例。
一、环境准备
在开始之前,请确保你已拥有一台 CentOS 服务器。
二、安装 Redis
通过 yum 官方源安装 Redis,适用于 CentOS 7/8:
sudo yum install epel-release
sudo yum install redis
三、启动并验证 Redis 服务
安装完成后,启动 Redis 服务并设置为开机自启动:
sudo systemctl start redis
sudo systemctl enable redis
验证服务运行状态:
sudo systemctl status redis
如果看到 active (running) 字样,说明 Redis 已正常运行。
四、发布订阅基础操作
Redis 自带 redis-cli 命令行工具,可以直接进行发布订阅测试。
4.1 订阅频道
在第一个终端窗口执行:
redis-cli subscribe my_channel
4.2 发布消息
在第二个终端窗口向同一频道发布消息:
redis-cli publish my_channel 'Hello, Redis!'
订阅端的终端窗口将实时收到该消息。Pub/Sub 支持同时订阅多个频道,也支持按模式(pattern)批量订阅。
五、编程语言实战示例
5.1 Python 示例(redis-py)
Python 环境下使用 redis-py 库实现订阅:
import redis
# 连接 Redis 服务器
r = redis.Redis(host='localhost', port=6379, db=0)
# 创建发布者
pub = r
pub.publish('my_channel', 'Hello from Python!')
# 创建订阅者
pubsub = r.pubsub()
pubsub.subscribe('my_channel')
for message in pubsub.listen():
if message['type'] == 'message':
print(f"收到消息: {message['data'].decode('utf-8')}")
安装依赖:
pip install redis
5.2 Node.js 示例(ioredis)
Node.js 环境使用 ioredis 库:
const Redis = require('ioredis');
const redis = new Redis();
// 订阅频道
redis.subscribe('my_channel', (err, count) => {
if (!err) {
console.log(`已订阅 ${count} 个频道`);
}
});
// 发送消息
redis.publish('my_channel', 'Hello from Node.js!');
// 接收消息
redis.on('message', (channel, message) => {
console.log(`频道 ${channel} 收到: ${message}`);
});
安装依赖:
npm install ioredis
5.3 Java 示例(Jedis)
Java 环境使用 Jedis 客户端:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class RedisPubSubDemo {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 订阅频道
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("收到消息: " + message);
}
}, "my_channel");
}
}
六、Redis 发布订阅与 Kafka/RabbitMQ 的区别
| 特性 | Redis Pub/Sub | Kafka | RabbitMQ |
|---|---|---|---|
| 消息持久化 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| 消息堆积 | 无 | 堆积能力强 | 堆积能力强 |
| 延迟 | 超低 | 低 | 低 |
| 适用场景 | 实时消息、简单广播 | 大数据流处理 | 企业级消息队列 |
| 实现复杂度 | 极低 | 高 | 中 |
对于需要消息持久化和可靠传输的生产环境,建议使用 Kafka 或 RabbitMQ;对于简单的实时消息推送和系统间解耦,Redis Pub/Sub 是性价比最高的选择。
七、常见问题排查
Q:订阅后收不到消息?
A:检查 Redis 服务是否正常运行(systemctl status redis),以及订阅频道名称是否完全一致。
Q:生产环境可以用 Redis Pub/Sub 吗?
A:适合对可靠性要求不高的实时消息场景。如果需要消息持久化和重试机制,建议配合其他消息队列使用。
Q:如何查看当前活跃的频道?
A:Redis 本身不提供直接查看所有活跃频道的命令,订阅者断开连接后频道自动消失。可以通过监控客户端连接数来判断:redis-cli info clients。
八、总结
Redis 发布订阅配置简单、学习曲线低,是实现实时通信功能的理想工具。本文覆盖了从安装部署到多语言代码实战的全流程,建议读者在本地环境中亲手实践各个步骤,快速掌握这一实用技能。