在我们的redis配置中,我们设置了超时:7秒
在node_redis中,我们处理redis连接就绪和结束事件
client.on("ready", function() {
logger.info("Connection Successfully Established to ", this.host, this.port);
}
client.on("end", function() {
logger.fatal("Connection Terminated to ", this.host, this.port);
}
Run Code Online (Sandbox Code Playgroud)
样本日志
[2012-07-11 08:21:29.545] [FATAL]生产-连接终止端上为'xxx9' '6399'
[2012-07-11 08:21:29.803] [INFO]生产-连接成功建立' xxx9''6399'
但在某些情况下(最有可能的Redis正在关闭不通知客户端的连接),我们看到的命令队列越来越越积越多,并请求占用过多的时间来作出答复,直到时间节点Redis的客户能够感知的关闭事件].在所有这些情况下,返回带有此错误的命令回调Redis connection gone from close event.即使经过这么多等待.由于没有触发通常的结束事件,因为超时看起来好像这不是问题.
问题似乎与此类似 - http://code.google.com/p/redis/issues/detail?id=368
这是redis中发生的已知事情吗?
有没有办法指定执行命令[发送和接收回复]不应超过阈值并在这种情况下回复错误,而不是让客户端停止?
或者在socket_timeout这样的情况下是否还有另一种触发close事件的方法?
或者我们应该从redis方面检查一下?我们监控了我们的redis日志debug级别,我们发现与此问题无关
当我们在调试模式下运行node-redis时,我们显然能够看到客户端因命令队列中堆积的请求而停滞不前.我们在flush_on_error函数中记录了原因和队列长度.我们一直禁用offline_queuing.
样本日志
Redis连接已从关闭事件中消失.offline queue 0命令队列8
请求失败的响应时间:30388 ms [根据命令队列中的等待而变化.第一个排队的人有最大的响应时间和跟随他的人较少]
通常的Resonse时间:1毫秒
PS:我们也在node_redis中提出了一个问题
我已经设置了一个工作登录测试,如下所示:
var express = require('express');
var fs = require('fs');
var http = require('http');
var path = require('path');
var routes = require('./routes/index.coffee');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('./userdb.coffee');
var app = express();
var RedisStore = require('connect-redis')(express);
passport.use(new LocalStrategy(function(username, password, done) {
return User.findOne({
username: username
}, function(err, user) {
if (err) {
return done(null, false, message: error);
}
if (!user) {
return done(null, false, {
message: 'Unknown user'
});
}
if (!user.validPassword(password)) {
return done(null, …Run Code Online (Sandbox Code Playgroud) 有没有办法只在尚未在Redis中设置原子集?
具体来说,我正在创建一个像"myapp:user:user_email"这样的用户,如果已经采用"user_email",则希望Redis给我一个错误,而不是默默地替换旧值.像声明,而不是替换.
使用socket.io redisstore适配器/存储(?),是否可以"查看"所有客户端并"选择"即使是未直接连接到socket.io服务器的客户端?或者仅限于socket.io的"房间"功能?
举一个实际的例子,同一聊天室中的两个用户连接到两个不同的socket.io节点,redisstore适配器/存储是否可以从一个用户耳语到另一个用户而不需要对代码进行大的更改一个有效的单一流程/服务器实现?
我问的原因是我目前还没有处于我的项目开发阶段过度关注扩展(我也没有时间深入探讨node.js扩展背后的概念,这看起来与我的不同之处曾经(第一个完全成熟的node.js项目)),但我不想建立一个无法扩展的基础设施.
我正在 Node 中构建一个 API,并希望将 API 密钥/访问令牌存储在 Redis 中。
如何最好地生成唯一的 API 密钥/访问令牌以将其作为密钥存储在 Redis 中,并将电子邮件地址作为值存储?
Redis 是否有一个内置函数可以生成具有一定长度和字符集的唯一 id,或者我应该如何最好地解决这个问题?
谢谢你!
我是Redis和Node.JS的新手,并且一直试图将这两者结合使用.但是我对一个接一个地使用哪些功能感到有点困惑.
以下代码似乎同步运行,数据库的大小不断增加:
client.dbsize(function(err, numKeys) {
console.log("DB Size before hashes added" + numKeys);
return numKeys;
});
for (var i = 0; i < 100; i++) {
client.hmset(i, "username", "username", "answer", "answer");
client.zadd('answer', i, i);
};
client.dbsize(function(err, numKeys) {
console.log("DB Size after hashes added" + numKeys);
return numKeys;
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试查询排序集'answer'以返回一个数组时,此数组'reply'不能立即用于回调'zrevrangebyscore'之外的其他redis函数.
client.zrevrangebyscore('answer', 100, 0, function(err, reply) {
console.log (reply);
return reply;
});
Run Code Online (Sandbox Code Playgroud)
例如,在reply [1]上调用的后续'hgetall'函数返回undefined.我是否应该以异步方式使用所有Redis函数(包括hmset和dbsize)与callbacks/client.multi等,或者如果同步使用有效工作?感谢所有的帮助.
之前已经问过
我可以从浏览器中运行的JavaScript直接连接到Redis服务器吗?
(注意我的评论)和
直接连接到Redis与(客户端)javascript?
但我想知道哪些东西会有完美的实时连接.阅读(node-redis客户端)https://github.com/luin/ioredis源我注意到netnode`s库的一部分可能包含我们需要在浏览器中重现的功能.
猜猜也许是从webrtc函数中一起被黑客攻击的东西可以做到的吗?
预期收益涉及构建大型分布式应用系统基础设施 - 如社交媒体(来自上面链接的第一个问题的评论):
我再次问这个问题,但是规定我们想要在浏览器中运行的实时redis-client中的"真实" - 而不是HTTP任何东西.可以构建一个伟大的实时"基础设施",只需要CDN服务资产构成客户端webapp直接与Redis通信.我想删除系统中不必要的WebSocket服务器方面.所有控制逻辑都可以内化到Lua中的redis集群.
我目前正在使用 node.js 和 socket.io 处理拍卖脚本。但是站点是使用 PHP 和 MySQL 开发的。在这里,我仅将 node.js + socket.io 用于拍卖投标过程。在拍卖期间,该网站将有 500-1000 名登录用户查看单个页面。只有一件物品将在拍卖中,并且将在一天内出售一次。
我将向从服务器到客户端的所有用户广播(发射)一个倒数计时器。在服务器端,我将使用 setInterval(),1 秒的递归 setTimeout() 倒计时到拍卖结束时间。除此之外,唯一发送的其他消息将是从单个客户端传递到服务器然后向所有客户端广播的当前出价。这种方式做的靠谱吗?它是否能够处理服务器上的使用情况?在这里,我测试了 500 个用户意味着浏览器挂起计时器。
var cluster = require('cluster');
var app = require('express')();
//var http = require('http');
var https = require('https');
var socket = require('socket.io');
var redis = require('redis');
var redisAdapter = require('socket.io-redis');
var request = require('request');
var fs = require('fs');
var options = {
key: fs.readFileSync('keys/e1317_0f2c9_71565598d419e37e376ccef5c2827113.key'),
cert: fs.readFileSync('certs/e1317_0f2c9_1468152279_2dc46c1f2cc135a.crt'),
ca: fs.readFileSync('cabundles/90490a5c829d2aca24f22b5820864c6e_1935558000.cabundle')
};
//var server = http.createServer( app );
var server = https.createServer(options, …Run Code Online (Sandbox Code Playgroud) 我有 2 个 Redis 服务器,一个主服务器,另一个从服务器(复制)。一旦Master由于某种原因宕机了,Slave就会成为Master,并继续充当Master,直到该服务器出现问题为止。
我有一个nodeJS服务器,我想将数据推送到当前作为Master运行的Redis。我有一个监视 Redis 服务器的哨兵,但我的问题是如何使用 nodeJS 从哨兵获取主信息?如果有办法的话,它是否会自动将数据推送到备用redis服务器而无需重新启动任何服务?
让我在问题前言说,我理解这个主题可能不会有明确的、是或否的答案,并且给出的答案可能是观点驱动的。但是,我确实需要并感谢您在部署和操作以下 API 设计方面的建议和/或指导。
对于我的 SaaS,我想通过 API 向我的客户提供其功能。SaaS 提供的任务是一项长期运行且计算成本高昂的任务。因此,不幸的是,运行一个简单的“同步”API(其中调用者等待此任务的结果作为对其请求的响应来传递)是不合适的。相反,我选择了一种方法,让调用者安排Jobs并定期查询 API 以查看给定的作业是否已完成。我对这个设计非常满意。
为了实现,我构建/使用了以下技术:
Node.js服务器Express用于 API 和路由的 npm 包Redis用于作业调度的数据库bullmq用于 Redis 连接和队列管理的 npm 包使用bullmq,我创建一个队列Queue并将其添加Jobs到该队列中,以响应对给定端点的调用。
对我来说,这是api.ts(缩短):
import Express from "express"
import { Queue } from "bullmq"
const api = Express()
const queue = new Queue("com.mysaas.workerQueue")
api.post("/job", async (request, response) => {
var data, jobId
...
await queue.add("com.mysaas.defaultJob", data, {
jobId: jobId,
removeOnComplete: true,
...
}) …Run Code Online (Sandbox Code Playgroud) node-redis ×10
node.js ×8
redis ×7
javascript ×4
socket.io ×2
api-design ×1
asynchronous ×1
bullmq ×1
express ×1
node-cluster ×1
passport.js ×1
pm2 ×1
tcp ×1
webrtc ×1