一种HTTP服务器集群的会话管理方法与流程

文档序号:12279016阅读:927来源:国知局
一种HTTP服务器集群的会话管理方法与流程

本发明涉及服务器集群技术领域,具体说是一种HTTP服务器集群的会话管理方法。



背景技术:

服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。例如:web服务器集群、HTTP服务器集群(Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的)。

现有技术中,web站点(web服务器)经常需要为用户(客户端)的登陆状态保存一个会话信息,会话用于保存用户登录过程中的一些行为,例如:在客户端第一次请求web服务器的时候,web服务器生成一种称为“会话标识符”的ID,然后伴随响应发送给客户端,之后的通信中客户端发来的请求只需要带着这个特定的ID,web服务器就可以知道这是哪个客户端了。常见web会话管理的方式有三种:

1)基于server端session的管理方式;

2)cookie-base的管理方式;

3)token-base的管理方式。

传统的http服务程序的会话只对这个服务程序自身有效,但复杂的站点通常是多http服务程序的组合,所以传统的http会话技术己经越来越难以适应发展的需要了。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种HTTP服务器集群的会话管理方法,不但可以管理大量会话,而且处于HTTP服务器集群中的任何http服务程序都可以用。

为达到以上目的,本发明采取的技术方案是:

一种HTTP服务器集群的会话管理方法,其特征在于,包括如下步骤:

步骤1:用默认配置设立一个Redis数据库;

步骤2:当用户首次访问Redis数据库时,为该用户生成一个随机数作为会话ID,将会话ID转换为字符串后,设为KEY1;

步骤3:获取步骤2所述用户的ip地址,将ip地址与KEY1做字符串连接后,设为KEY2,然后用Redis的exists KEY2命令检验会话是否己存在,如果存在则从步骤2重新开始;

步骤4:将KEY1作为Cookie写在http响应头中,并对上述Redis数据库执行以下操作:

为该会话建立一个hashmap容器以存储其数据;

为hashmap容器设置生命周期,使其在一段时间内不访问自动失效。

在上述技术方案的基础上,以会话ID为键在Redis中关联到一个Redis哈希表,用这个Redis哈希表保存用户的会话数据。

在上述技术方案的基础上,步骤4中,所述一段时间默认为1200秒。

在上述技术方案的基础上,根据http协议的约定,当用户再次访问HTTP服务器集群中的任意http服务程序的时候,会在请求头的Cookie字段中携带KEY1,为用户提供服务的具体http服务程序将用户的ip地址与KEY1做字符串连接,得到KEY2,然后再次为hashmap容器设置生命周期,使其在一段时间内不访问自动失效。

在上述技术方案的基础上,当所述为用户提供服务的具体http服务程序想要向会话中写入数据键a值b时,

通过Redis命令hset KEY2a b写入数据,

通过Redis命令hget KEY2a读取该数据。

本发明所述的HTTP服务器集群的会话管理方法,可以管理大量会话,而且会话中保存的信息,可以被处于HTTP服务器集群中的任何http服务程序使用。

本发明所述的HTTP服务器集群的会话管理方法,具有以下优点:

1、能够很好地支持负载均衡。

2、服务之间的会话数据共享更自然,会话信息可以为多个同一集群内的服务程序所用。

3、性能高。

4、用户的会话数据不会随着服务的崩溃而丢失。

当服务崩溃时,因为会话数据存在于Redis数据库中,而会话ID在浏览器端(客户端)有记录,故只要服务器重新启动,用户的会话数据是不会丢失的。

例如:当用户登录网站,写好一篇文章准备发布,此时服务因为故障而遭遇了崩溃重启。那么重新启动的服务依然可以在收到用户的文章和会话ID而从Redis数据库中读取到用户的身份信息继续发布该文章。而如果传统的http服务中的会话,会在服务重启后丢失状态,就会将该用户视为未登录用户而阻止其发布文章,导致用户受到损失。

附图说明

本发明有如下附图:

图1本发明的数据传递示意图。

图2本发明的流程图。

具体实施方式

以下结合附图对本发明作进一步详细说明。

如图2所示,本发明所述的HTTP服务器集群的会话管理方法,包括如下步骤:

步骤1:用默认配置设立一个Redis数据库;

Redis是一个开源的、使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API;设立Redis数据库的具体步骤按现有技术实施即可,本发明不再详述;

步骤2:当用户首次访问Redis数据库时,为该用户生成一个随机数作为会话ID,将会话ID转换为字符串后,设为KEY1;

步骤3:获取步骤2所述用户的ip地址,将ip地址与KEY1做字符串连接后,设为KEY2,然后用Redis的exists KEY2命令检验会话是否己存在,如果存在则从步骤2重新开始;

Redis exists命令被用来检查键是否存在于Redis;

步骤4:将KEY1作为Cookie写在http响应头中,并对上述Redis数据库执行以下操作:

为该会话建立一个hashmap容器以存储其数据,例如:hset KEY2KEY1 1;

为hashmap容器设置生命周期,使其在一段时间内不访问自动失效,例如:expire KEY2 1200;

hset命令用于为哈希表中的字段赋值,如果哈希表不存在,一个新的哈希表被创建并进行HSET操作,如果字段已经存在于哈希表中,旧值将被覆盖;

expire命令用于设定键有效期,到期时间后键不会在Redis中使用。

如图1所示,用一个Cookie(KEY1)作为会话ID,这个会话ID会被包含在http请求中。以这个会话ID为键可以在Redis中关联到一个Redis哈希表,用这个Redis哈希表则可以保存用户的会话数据。

在上述技术方案的基础上,根据http协议的约定,当用户再次访问HTTP服务器集群中的任意http服务程序的时候,会在请求头的Cookie字段中携带KEY1,为用户提供服务的具体http服务程序将用户的ip地址与KEY1做字符串连接,得到KEY2,然后再次为hashmap容器设置生命周期,使其在一段时间内不访问自动失效,例如:再次执行expire KEY2 1200更新会话的生命周期。

在上述技术方案的基础上,当所述为用户提供服务的具体http服务程序想要向会话中写入数据键a值b时,

通过Redis命令hset KEY2a b写入数据,

通过Redis命令hget KEY2a读取该数据。

以下通过一个具体的应用场景举例进一步说明本申请所述技术方案。

假设有一个web站点由多台php服务器组成,使用nginx做负载均衡。网站需要做用户登录状态的管理,当用户凭借用户名和密码登录后,在一定时间内用户进行操作不需要重新登录。当用户输入用户名和密码后,用户的登录信息记录在会话中。

按现有技术实施,用户的访问请求会根据nginx的负载均衡被转发到随机php服务器上,而新php服务器没有用户的登录状态,故会话中断。

按本发明所述方法实施,具体步骤如下:只需要用本技术提供的方法替代原有的php会话操作即可。

显然本发明所述方法优于现有技术,解决了会话丢失的问题,实现会话在服务间的共享,因此本发明所述方法更适合于在集群情况下采用,可以避免会话丢失,并具对原有编程习惯改变极少。

本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1