用例

会话管理

什么是会话状态

会话状态是捕获用户与网站或游戏等应用程序交互的当前状态的数据

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

必须在每次用户交互时读取和写入会话数据,而不会损害用户体验。在后台,会话状态是针对特定用户或应用程序的缓存数据,可以快速响应用户操作。因此,在用户会话处于实时状态时,无法进行往返应该需要中央数据库

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

会议状态的挑战和最佳实践

了解会话状态最佳实践是评估和解决与常见会话相关的问题(例如隔离性波动和持久性)的关键

当会话处于活动状态时,应用程序专门从内存中的会话存储中读取和写入数据,这意味着写入操作更快,而且对数据丢失没有容忍性。由于会话存储数据不是来自其他数据库的简单快照,因此它必须具有高度持久性并且始终可用

会话状态类似于缓存,但是具有不同的读写生命周期。缓存可以容忍数据丢失,并且可以随时从主数据库中还原。写入缓存还需要写入基础数据库。相反,会话状态可以是仅在用户会话启动时从主数据源还原,并且仅在会话结束时才持久化回源

会话状态可以是易失性或永久性的,这意味着用户会话结束时数据可以被丢弃或保留到磁盘存储中。易失性会话数据的一个示例可能是公司Intranet中的页面导航历史记录,几乎不需要保留它。电子商务应用程序中的购物车对于企业至关重要,必须保存在永久性商店中

会话状态存储为键值对,用户标识符作为键,会话数据作为值。这确保用户会话不会相互访问信息

将会话状态快速存储在内存高速缓存中,可以实现一些在线分析方案,否则将对事务数据库造成不利影响。这些应用程序包括实时分析和仪表板推荐引擎以及欺诈检测

Redis Enterprise如何使其快速

  • Redis Enterprise基于没有共享的对称架构使数据集大小线性无缝地增长而无需更改应用程序代码
  • Redis Enterprise提供了多种高可用性和地理分布模型,可在需要时为用户提供本地延迟
  • 每秒写入或每秒多个持久性选项AOF以及不影响性能的快照可确保您不必在发生故障后重建数据库服务器
  • 支持巨大的数据集通过使用对存储器的智能分层访问RAM持久性存储器或闪存,可以确保您可以根据用户的需求扩展数据集,而不会对性能产生任何重大影响

如何使用Redis Enterprise进行会话管理

考虑使用MySQL作为关系数据库Node js作为后端服务器技术,使用Redis Enterprise进行会话管理的文本聊天应用程序。前端由两个页面组成,一个页面用于用户登录,而一个聊天页面用于用户输入和发送消息。

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

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

var express需要快递
var会话需要快速会话
var mysql需要mysql
var redis需要redis
var redisStore需要连接redis会话
var redisClient redis createClient
更多的依赖项在这里加载

上面的声明创建用于管理Web路由会话数据库缓存和会话Node js库的对象,然后将Redis设置为会话存储

应用使用会话
秘密的秘密
创建新的Redis商店
存储新的redis存储主机localhost端口客户端redisClient
saveUninitialized false
重新保存错误

接下来,配置主页和聊天页面的Node js Express路由以及对来自客户端的AJAX请求的支持,包括登录注销和发送评论

当用户请求主页时,服务器会将其重定向到聊天html页面或显示登录页面html,具体取决于用户是否登录。下面的代码段显示了获取网络路由的处理程序代码

应用程序获取功能要求
创建新的会话对象
如果要求会话密钥
用户已经登录
res重定向聊天
其他
找不到会话进入登录页面
res呈现登录html

当用户使用电子邮件和密码提交登录表单数据时,客户端JavaScript AJAX将表单数据发送到服务器。在本示例中,它调用executeLoginDbCommand此处未显示的函数,该函数对MySQL数据库执行SQL查询并返回一个包含用户先前保存的会话数据的对象

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

应用程式登入功能req res
SQL查询将比较登录名和密码
从HTTP请求主体到用户表数据
executeLoginDbCommand要求正文电子邮件要求正文密码功能dbResult

如果dbResult
res json成功错误消息登录失败请注册
其他
请求会话密钥dbResult
res json成功真实消息登录成功


通过应用程序聊天页面,用户可以阅读消息并将消息发布给登录到该应用程序的其他人,因为用户只能看到自己与其他人的消息交互,因此服务器为聊天页面返回的数据在用户之间有所不同。最重要的是访问此页面仅限登录用户检查会话密钥可显示用户是否已登录

应用程序获取聊天功能要求
如果要求会话密钥
用户已经登录
因此,让我们使用用户电子邮件呈现聊天页面
res渲染聊天html

电子邮件请求会话密钥UserEmail
名称请求会话密钥UserName

其他
找不到会话进入登录页面
res重定向

当用户从聊天页面提交新评论时,客户端JavaScript AJAX将表单数据发送到服务器。如果用户登录,则将评论插入MySQL UserComments表中,方法是调用executeSendCommmentDbCommand功能未在此处显示

应用后sendComment函数要求res
此SQL命令将在中插入新注释
用户表
如果要求会话密钥
executeSendCommmentDbCommand请求正文电子邮件请求正文收件人请求正文注释函数dbResult
如果dbResult
res json成功true消息评论已成功发送
其他
res json成功错误消息SendComment失败


其他
res json成功错误消息请先登录

当用户注销时,会话对象被销毁,并且用户被重定向到登录页面,但是首先executePersistSessionDbCommand这里未显示将内存用户会话保存到MySQL数据库

应用程序获取注销功能要求
用户已登录,所以我们破坏会话
并重定向到登录页面
如果要求会话密钥
executePersistSessionDbCommand请求会话函数dbResult
如果dbResult
请求会话销毁功能
res重定向
其他
res json成功错误消息会话持久性失败



其他
res重定向

这些片段仅使用Redis作为会话存储来刮擦真实应用程序的表面,但它们说明了Redis如何结合永久数据库存储(如MySQL)在内存会话状态生命周期中进行管理