You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:12:27