这是我的代码使用socket.io作为WebSocket和后端与pub/sub redis.
var io = io.listen(server),
buffer = [];
var redis = require("redis");
var subscribe = redis.createClient(); **<--- open new connection overhead**
io.on('connection', function(client) {
console.log(client.request.headers.cookie);
subscribe.get("..", function (err, replies) {
});
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length > 15) buffer.shift();
client.send(msg);
});
client.on('message', function(message){
});
client.on('disconnect', function(){
subscribe.quit();
});
});
Run Code Online (Sandbox Code Playgroud)
每个新的io请求都将创建新的redis连接.如果有人用100个标签打开浏览器,那么redis客户端将打开100个连接.它看起来不太好看.
如果cookie相同,是否可以重用redis连接?因此,如果有人打开许多浏览器标签,也将其视为开放1连接.
我看到了这个片段:
io.sockets.on('connection', function(socket) {
const subscribe = redis.createClient();
const publish = redis.createClient();
socket.on('publish', function(channel, data) {
publish.publish(channel, data);
});
socket.on('psubscribe', function(channel) {
subscribe.psubscribe(channel);
});
subscribe.on("pmessage", function(pattern, channel, message) {
socket.emit('message', { channel: channel, data: message });
});
});
Run Code Online (Sandbox Code Playgroud)
$(".action").click(function() {
socket.emit('publish', 'game.#{gameid}.action.' + $(this).data('action'),
JSON.stringify({ nick: "#{nick}", ts: Date.now() })
);
Run Code Online (Sandbox Code Playgroud)
而我想知道为什么?Socket.IO有没有自己的广播机制?为什么选择Redis'Pub-Sub over Socket.IO?我们不能这样做:
io.sockets.on('connection', function(socket) {
socket.on('action', function(channel, data) {
socket.broadcast.to(channel).emit(data)
});
});
Run Code Online (Sandbox Code Playgroud)
如果有理由使用Redis,那么有什么好处呢?持久性?
我的目标是构建一个聊天应用程序 - 类似于 whatsapp
据我了解,socket.io 是一个用 javascript 编写的实时通信库,使用起来非常简单
例如
// Serverside
io.on('connection', function(socket) {
socket.on('chat', function(msg) {
io.emit('chat', msg);
});
});
// ClientSide (Using jquery)
var socket = io();
$('form').submit(function(){
socket.emit('chat', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat', function(msg){
$('#messages').append($('<li>').text(msg));
});
Run Code Online (Sandbox Code Playgroud)
1)我是否总是需要启动一个io.on('connection')来使用实时功能,或者我可以开始使用socket.on对象来代替?例如我有一条路线
app.post('/postSomething', function(req, res) {
// Do i need to start an io.on or socket.on here?
});
Run Code Online (Sandbox Code Playgroud)
因为我希望实时功能仅在特定路线上收听。
2)Redis是一个处理pub/sub的数据结构库,为什么需要使用pub/sub机制?我阅读了很多文章,但无法掌握其中的概念。文章示例http://ejosh.co/de/2015/01/node-js-socket-io-and-redis-intermediate-tutorial-server-side/
例如下面的代码
// Do i need redis for this, if so why? is it for caching purposes? …Run Code Online (Sandbox Code Playgroud)