目前我有以下代码,使用Node.js,socket.io和Redis:
var io = require('socket.io'), redis = require("redis"), client = redis.createClient();
io.sockets.on('connection', function (socket) {
var socket_id = socket.id;
socket.on('chat', function(data) {
client.set('user:' + socket_id, data['colour']);
// The user left the page. Remove them from Redis.
socket.on('disconnect', function () {
client.del('user:' + socket_id);
client.quit();
});
});
});
这适用于正常的套接字连接和断开连接,但是如果Node关闭,或者我只是重新启动Node作为正常开发的一部分,则似乎存在问题。
密钥永远不会从Redis中删除。因此,Redis数据库中存储的条目数逐渐增长和增长。我也不确定Redis客户端是否存在干净。
如何清除Redis条目并在节点退出时退出Redis客户端,以及套接字断开连接时?
答案 0 :(得分:4)
您可以在节点退出时处理此问题,例如如果电源关闭,你无法在关机时清理它。我会在启动时从数据库中删除旧的东西。
答案 1 :(得分:1)
我也遇到过这个问题。我的解决方案是在服务器上使用特定的Redis数据库来获取Socket.io数据。启动时对该数据库的简单FLUSHDB将清除卡住的密钥。
var socketIoDatabase = 4;
var client = redis.createClient();
client.select(socketIoDatabase);
client.flushdb();
当然,如果您有多个节点进程使用同一个数据库清除它将导致问题。在这种情况下,您可以在维护窗口期间执行此操作,或者在所有节点进程终止时执行此操作。
答案 2 :(得分:0)
检查一下: http://nodejs.org/docs/v0.4.12/api/process.html#event_uncaughtException_
var io = require('socket.io'), redis = require("redis"), client = redis.createClient();
io.sockets.on('connection', function (socket) {
var socket_id = socket.id;
socket.on('chat', function(data) {
client.set('user:' + socket_id, data['colour']);
// The user left the page. Remove them from Redis.
socket.on('disconnect', function () {
client.del('user:' + socket_id);
client.quit();
});
});
});
// this will be activated on any error without try catch :)
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});