开始使用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数据库向用户显示结果。
从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-job,因为这会破坏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:希望这很清楚。 也许稍后,当我有空的时候,我可能会更新一些代码段…
如果我想发送消息到谷歌PubSub并使用它的消息。您建议使用Spring cloud GCP库还是只使用Google cloud Java API。 有人能区分这两者吗?或者与谷歌云pubsub库相比,Spring Cloud gcp提供了哪些功能。
一些作为发布的文档。
我正在构建一个事件驱动的微服务架构,它应该是云不可知的(尽可能多)<由于这最初是在GCP中进行的,我不想在配置和所有这些方面花费太长时间,我打算直接将GCP的发布/订阅用于事件队列,并在稍后处理其他云实现,但后来我遇到了Spring云数据流,这看起来很好,因为这些是Spring Boot微服务,我需要一种方法来协调它们 Spring Cloud数据流是否支持Pub Sub作为事件队列? 在配置和设
发布订阅模式 核心点 Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作主题(topic)。 主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscriber) 从主题订阅消息。 主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送。 pub/sub解决了什么样的问题? 耗时的问题,比如上传,格式转换、计算等其他耗
概览 这是 rust1.18 新增的一个语法。在此之前的版本,item 只有 pub/non-pub 两种分类,pub restricted 这个语法用来扩展 pub 的使用,使其能够指定想要的作用域(可见范围),详情参见RFC 1422-pub-restricted.md。 在 Rust 中 crate 是一个模块树,可以通过表达式 pub(crate) item; 来限制 item 只在当前
问题内容: 在pub- sub的情况下,Redis使用什么机制将消息保留在内存中?如果没有客户端订阅,消息将如何处理?Redis会缓冲它们吗?有没有一种配置最小值的方法。和最大 每个通道分配的内存? 问题答案: 在实现(x)中可以看到,Redis不会在Pub / Sub上下文中将消息保留在内存中: 邮件会发送给监听该频道的客户端(如果有), 该消息将发送给正在侦听匹配频道(如果有)的客户端。 然后