Tag: redis

我在群集的node.js / socket.io / redis pub / sub应用程序中收到重复消息

我正在使用Node.js,Redisstore的Socket.io,Socket.io家伙的Cluster和Redis。 我有一个发布/订阅应用程序,只有一个Node.js节点运行良好。 但是,当负载过重时,由于Node.js不是为多核机器编写的,因此最多只能是服务器的一个核心。 正如你在下面看到的,我现在使用了来自Learnboost的Cluster模块,和使用Socket.io的人一样。 但是,当启动4个工作进程时,每个进入和订阅的浏览器客户端都会获得Redis中发布的每条消息的4个副本。 如果有三个工作进程,则有三个副本。 我猜我需要将redis pub / subfunction以某种方式移动到cluster.js文件。 Cluster.js var cluster = require('./node_modules/cluster'); cluster('./app') .set('workers', 4) .use(cluster.logger('logs')) .use(cluster.stats()) .use(cluster.pidfiles('pids')) .use(cluster.cli()) .use(cluster.repl(8888)) .listen(8000); App.js redis = require('redis'), sys = require('sys'); var rc = redis.createClient(); var path = require('path') , connect = require('connect') , app = connect.createServer(connect.static(path.join(__dirname, '../'))); // require the new redis store var […]

Redis性能问题?

我试图把一些沉重的负载放在我的Redis上进行testing,并找出任何上限。 首先我加载了大小为32个字符的大小为32个字符的50,000和100,000个键。 这两个关键尺寸都花了不到8-15秒。 现在我试着把4kb的数据作为每个键的值。 首先10000个按键需要800毫秒设置。 但是从这个angular度来看,它逐渐变慢,设置5万个键需要40分钟。 我正在用node_redis(Mranney)加载数据库。 我正在做什么错误,或者是Redis的大小是4 KB? 我现在发现的另一件事情是,当我运行另一个客户端并行到当前一个,并更新密钥第二客户端完成在8秒内加载4万个值的50000密钥,而第一个客户端仍然永远做它的事情。 这是在节点或Redis库中的错误? 这是令人震惊的,不能接受的生产。

socket.io如何通过多个服务器发送消息?

Socket.io API可以将消息发送给所有的客户端。 使用一个服务器和所有内存中的套接字,我知道这个服务器可以向所有的客户端发送消息,这很明显。 但是,使用Redis存储套接字的多台服务器呢? 如果我有客户端连接到服务器y和客户端b连接到服务器z (和商店的Redis框),并且我在一台服务器上执行socket.broadcast.emit ,另一台服务器上的客户端将收到此消息。 怎么样? 实际连接到其他服务器的客户端如何获得该消息? 一台服务器是否告诉其他服务器向其连接的客户端发送消息? 服务器是否build立自己的连接到客户端来发送消息?

如何正确使用Redis和Koa(node.js)

我尝试从redis数据库获取信息,并将其作为响应的主体返回给用户。 首先,这是一个失败的代码: var redis = require("redis"), koa = require("koa"); var app = koa(), port = process.argv[2] || 3000, client = redis.createClient(); app.use(function* (next) { client.get("test", function (err, res) { this.body = res; }); yield next; }); app.listen(port); console.log("listen on port " + port) 肯定是因为收益调用在调用callback之前结束。 那么这里是一个成功的代码: function askRedit (callback) { client.get("test", callback); } app.use(function* (next) { […]

使用Node.js,Socket.io,Redis的私人聊天消息在PHP中

我正在为我的PHP应用程序实时的私人消息系统工作。 我的代码正在为所有用户一起工作。 但我需要私人消息系统作为一对一的消息。 安装节点和Redis后,我可以得到我需要的消息数据:这里是代码:: 前端:: 1.我使用一个表单 – 用户名,消息和发送button 和通知JS: $( document ).ready(function() { var socket = io.connect('http://192.168.2.111:8890'); socket.on('notification', function (data) { var message = JSON.parse(data); $( "#notifications" ).prepend("<p> <strong> " + message.user_name + "</strong>: " + message.message + "</p>" ); }); }); 服务器端js: var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); […]

Redis / Node.js – 2个客户端(1个pub / sub)导致写入问题

试图创build两个客户端; 一个是pub / sub,另一个是标准连接。 这不可能吗? 必须有一种方法来抽象这个工作:)基本上,如果我运行test.js后get key一个get key ,我看到的只是'valueBefore'。 输出: node test.js Reply: OK /Users/franklovecchio/Desktop/development/node/node_modules/redis/index.js:487 throw new Error("Connection in pub/sub mode, only pub/sub commands may ^ Error: Connection in pub/sub mode, only pub/sub commands may be used at RedisClient.send_command (/Users/franklovecchio/Desktop/development/node/node_modules/redis/index.js:487:15) at RedisClient.<anonymous> (/Users/franklovecchio/Desktop/development/node/node_modules/redis/index.js:597:27) at Object._onTimeout (/Users/franklovecchio/Desktop/development/node/distributed-cache/client/test.js:19:12) at Timer.callback (timers.js:83:39) 代码: var redis = require('redis'); var […]

在Node.js中处理asynchronous循环的最佳模式

我是新来的Node,并试图确保我正在使用JSON驱动的Web应用程序的理智的devise。 我有一堆存储在Redis中的数据,并且通过节点检索它,并从Redis传出结果。 这是我正在做的一个很好的例子: app.get("/facility", function(req, res) { rc.keys("FACILITY*", function(err, replies) { res.write("["); replies.forEach(function (reply, i) { rc.get(reply, function(err, reply) { res.write(reply); if (i == replies.length-1) { res.write("]"); res.end(); } else res.write(","); }); }); }); }); 本质上,我从Redis获取一组密钥,然后请求每个密钥,将结果stream出到半手动创build的JSON(从Redis出来的string已经在JSON中)。 现在这个效果很好,但是我不禁想到i == respond.length-1有点不整齐? 我可以使用Redis中的mget来完成所有这些,但这并不是我想要得到的。 这是如何最好地处理与forEach的asynchronous循环,stream输出和正常closures与res.end循环连接完成。 这是最好的方式,还是有一个更优雅的模式,我可以遵循?

如何在node.js库中处理未处理的exception

我有一个使用Express和Redis的node.js应用程序。 我的问题是如何捕获和处理Redis连接错误。 我有一个快速处理大多数应用程序错误的app.error函数,但由于这个错误是在redis库中引发的错误,它成为一个未捕获的exception,整个应用程序停止。 我可以在我的redis客户端上定义一个on_error方法吗? 如果是这样,也许有一些示例代码 我应该以某种方式处理它在Node.js下一个滴答错误? 我不确定我是否理解下一个陈述,所以不知道最佳做法是什么。 在下面的代码中,即使存在连接错误,catch块也不会被命中 try { feedClient = redis.createClient(feedPort, feedHost); } catch (error) { console.log('cannnot start redis' + error); } 这是未被捕获的错误 node.js:134 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Redis connection to localhost:6379 failed – ECONNREFUSED, Connection refused at RedisClient.on_error (/node_modules/redis/index.js:136:24) at Socket. (/node_modules/redis/index.js:70:14) at […]

为什么我不能有一个Redis客户端在同一个连接中充当PUB和Sub?

我的心智模式是“聊天”,我订阅了某个频道,我可以发布消息到这个频道。

如何将javascript数组保存为redis列表

以下代码将整个数组保存为redis列表中的单个值。 但我想单独保存数组值。 我该怎么做? PS对于英语不好,真抱歉。 var redis = require('redis'), client = redis.createClient(); var arr = [1,2,3]; client.rpush('testlist',arr);