Redis - 用于管理重复信息的Mongo集成

时间:2015-09-22 22:02:45

标签: node.js mongodb session node-redis

我有一个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?

0 个答案:

没有答案