当前位置: 首页 > 面试题库 >

当数据值更改时,如何将redis PUBLISH / SUBSCRIBE与nodejs一起使用来通知客户端?

令狐增
2023-03-14
问题内容

我正在使用NodeJS和Redis编写事件驱动的发布/订阅应用程序。我需要一个如何在Redis中的数据值更改时通知Web客户端的示例。


问题答案:

OLD仅使用参考

依存关系

使用express,socket.io,node_redis,最后但并非最不重要的是使用media fire中的示例代码

安装node.js + npm(非root)

首先,你应该(如果你还没有这样做还)安装的node.js+NPM在30秒(以正确的方式,因为你应该 运行NPM作为 ):

echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh

安装依赖

在安装node + npm之后,您应该通过以下命令安装依赖项:

npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)

下载样本

您可以从mediafire下载完整样本。

解压缩包

unzip pbsb.zip # can also do via graphical interface if you prefer.

拉链里面有什么

./app.js

const PORT = 3000;
const HOST = 'localhost';

var express = require('express');

var app = module.exports = express.createServer();

app.use(express.staticProvider(__dirname + '/public'));

const redis = require('redis');
const client = redis.createClient();

const io = require('socket.io');

if (!module.parent) {
    app.listen(PORT, HOST);
    console.log("Express server listening on port %d", app.address().port)

    const socket  = io.listen(app);

    socket.on('connection', function(client) {
        const subscribe = redis.createClient();
        subscribe.subscribe('pubsub'); //    listen to messages from channel pubsub

        subscribe.on("message", function(channel, message) {
            client.send(message);
        });

        client.on('message', function(msg) {
        });

        client.on('disconnect', function() {
            subscribe.quit();
        });
    });
}

./public/index.html

<html>
<head>
    <title>PubSub</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="/javascripts/jquery-1.4.3.min.js"></script>
</head>
<body>
    <div id="content"></div>
    <script>    
        $(document).ready(function() {
            var socket = new io.Socket('localhost', {port: 3000, rememberTransport: false/*, transports: ['xhr-polling']*/});
            var content = $('#content');

            socket.on('connect', function() {
            });

            socket.on('message', function(message){
                content.prepend(message + '<br />');
            }) ;

            socket.on('disconnect', function() {
                console.log('disconnected');
                content.html("<b>Disconnected!</b>");
            });

            socket.connect();
        });
    </script>
</body>
</html>

启动服务器

cd pbsb    
node app.js

启动浏览器

最好是如果您启动googlechrome(因为有websockets支持,但不是必需的)。造访http://localhost:3000以查看示例(开始时您除了PubSub标题以外什么都看不到)。

但是在publish频道上pubsub您应该会看到一条消息。下面我们发布"Hello world!"到浏览器。

从./redis-cli

publish pubsub "Hello world!"


 类似资料:
  • null null 消息客户端-REST资源: 消息客户端-MessageClient: 保存消息的message server引导类具有与客户端相同的注释。 null null

  • 我想使用Apache连接器和Jersey 2.3客户端进行HTTPS连接。 我尝试了以下方法: 但是,sslContext似乎被忽略,因为服务器的证书被拒绝为不受信任(sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径) 如果删除“.withConfig(clientConfig)”部分,SSL连接可

  • 关于这个线程的后续:Woocommerce退款电子邮件 我有一个问题我似乎无法解决,我阅读了所有关于扩展WC_Email类的主题,该类具有自定义触发器,但我无法使其工作。 我想要实现的是添加一个电子邮件通知到WooCommerce电子邮件设置,并发送一封电子邮件给收件人,只要客户更新它的帐单或运输细节。 因此,在functions.php中,我将woocommerce_customer_save_

  • 问题内容: 我正在建立一个自助餐厅管理系统,其中有两种类型的用户;客户和柜台所有者。 对于自助餐厅中提供的每道菜,都有一个与之相关的独特的dish.id。 到现在为止,我有一个类似圆顶的东西,例如学生向带有URL的POST请求发送一个带有菜品,标识和计数器编号的POST请求,该URL更新“ orders table”(以PK作为ID)。准备好菜品后,柜台所有者按“已废除” ”按钮。 在这一点上,我

  • 问题内容: 我在C#/ Visual Studio 2008中使用MySQL。我需要知道任何方法,以便如果一个用户更新数据库,则通过网络通知所有已登录用户已发生更改。如果我通过我的应用程序登录数据库,那时候数据库中最新记录的序列号是10,然后我有特权的人更新了数据库中的记录,同时我收到通知,数据库已更新为新记录。常见的例子可能是MSN Messenger的一个朋友上线时向他发出警报的提示……虽然我

  • 我想知道是否可以在Firebase在特定实体上添加一个新的子实体时向android移动设备发送推送通知。例如,假设Firebase上有一个名为tasks的实体。每当一个新任务添加到firebase集合中时,就会触发“child_added”事件,然后以某种方式向移动客户端发送推送通知。触发器是child_added事件。但是,我不确定从Firebase事件发送推送通知是否可行。