node.js - 使用 Redis 模式订阅

标签 node.js redis publish-subscribe

我正在开发 NodeJS 应用程序。

我是 redis 的新手,我昨天才安装它,但我希望能够发布此数据并从另一个进程订阅它。

假设我有以下数据:

    var Exchanges = [
        {
            _id: 'tsx',
            name: 'Toronto Stock Exchange',
            data: {
                instrument: [
                    {
                        symbol: 'MBT'
                        markPrice: 0,
                    }, 
                    {
                        symbol: 'ACQ'
                        markPrice: 0,
                    }
                ],
                orderBooks: [
                    {
                        symbol: 'MBT',
                        bids: [],
                        asks: [],
                    },
                    {
                        symbol: 'ACQ',
                        bids: [],
                        asks: [],
                    }
                ],
                trades: [
                    {
                        timestamp: "2014-11-06T20:53:00.000Z",
                        symbol: "MBT",
                        side: "Buy",
                        size: 0,
                        price: 352.80,
                    },
                    {
                        timestamp: "2014-11-06T20:53:00.000Z"
                        symbol: "ACQ",
                        side: "Sell",
                        size: 0,
                        price: 382.90,
                    }
                ],
            },
        }, 
        {
            _id: 'nyse',
            name: 'New York Stock Exchange',
            data: {
                instrument: [
                    {
                        symbol: 'IBM'
                        markPrice: 0,
                    }, 
                    {
                        symbol: 'WMT'
                        markPrice: 0,
                    }
                ],
                orderBooks: [
                    /* Orderbook Data Here */
                ],
                trades: [
                    /* Trades Data Here */
                ],
            },
        }
    ];

我用类似的东西保存它:

    exchange.websocket_conn.on('message', function (updateData) {
        // Use 'updateData' (a diff) to update exchange.data object.
        // ...

        // Then
        redisClient.hmset(exchange._id.toString(), exchange.data);

        redisClient.publish(exchange._id.toString(), exchange.data);
    });

这有效并且确实发布了数据,但是我一直在阅读有关“PSUBSCRIBE”的内容,我想知道是否可以进一步分割:

我希望能够做类似的事情:

    someOtherRedisClient.subscribe('tsx');
    // Receive All Data from the Exchange Whenever Anything Changes.

    someOtherRedisClient.subscribe('tsx.instrument');
    // Receive 'Instrument' array of All Instruments on Exchange when any Instrument Changes.

    someOtherRedisClient.subscribe(tsx.instrument:MBT');
    // Get Back Only the 'MBT' Instrument Whenever It Changes.

是否可以使用“模式订阅”功能来实现这一点?

谢谢,

最佳答案

我会将一个大的 JSON 分解成许多 JSON,每种类型的内容一个,例如

  • 第 1 级(例如,最后交易价格、最佳出价/要价)
  • 订单簿
  • 交易

并为每个主题创建一个单独的主题,例如

  • mktdata:tsx:level1:MBT 将具有 TSX 交易所 MBT 的市场价格
  • mktdata:tsx:orderbook:MBT 是 TSX 交易所 MBT 的订单簿
  • mktdata:tsx:trades:MBT 可能是所有交易,但由于交易量,更有可能更好地用作通知客户进行单独查询以获取最后 N列表中需要的交易

您没有说明您正在向 Redis 中写入多少工具,或者有多少不同的客户端应用程序正在使用数据,但假设您没有大量工具,您确实可以使用 PSUBSCRIBE 获取所有订单簿整个交易所的更新等。给定一个符号列表,您还可以订阅一长串 channel (例如 mktdata:tsx:level1:MBT mktdata:tsx:orderbook:MBT mktdata:tsx:level1:ACQ),它可以运行到几十/几百没有问题。

关于node.js - 使用 Redis 模式订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066190/

相关文章:

javascript - node.js 函数返回未定义的值

node.js - 可扩展的 Node 快速路线

java - 如何确保在 Redis 出现故障时释放 Radisson 锁?

c - ZMQ、PUB/SUB、删除 "sleep"时丢失消息

javascript - 使用 Node.js 和 Express 发布时如何访问请求正文?

node.js - 如何在 React 15.6.0 上正确使用 PropTypes?

java - JAVA 中的 BSON 消息映射

redis - 存储非常大的数据列表

multithreading - Apache kafka消息调度和负载均衡

python - 使用 Graphite 烯和 Python 的订阅类示例