使用Redis模式订阅

时间:2016-03-17 16:19:44

标签: 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.

可以使用'Pattern Subscribe'功能来实现这个目标吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

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

  • 第1级(例如最后交易价格,最佳买/卖)
  • 订购簿
  • 交易

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

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

你没有说你在Redis上写了多少乐器,或者有多少不同的客户应用程序正在使用这些数据,但假设你没有大量的乐器,你确实可以使用PSUBSCRIBE来获取所有的订单给定一个符号列表你也可以订阅一长串的符号(例如mktdata:tsx:level1:MBT mktdata:tsx:orderbook:MBT mktdata:tsx:level1:ACQ),它可以运行到几十/几百毫无问题。