我有一个Node应用程序,我最近从单核心更改为使用cookie会话到多核(使用群集)和Redis存储来处理会话。 Mongo是我的数据存储,我拥有的最常用对象之一是我称之为“用户”的对象。这是它的模型(猫鼬):
// define the schema for our user model
var userSchema = mongoose.Schema({
username : String,
access : Number,
blocked : Number,
login : {
lastLogin : Date,
amt : Number
},
appData : {
fontSize : String,
pageState : {}
}
});
现在,当用户浏览时,此对象的appData.pageState部分会不断修改,基本上当用户在我的应用程序中从一个部分转到另一个部分时,该对象变成这样的内容:
appData:
{
pageState:
{
foo: 5,
bar: 41,
baz: 23
},
fontSize: '16px'
}
这些数字代表其各自部分访问的最后一页。当用户从一个部分跳到另一个部分时,这一点就是如此,他们访问的最后一页是他们返回时所服务的那一页。如果他们退出应用程序并返回,我希望将其存储起来,这样他们就可以离开他们离开的地方。
我有一个会话:req.session.user
登录时与用户模型相同。
req.session.regenerate(function(){
// Store the user object from the database into the session
req.session.user = user;
res.redirect('/home');
});
当我从一个部分导航到一个部分和一个页面到另一个页面时,我将pageState保存到Mongo中,然后更新会话数据。
User.findOne({'_id' : req.session.user._id },function(err, user){
if( err ){ }
else if( user ){
//page state
if( user.appData.pageState === undefined ){
user.appData.pageState = {}; // initialize with an empty object
}
user.appData.pageState[path] = id;
user.markModified( 'appData.pageState' ); // let Mongo know we have modified our nested schema
user.save(function( err ) {
if( err ){ }
else{
req.session.user.appData = user.appData; //copies the Mongo data object to the redis session store
req.session.save();// saves the new session data
}
});
}
});
当我跳到新的部分时,我会获得该页面的会话数据
app.get('/:section', function(req, res){
var section = req.params.section;
res.render(section, { appData : req.session.user.appData })
});
所以这里有一个问题:有没有办法可以利用redis商店的速度,并且当它自动更改时有redis更新mongo?