我正在 Node 中构建一个 API,并希望将 API 密钥/访问令牌存储在 Redis 中。
如何最好地生成唯一的 API 密钥/访问令牌以将其作为密钥存储在 Redis 中,并将电子邮件地址作为值存储?
Redis 是否有一个内置函数可以生成具有一定长度和字符集的唯一 id,或者我应该如何最好地解决这个问题?
谢谢你!
我无法使用kue连接到Redis,我已经关注了本文,实际上我是通过使用kue redis客户端创建连接的,连接代码是这样的:
var kue = require('kue'),
redis = require('kue/node_modules/redis');
app.redisClient = redis.createClient('6379', 'remoteip',{});
app.redisClient.on('error', function (err) {
console.log('Redis error encountered', err);
});
app.redisClient.on('end', function() {
console.log('Redis connection closed');
});
kue.redis.createClient = function() {
console.log('client ------------------',app.redisClient);
return app.redisClient;
};
Run Code Online (Sandbox Code Playgroud)
似乎Kue正在尝试连接到本地Redis(我尚未安装),因为我遇到了以下异常:
错误:Redis与127.0.0.1:6379的连接失败-连接ECONNREFUSED
我已经阅读了这篇文章,似乎问题已在0.8版中解决,并且我使用的是0.8.11:/,最后我还想通过使用redis nodejs来使用其他客户端实例覆盖客户端,但没有任何运气,因为我遇到了同样的错误。
任何帮助将不胜感激。谢谢!
我目前正在使用 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) 我有一组要存储在 Redis 中的对象。我可以分解数组部分并将它们存储为对象,但我不知道如何获得类似的东西
{0} : {"foo" :"bar", "qux" : "doe"}, {1} : {"name" "Saras", "age" : 23}
Run Code Online (Sandbox Code Playgroud)
然后根据名称搜索数据库并取回请求的密钥。我需要这样的东西。但不能接近正确。
incr id //correct
(integer) 3
get id //correct
"3"
SADD id {"name" : "Saras"} //wrong
SADD myset {"name" : "Saras"} //correct
(integer) 1
Run Code Online (Sandbox Code Playgroud)
首先是正确处理这部分。
其次是以某种方式从值中获取密钥,即
if name==="Saras"
then key=1
Run Code Online (Sandbox Code Playgroud)
我觉得很难。或者我可以将它直接存储为对象数组并使用简单的 for 循环。
for (var i = 0; i < userCache.users.length; i++) {
if (userCache.users[i].userId == userId && userCache.users[i].deviceId == deviceId) {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
请建议哪种路线最适合某些实施?
我有 2 个 Redis 服务器,一个主服务器,另一个从服务器(复制)。一旦Master由于某种原因宕机了,Slave就会成为Master,并继续充当Master,直到该服务器出现问题为止。
我有一个nodeJS服务器,我想将数据推送到当前作为Master运行的Redis。我有一个监视 Redis 服务器的哨兵,但我的问题是如何使用 nodeJS 从哨兵获取主信息?如果有办法的话,它是否会自动将数据推送到备用redis服务器而无需重新启动任何服务?
我开始学习 redis 和 nodejs ,我从第三方 api 调用获取数据。我想将此数据保存到我的 redis 服务器中。我能够做到这一点,但我遇到了一个问题,如果我在具有多个键的 json 数组中获取数据,我将无法插入它。我该如何解决这个问题?
我的数据是:
keys
[123,3435,455,455]
value
[{name:'shakti'},{name:'amit'},{name:'amiit'},{name:'sad'}]
Run Code Online (Sandbox Code Playgroud)
我想立即将这些数据保存为键值形式,而不使用任何 for 循环。目前我正在使用 for 循环
for(var i=0i<keys.length;;i++){
redisClient.set(keys[i],data);
}
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题。谢谢
让我在问题前言说,我理解这个主题可能不会有明确的、是或否的答案,并且给出的答案可能是观点驱动的。但是,我确实需要并感谢您在部署和操作以下 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) 直接通过redis-cli连接到我的twemproxy将正确地代理我到redis,没有任何问题/断开连接.但是,当我使用node-redis连接到twemproxy时,我收到以下错误:
[Error: Redis connection gone from end event.]
Run Code Online (Sandbox Code Playgroud)
跟踪如下:
Error: Ready check failed: Redis connection gone from end event.
at RedisClient.on_info_cmd (/home/vagrant/tests/write-tests/node_mo
dules/redis/index.js:368:35)
at Command.callback (/home/vagrant/tests/write-tests/node_modules/r
edis/index.js:418:14)
at RedisClient.flush_and_error (/home/vagrant/tests/write-tests/nod
e_modules/redis/index.js:160:29)
at RedisClient.connection_gone (/home/vagrant/tests/write-tests/nod
e_modules/redis/index.js:474:10)
at Socket.<anonymous> (/home/vagrant/tests/write-tests/node_modules
/redis/index.js:103:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:919:16
at process._tickCallback (node.js:419:13)
Run Code Online (Sandbox Code Playgroud)
无论redis-server是否正在运行,都会发生此错误,所以我很确定它与node-redis和twemproxy的交互方式有关.或者不根据具体情况进行交互.
到底发生了什么?
我有一个简单的测试设置,如下所示:
+------------------+
| +----+----+ |
| | r1 + r2 + |
| +----+----+ |
| | | |
| +---------+ |
| |twemproxy| |
| +---------+ | …Run Code Online (Sandbox Code Playgroud) 有谁知道如何通过节点redis获得分数?我试过这样的事情:
client.ZRANGE(key, 0, -1, withscores, function(err, replies) {
});
Run Code Online (Sandbox Code Playgroud)
谢谢.
当我使用socket.io执行pub/sub时,下面的代码工作得很好.
基本上,我从浏览器发送聊天消息.在服务器上,我收听此消息并将其发回给所有来自服务器的相同消息.所以,我希望每发送一条消息都会返回/打印1条消息.
通过以下内容,我可以从多个浏览器登录,当我发送聊天消息时,它会按预期返回/打印为单个聊天消息.
io.use(socketHandshake({store: sessionStore, key:'jsessionid', secret:'secret', parser:cookieParser()}));
io.on('connection', function (socket) {
socket.on('chat', function (message) {
io.emit('chat', "hello world");
});
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用redis做pub/sub时,会出现问题.
从第一个浏览器:1个聊天消息导致打印出1个聊天消息
从第二个浏览器:1个聊天消息导致打印出2个聊天消息
从第三个浏览器:1个聊天消息导致打印出3个聊天消息
var sub = redis.createClient();
var pub = redis.createClient();
sub.subscribe('chat');
io.use(socketHandshake({store: sessionStore, key:'jsessionid', secret:'secret', parser:cookieParser()}));
io.on('connection', function (socket) {
socket.on('chat', function (message) {
// io.emit('chat', "hello world");
pub.publish('chat', "hello world");
});
sub.on('message', function (channel, message) {
io.emit(channel, message);
});
});
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我是初学者,我正在尝试这个例子http://blog.cloudfoundry.org/2013/01/24/scaling-real-time-apps-on-cloud-foundry-using-node-js-and -redis /使用最新版本的express,socket.io,socket.io-handshake和redis.
我对这个redis pub/sub感到难过.请帮忙.
node-redis ×10
node.js ×9
redis ×8
socket.io ×2
api-design ×1
bullmq ×1
javascript ×1
kue ×1
node-cluster ×1
pm2 ×1
twemproxy ×1