我有一组要存储的分层数据,层次结构就像站点/建筑物/楼层,例如数据
{
site:'New York',
buildings: [
{
name:'building a',
floors: [
'Ground':[{room:room1},{room:room2}],
'First':[{room:room1},{room:room2}]
]
}
]
}?
{
site:'London',
buildings: [
{
name:'building a',
floors: [
'Ground':[{room:room1},{room:room2}],
'First':[{room:room1},{room:room2}]
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想将这些房间数据存储到一个集合中,但我也可以通过选择站点名称或(站点名称+建筑物名称)或(站点名称+建筑物名称+楼层)来查询房间的子集.
下面的命令只给出了频道列表.
127.0.0.1:6379> PUBSUB CHANNELS
1) "mychannel"
2) "mychanne2"
Run Code Online (Sandbox Code Playgroud)
如何列出在channel1或channel2上订阅的订阅者.?
也
我找不到redis命令列出特定频道的所有订阅者
我在RedisOnGo + node_redis上使用NodeJS + Express + Redis作为客户端.我期待很多并发,所以试图测试WATCH.这个例子不包含Express,只是必要的东西.
var redis = require("redis")
var rc = redis.createClient(config.redis.port, config.redis.host)
rc.auth(config.redis.hash, function(err) {
if (err) {
throw err
}
})
rc.on('ready', function () {
rc.set("inc",0)
for(var i=1;i<=10;i++){
rc.watch("inc")
rc.get("inc",function(err,data){
var multi = rc.multi()
data++ // I do know I can use rc.incr(), this is just for example
multi.set("inc",data)
multi.exec(function(err,replies){
console.log(replies)
})
})
}
})
Run Code Online (Sandbox Code Playgroud)
期待结果:在exec回调中得到N个错误,最后得到"inc"变量= 10-N.
意外的结果:在exec回调中得到0错误,但最终得到"inc"变量= 1.
Watch无法使用我的代码.
我发现这个线程redis和watch + multi允许并发用户.他们说这是因为唯一的redis客户端.
然后我发现这个线程我应该为每个连接创建一个新的Redis客户端吗?.他们说为每笔交易生成一个新客户"绝对不推荐".我搞不清楚了.
另请注意,我必须向Redis服务器进行身份验证.提前致谢!
第1版:
通过在每次WATCH-MULTI-EXEC迭代之前创建新的客户端连接,我能够使用本地Redis实例(因此我不使用client.auth).不确定它是否好,但结果现在是100%准确.
版本2 如果我在每次WATCH-MULTI-EXEC迭代之前创建一个新的客户端连接,然后执行client.auth并等待client.on,它就可以工作了. …
是否可以在SET不删除现有ttl的情况下重新启动密钥?我目前唯一知道的方法是找出ttl并做一个SETEX但看起来不那么准确.
我正在构建一个连接到 redis 的 Nodejs 应用程序。我将此与我的本地 redis 实例一起使用。现在,我正在使用ioredisNodejs 应用程序连接到 AWS 中 k8s 中的 Redis 集群。这是我所拥有的。
const Redis = require("ioredis");
this.redis = new Redis({
port: 6379, // Redis port
host: rhost, // Redis host
password: password
});
this.redis.on('connect', () => {
console.log('connected to redis')
})
Run Code Online (Sandbox Code Playgroud)
connected to redis当消息在日志中打印出来时,我似乎成功连接到集群。但是,每次我尝试使用我的 redis 对象时,都会收到 MOVED 错误:
UnhandledPromiseRejectionWarning: ReplyError: MOVED 5011 <ip address>:6379
at parseError (/node_modules/ioredis/node_modules/redis-parser/lib/parser.js:179:12)
at parseType (/node_modules/ioredis/node_modules/redis-parser/lib/parser.js:302:14)
Run Code Online (Sandbox Code Playgroud)
该连接适用于我的本地。然而,在 AWS 中却并非如此。我尝试使用Redis.Cluster对象而不是进行交换Redis,但是在部署应用程序后,应用程序挂起并且连接事件永远不会触发。和事件似乎无限循环close。reconnecting
据我了解,这是集群中节点之间重定向的问题。可能是主/从配置的问题。该错误是 AWS 中的配置问题吗?我需要使用Redis.Cluster对象而不是普通 …
我刚开始用node实现redis.在身份验证方法的实现过程中,我需要检查令牌是否存在于redis中,如果没有在redis和我的mongo db中更新新令牌,我需要编写一个大的回调块并且不能正确获取结果.我们怎样才能使redis变回红色回调.我们怎样才能使它同步.示例代码如下.
module.exports.authenticate = function(request, response) {
var reply = {};
if(UserSchema) {
var UserModel, attributes;
/** Registering User Model; **/
mongoose.model('user', UserSchema);
UserModel = mongoose.model('user');
attributes = request.params;
UserModel.findOne(attributes, "_id name email token", function(error, user) {
if(!error && user) {
var token;
//delete user.password;
token = user.token;
/** Checking token exists in redis; **/
redisClient.get(token, function(error, value) {
if(value === null && error === null) {
/** Creating new token; **/
token = require('crypto').createHash('md5').update("" + (new Date()).getTime()).digest("hex");
user.token = …Run Code Online (Sandbox Code Playgroud) 所以我试图让Sessions在我的socket.on('connection',...)中工作.我正在尝试使用最新版本:Socket.io - 0.9.13,Express - 3.1.0和最新版本其他模块.
无论如何,我尝试使用' connect-redis '和' session.socket.io ' 两个模块,他们都有类似的问题.
在我的代码中我有2个redis商店(socketio.RedisStore和require('connect-redis')(快递)),现在这个程序都运行正常,但因为express和socket.io需要共享会话数据,我想知道是否此设置将正确使用会话?会话存储需要与express/socketio相同吗?对我来说有点灰色区域,因为2 RedisStore将在后台使用相同的数据库?
我曾尝试在两个地方使用socket.io redisStore或connect-redis redisStore,但socket.io不喜欢connect-redis redisStore和express不喜欢socketio.redisStore.
如果我使用connect-redis RedisStore,那么socket.io/lib/manager.js抱怨:this.store.subscribe(... TypeError Object#没有方法'subscribe'
如果我使用socketio.RedisStore然后表达/ node_modules/connect/lib/middleware/session.js抱怨:TypeError:Object#没有方法'get'
*注意我宁愿让session.socket.io插件工作,但是当我使用该插件进行相同的设置时,表达(也)抱怨:TypeError:Object#没有方法'get'
所以我可以使用2个不同的RedisStore进行会话,或者我是否需要以某种方式让一个或另一个为两者工作,如果是这样,任何关于如何修复的想法?
我当前的代码如下所示:
var
CONST = {
port: 80,
sessionKey: 'your secret sauce'
};
var
redis = require('redis');
var
express = require('express'),
socketio = require('socket.io'),
RedisStore = require('connect-redis')(express);
var
redisStore = new RedisStore(),
socketStore = new socketio.RedisStore();
var
app = express(),
server = require('http').createServer(app),
io = socketio.listen(server);
app.configure(function(){
app.use(express.cookieParser( CONST.sessionKey ));
app.use(express.session({ secret: CONST.sessionKey, store: redisStore })); …Run Code Online (Sandbox Code Playgroud) 我的目标是在mongodb和redis的帮助下在node.js中构建一个简单的新闻源.它像twitter一样
因此,一旦用户A关注用户B,情况就非常简单.稍后用户的A新闻提要(主页)将显示用户B的活动,就像他发布的内容一样.
用户架构
const UserSchema = new Schema({
email: { type: String, unique: true, lowercase: true},
});
const followSchema = new Schema(
{
user: { type: Schema.Types.ObjectId, required: true, ref: 'User' },
target: { type: Schema.Types.ObjectId, required: true, ref: 'User' },
});
Run Code Online (Sandbox Code Playgroud)
目前我的用户架构的设计非常简单,当我跟随另一个用户时,我将创建Follow Schema对象
并且还有另一个模式,即后置模式
/* This is similar like the Tweet */
var PostSchema = new Schema({
// Own by the user
creator: { type: Schema.Types.ObjectId, ref: 'User' }
body: String,
});
Run Code Online (Sandbox Code Playgroud)
此架构供用户发布任何内容,类似于Twitter发布.
假设我跟随了一堆用户
{
user: 'me',
target: 'draco' …Run Code Online (Sandbox Code Playgroud) 我正在使用库node_redis作为我正在编写的微服务消息客户端的客户端.客户端从他们的发件箱中获取需要发送到其他服务的消息.一切都很好,但我正在尝试在使用redis客户端与redis-server通信的应用程序上构建一些弹性.
我的想法是redis客户端 - 服务器连接状态应该对客户端高度可用.我的意思是,如果连接断开,我想知道在第二个而不是300秒的默认超时.目前我正在使用AWS上托管的免费redislabs层,但我应该将其移动到我的kubernetes集群上的自己的容器中运行.
我需要知道网络中客户端连接的状态,因为我不希望在网络条件不正确时发送消息,而不依赖于错误处理来处理这种事件.了解这些高延迟事件发生的频率和时间也将有助于我诊断和改进我的网络和我的微服务.
注意:我想在客户端选项中设置connect_timeout值,但这被列为已弃用.
node-redis ×10
redis ×10
node.js ×5
javascript ×3
express ×2
ioredis ×1
mongodb ×1
performance ×1
pipeline ×1
session ×1
socket.io ×1