Redis
 sql >> база данни >  >> NoSQL >> Redis

Redis sub/pub и php/nodejs

Опция 3

Когато актуализирате MySQL от PHP, вие публикувате тези промени в node.js чрез redis publish команда (публикуване от PHP при мутиране на база данни). От node.js бих получил тези промени в реално време благодарение на абонамента на Redis. Тогава просто бих ги излъчил на заинтересовани потребители чрез 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, защото това би погубило целта извън pubsub на Redis. Вземете например аз посещавам вашия уебсайт, който е блог на 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>

Изпращам формуляра, който има атрибут за действие http://localhost/postcomment.php . Но това е важната част! В post.php вие извличате данните, които публикувах и ги вмъквате в MySQL с помощта на INSERT INTO comments (1, "Hello World") . Когато се случи тази мутация, вие също трябва да информирате процеса 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 изисква предис.

Кодът на възела с 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. Тази част е важна! Процесът node.js винаги получава тези промени благодарение на pubsub на Redis. Всеки път, когато php скрипт мутира базата данни, трябва да публикувате тези промени в Redis с publish .

P.S:Надявам се това да е ясно. Може би по-късно, когато имам свободно време, ще актуализирам с може би малък фрагмент...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. как да получа всички ключове и стойности в redis в javascript?

  2. Коя NoSQL база данни за изключително големи обеми данни

  3. Какво прави Redis, когато паметта му свърши?

  4. как да проверя версията на екземпляра на redis?

  5. как да използвам nestjs redis microservice?