当前位置:  开发笔记 > 编程语言 > 正文

Redis sub/pub和php/nodejs

如何解决《Redissub/pub和php/nodejs》经验,为你挑选了1个好方法。

开始使用redis作为子/ pub系统来处理新项目,以显示mysql db的结果.因此,如果有更新,我想将这些更新从mysql发布到我的网页.我的问题是,哪个选项更好?

选项1:我应该通过nodejs和socket.io完成所有这些工作吗?意思是创建连接到redis的nodejs脚本,订阅我需要监听的通道,使用nodejs中的mysql查询db for updates,如果更新发布mysql行,则通过socket.io获取连接到nodejs的html新数据并处理它以显示结果?

选项2:有一个php脚本查询mysql并使用redis-php客户端发布对该频道的任何更新?不知道还有什么需要从这里设置.我还需要在此选项中使用nodej吗?

或者我只是根据这一切是如何工作的?底线是我想通过mysql数据库向用户显示使用redis sub/pub功能的结果.



1> Alfred..:

选项3

当您从PHP更新MySQL时,您可以通过redis publish命令将这些更改发布到node.js (在更改数据库时从PHP发布).从node.js开始,由于Redis的订阅,我会实时收到这些更改.然后我会通过socket.io将它们广播给感兴趣的用户.你可以举例publish说道mysql.以下面的SQL语句=>为例INSERT INTO comments (1, "Hello World").哪里1是像用户ID,并且Hello World会是这样的评论.我可能不会将SQL语句发布到该通道,但我可以轻松地使用JSON(JSON.stringify/JSON.parse)和PHP(json_encode/json_decode).

更新

你没有运行一个cron-job,因为这会破坏Redis的pubsub的目的.以我为例,访问您的博客网站http://localhosts.我读了一篇文章http://localhost.com/a.php.在网站下方,您提供了一个表单,我可以使用该表单向该文章发表评论:

a.php只会



    Interesting blog post


    
This is interesting
Alfred Said at 22:34
Hello World



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

post.php中:

 $_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:希望这很清楚.也许以后当我有一些时间可用时,我会更新一些可能的小片段...


Redis是一个非常快速的高级键值存储,也有pubsub.Redis使用普通套接字.这意味着它不使用HTTP.我喜欢使用Redis的pubsub以非常快的方式通过套接字与PHP进行通信.将实时更改发送到我们需要socket.io的所有浏览器.我希望这一切都清楚.
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有