如何用Node.js自动检测Redis新值并实时获取Ruby写入的数据
用Redis发布/订阅(Pub/Sub)实现Ruby写入后Node.js实时获取数据
嘿,我之前也碰到过类似的需求,轮询监控Redis虽然能凑合用,但不仅有延迟还浪费资源——其实Redis自带的发布/订阅(Pub/Sub)模式就是为这种实时场景设计的,完美解决你的问题!
一、修改Ruby写入脚本:写完数据后发布通知
在你的Ruby脚本完成Redis数据写入后,新增一行代码向指定Redis频道发布更新通知(可以把要获取的键名作为消息内容,方便Node.js精准获取数据):
require 'redis' # 初始化Redis连接 redis = Redis.new(host: 'localhost', port: 6379) # 原有写入逻辑 target_key = "user:123:profile" new_data = "updated_user_info" redis.set(target_key, new_data) # 新增:发布更新通知到频道 redis.publish('data_update_channel', target_key)
二、修改Node.js脚本:订阅频道并实时获取数据
Node.js这边需要用Redis客户端订阅对应的频道,一旦收到通知就立刻去Redis拉取数据。注意:订阅模式下的Redis客户端不能执行其他读写命令,所以要单独创建一个订阅客户端和一个普通业务客户端:
这里以常用的redis npm包(v4版本)为例:
const redis = require('redis'); // 创建两个独立的Redis客户端:一个用于订阅通知,一个用于读写数据 const subscriber = redis.createClient({ host: 'localhost', port: 6379 }); const dataClient = redis.createClient({ host: 'localhost', port: 6379 }); // 订阅指定频道 async function initSubscription() { try { await subscriber.connect(); await dataClient.connect(); await subscriber.subscribe('data_update_channel', async (message) => { // 收到通知后,根据消息里的键名获取数据 console.log(`收到更新通知,目标键:${message}`); const latestData = await dataClient.get(message); console.log('实时获取到的数据:', latestData); // 这里写你的业务处理逻辑 }); console.log('已成功订阅数据更新频道,等待通知...'); } catch (err) { console.error('Redis连接/订阅失败:', err); } } initSubscription(); // 监听客户端错误 subscriber.on('error', (err) => console.error('订阅客户端错误:', err)); dataClient.on('error', (err) => console.error('数据客户端错误:', err));
额外注意事项
- 如果你的场景需要持久化消息(比如Node.js重启后不想错过之前的更新),Pub/Sub模式就不够用了,这时候可以改用Redis的Stream数据结构,它支持消息持久化和消费组,适合更复杂的实时场景。
- 确保Ruby和Node.js的Redis客户端都连接到同一个Redis实例,频道名称要完全一致。
内容的提问来源于stack exchange,提问作者user8116786
相关产品推荐
相关产品推荐

