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

Redis子/发布和php / nodejs

陆翰藻
2023-03-14
问题内容

开始使用redis作为sub /
pub系统在新项目上工作,以显示mysql数据库的结果。因此,如果有更新,我想将这些更新从mysql发布到我的网页。我的问题是,哪种选择更好?

选项1:是否应该仅通过nodejs和socket.io完成所有这些工作?意思是创建一个连接到redis的nodejs脚本,订阅我需要收听的频道,在nodejs中使用mysql查询数据库以获取更新,如果更新发布了mysql行,则在通过socket.io连接到nodejs的html中获取新数据并对其进行处理以显示结果?

选项2:是否有一个php脚本查询mysql,并使用redis-
php客户端向该频道发布了任何更新?不知道从这里确切还需要设置什么。我仍然需要让nodejs参与此选项吗?

还是我只是基于所有这些工作原理?最重要的是,我想使用redis sub / pub功能通过mysql数据库向用户显示结果。


问题答案:

选项3

当您从PHP更新MySQL时,您会通过redis publish命令将这些更改发布到node.js
(在数据库突变时从PHP发布)。由于Redis的订阅,我可以从node.js实时收到这些更改。然后,我将它们通过socket.io广播给感兴趣的用户。例如publish,您可以引导mysql。例如下面的SQL语句=>
INSERT INTO comments (1, "Hello World")。哪里1有userid之Hello World类的东西,也可能有注释之类的东西。我可能不会将SQL语句发布到该通道,但是可以使用JSON代替,可以从JavaScript(JSON.stringify
/ JSON.parse)和PHP(json_encode / json_decode)轻松使用。

更新资料

您不会执行Cron作业,因为这会破坏Redis
pubpub的目标。以我访问您的网站为例,该网站是的博客http://localhosts。我在阅读了一篇文章http://localhost.com/a.php。在网站下方,您提供了一个表格,我可以使用该表格对该文章发表评论:

a.php

<html>
<head>
    <title>Interesting blog post</title>
</head>
<body>
    <div id="article">This is interesting</div>

    <div id="comments">
        <div class="comment">
            <div class="from">Alfred Said at 22:34</div>
            <div class="message">Hello World</div>
        </div>
    </div>

    <form action="post.php" method="post">
        <label for="name">Your name</label><br />
        <input type="name" id="name" name="name" /><br />

        <label for="message">Your Message:</label><br />
        <textarea id="message" name="message"></textarea>

        <input type="submit" />
    </form>


    <script src='jquery.min.js'></script>
    <script src='http://localhost:8888/socket.io/socket.io.js'></script>
    <script type="text/javascript">
        $(document).ready(function () {
                var socket = io.connect('http://localhost:8888');

                socket.on('message', function (json) {
                    var obj = $.parseJSON(json);
                    alert('in here: ' + obj.name);
                });
        });
    </script>
</body>
</html>

我提交具有action属性的表单http://localhost/postcomment.php。但这是重要的部分!在post.php检索我发布的数据时,使用将其插入MySQL
INSERT INTO comments (1, "Hello World")。当发生这种突变时,您还需要通知不断监听channel的node.js进程mysql

post.php:

<?php

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

require("./Predis.php");
$redis = new Predis\Client();
$obj = array(
    'name'      => $_POST['name'],
    'message'   => $_POST['message']
);

$json = json_encode($obj);
$redis->publish("mysql", $json);

echo $json;

post.php中 需要predis。

带有node_redis的节点代码如下所示:

var redis       = require('redis'),
    subscriber  = redis.createClient(),
    express     = require('express'),
    store       = new express.session.MemoryStore(),
    app         = express.createServer(
        express.bodyParser(),
        express.static(__dirname + '/public'),
        express.cookieParser(),
        express.session({ secret: 'htuayreve', store: store}))
    sio         = require('socket.io');

app.listen(8888, '127.0.0.1',  function () {
    var addr = app.address();
    console.log('app listening on http://' + addr.address + ':' + addr.port);
});

var io = sio.listen(app);

io.configure(function () {
    io.set('log level', 1); // reduce logging
});

io.sockets.on('connection', function (socket) {
    socket.join('mysql');   
    socket.on('disconnect', function () {
    });
});

subscriber.on('message', function (channel, json) {
    // this will always retrieve messages posted to mysql
    io.sockets.in('mysql').json.send(json);
});

subscriber.subscribe('mysql');

该示例取决于以下软件包,您可以通过npm安装

npm install socket.io
npm install redis
npm install express

始终在发布表单post.php,我还将这些更改发布到redis。这部分很重要!由于Redis的pubsub,node.js进程始终收到这些更改。每次当php脚本使数据库发生突变时,您都应该使用将这些更改发布到Redis
publish

PS:希望这很清楚。 也许稍后,当我有空的时候,我可能会更新一些代码段…



 类似资料:
  • 问题内容: 我正在尝试使用nodejs和node_redis构建一个通用的发布/订阅服务器,该服务器接收带有通道名称的浏览器的请求,并以该通道也已发布的任何数据作为响应。为此,我使用了来自浏览器的长轮询请求,并通过在通道上收到消息时发送响应来处理这些请求。 对于每个新请求,都会创建一个对象来订阅该频道(如果且仅当该频道不存在时)。 这是处理订阅渠道的最佳方法,还是还有其他更直观的方法? 问题答案:

  • 主要内容:发布/订阅流程,常用命令汇总,基本命令应用Redis PubSub 模块又称发布订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(即发送方)发送消息,订阅者(即接收方)接收消息,而用来传递消息的链路则被称为  channel。在 Redis 中,一个客户端可以订阅任意数量的 channel(可译为频道)。 消息多播:生产者生产一次消息,中间件负责将消息复制到多个消息队列中,每个消息队列由相应的消费组进行消费,这是分布式系统常用的

  • 我正在开发JDK 1.8,但我不知道为什么“发布”不起作用。Redis“set”命令正在处理数据。 代码段: 从日志调试输出:

  • 目前,我正在开发一个分布式测试执行和报告系统。我计划将Redis PUB/SUB用作消息队列和消息分发系统。 我是Redis的新手,所以我试着阅读尽可能多的文档,并尝试着使用它。最重要的主题之一是高可用性。正如我所说,我不是专家,但我知道可能的选择——使用Sentinel、复制、集群等。 我不清楚的是Pub/Sub功能和HA选项是如何相互关联的。使用Redis构建可靠消息传递系统的最佳实践是什么?

  • 问题内容: 开始使用redis作为sub / pub系统在新项目上工作,以显示mysql数据库的结果。因此,如果有更新,我想将这些更新从mysql发布到我的网页。我的问题是,哪种选择更好? 选项1:是否应该仅通过nodejs和socket.io完成所有这些工作?意思是创建一个连接到redis的nodejs脚本,订阅我需要收听的频道,在nodejs中使用mysql查询数据库以获取更新,如果更新发布了

  • Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2、client5 和 client1 之间的关系: 当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个