会话管理

什么是会话状态?

会话状态是用来捕获用户与应用(如网站或游戏)交互的当前状态的数据。

典型的Web应用程序为每个连接的用户保留会话,只要用户登录。会话状态是应用程序记住用户身份,登录凭据,个性化信息,最近操作,购物车等的方式。

在每个用户交互中读写会话数据必须在不损害用户体验的情况下进行。在后台,会话状态是为特定用户或应用程序缓存的数据,允许对用户操作进行快速响应。因此,当用户会话处于活动状态时,不需要往返于中心数据库。

会话状态生命周期的最后一步发生在用户断开连接时。在数据库中将持久使用一些数据以备将来使用,但在会话结束后可以丢弃瞬态信息。

会话州的挑战和最佳实践

理解会话状态最佳实践是评估和解决与会话相关的常见问题(如隔离、易变性和持久性)的关键。

当会话处于活动状态时,应用程序只对内存中的会话存储区进行读写操作。这意味着更快的写入操作,但也不能容忍数据丢失。由于会话存储数据不是来自另一个数据库的简单快照,所以它必须是高度持久且始终可用的。

会话状态类似于缓存,但它具有不同的读/写生命周期:缓存是数据丢失容忍,并且可以从主数据库随时恢复。写入缓存还需要写入底层数据库。相反,当用户会话开始时,只能从主数据源恢复会话状态,并且仅在会话结束时才会持续回到源。

会话状态可以是不稳定的或永久的,这意味着当用户会话结束时,数据可以被丢弃或持久化到磁盘存储中。不稳定会话数据的一个例子可能是企业内部网中的页面导航历史——几乎不需要保留它。相比之下,电子商务应用程序中的耐用购物车对业务至关重要,必须保存在一个永久商店中。

会话状态存储为键-值与用户标识符为键和会话数据作为值。这可确保用户会话无法访问彼此的信息。

将会话状态存储在快速内存缓存中允许某些在线分析方案,否则会惩罚事务数据库。这些应用包括实时分析和仪表板,推荐引擎和欺诈检测。

Redi万博体育彩s Enterprise是如何让它变得更快的

如何使用Redis企业万博体育彩会话管理

考虑一个文本聊天应用程序,使用MySQL作为关系数据库,Node.js作为后端服务器技术,Redis企业用于会话管理。万博体育彩前端由两个页面组成:一个主页,用户在其中登录;一个聊天页面,用户在其中输入并发送消息。

为了简单起见,我们在这里只显示服务器代码。它将解释如何在Node.js中实现会话状态生命周期。我们还省略了HTML视图页面和应用程序的其余部分。

首先,应用程序加载依赖,包括会话,Redis对象和MySQL客户端:

var Express =要求(“Express”);var session =要求('快递会话');var mysql =要求(“mysql”);var redis =要求(“redis”);var redisstore = require('connect-redis')(会话);var redisclient = redis.createclient();//此处加载了更多依赖项...

上面的声明创建了用于管理web路由、会话、数据库、缓存和会话Node.js库的对象。然后设置Redis作为会话存储:

App.use (session({secret: 'mysecret', //创建新的redis store。store: new redisStore({host: 'localhost', port: 6379, client: redisClient}), saveUninitialized: false, save: false}));

接下来,为主页和聊天页面配置Node.js快速路由,并支持来自客户端的AJAX请求,包括登录、注销和发送评论。

当用户请求主页时,服务器将它们重定向到Chat.html页面或显示登录页面.html,具体取决于用户是否登录。下面的代码段显示/获取Web路由的处理程序代码:

App.get ('/',function(req,res){//创建新的会话对象。If (req.session.key){//用户已经登录res.redirect('/chat');} else{//没有找到会话,去登录页面res.render("login.html");}});

当用户提交登录表单数据(使用电子邮件和密码)时,客户端JavaScript Ajax将表单数据发送到服务器。在这个例子中,它调用了Executelogindbcommand.函数(这里没有显示),它对MySQL数据库执行SQL查询并返回一个包含用户先前保存的会话数据的对象。

如果登录成功,来自MySQL的用户数据将保存到Redis会话存储备份的Web会话,并且客户端JavaScript代码将用户重定向到聊天页面:

app.post('/login',function(req, res){// SQL查询将比较登录和密码//从HTTP请求体到用户表数据executeLoginDbCommand(req.body. res)。电子邮件、req.body。密码,函数(dbResult){// if(!dbResult) {res.json({"success": false,"message": "Login failed !请注册"});} else {req.session.key = dbResult;res.json({"success": true,"message": "Login success."});} });});

应用程序聊天页面允许用户阅读和向其他登录到应用程序的人发送消息。由于用户只看到自己与他人的消息交互,服务器为聊天页面请求返回的数据会随着用户的不同而变化。最重要的是,只有已登录的用户才能访问此页面。检查会话密钥可以显示用户是否登录:

app.get('/ cata',function(req,res){if(req.session.key){//用户已登录,//允许我们使用用户电子邮件res.render(“chat.html“,{email:req.session.key [”useremail“],名称:req.session.key [”用户名“]});否则{//找不到会话,转到登录页面res.redirect(“/”);}});

当用户从聊天页面提交新的评论时,客户端JavaScript AJAX将表单数据发送到服务器。如果用户已经登录,则注释会插入到MySQL UserComments表中。我们通过调用executeSendCommmentDbCommand功能(这里未显示)。

app.post(“/ sendcomment”,function(req,res){//这个sql命令将在//用户表中插入新的注释(req.session.key){executesendcommmentdbcommand(req.body.email,Req。body.recipient,req.body.commers,函数(dbresult){if(!dbresult){res.json({“成功”:true,“消息”:“消息”:“已成功发送注释。”});否则{res.json({成功“:false,”消息“:”sendcomment失败!“});}} else {res.json({”成功“:false,”消息“:”请先登录。“});}});

当用户注销时,会话对象被销毁,用户被重定向到登录页面。但首先,ExecutepersistessiondBCommand.(这里没有显示)保存在内存中的用户会话到MySQL数据库:

app.get('/ logout',函数(req,res){//用户登录,因此让我们销毁会话//和重定向到登录页面。如果(req.session.key){epecutepersistesseddbcommand(req.sessiondbcomand(req.sessiondbcomand),函数(dbresult){if(!dbresult){req.session.destroy(function(){res.redirect('/');} else {res.json({“成功”:false,“消息”:“会话持久性失败!“});}};});} else {res.redirect('/');}});

这些代码段仅使用Redis作为会话商店划伤真正应用程序的表面。但是,它们说明了Redis如何与MySQL这样的永久数据库存储结合使用内存会话状态生命周期。


探索更多


下一个步骤

Baidu