秦溧 艾青
摘要:针对Web服务器不能对用户访问系统时所产生的无状态会话进行有效管理,提出采用Redis缓存服务器技术来管理用户端和服务器之间所产生的无状态会话,并通过实验证实了采用该技术能有效管理用户访问系统所产生的无状态会话,同时还可以优化系统性能,提高用户体验感。
关键词:Redis缓存;Session;会话管理
中图分类号:TP311.5 文献标识码:A
文章编号:1009-3044(2021)12-0090-03
1 背景
HTTP协议属于无状态分布式通信协议,也就是服务器每响应一次用户请求后就会丢失和用户之间的联系,因此当接收下一个用户请求时无法判断该请求是否来自相同的用户,也就无法有效地去记录用户所进行的操作和用户的状态等重要信息。而在Web应用中,通常需要记录和跟踪用户的会话状态,用于对用户进行身份认证、访问控制等[1]。
而伴随着需求的增长,对用户的登录,权限等状态的会话信息管理已成为不可避免的话题。平常在进行Web开发时,需要和Web服务进行打交道,Web服务是种无状态的会话机制和HTTP协议类似。因此要对用户的会话状态进行管理则需要使用其他的方式进行实現。
基于此,本文采用Redis分布式缓存技术设计并实现了在Web应用中对无状态会话进行管理,并且该技术能满足会话管理在应用上的需求。
2 Redis概述
2.1 Redis的特点
Redis是一个以键值对为存储方式的分布式系统,同时也是NoSQL 技术阵营中重要的成员之一。 Redis不仅存储效率高、支持使用多种不同的数据类型、事务操作是原子性的、还拥有丰富的特性,支持publish/subscribe、通知、key过期等特性[2]。能进一步提高系统数据的完整性以及一致性。Redis既有对于不同的常见数据类型相同的指令,也有对于不同数据类型的特殊指令。此外Jedis是Redis的Java版本客户端,Jedis可以像Java那样进行多线程处理,以及使用线程来对系统资源进行优化处理,提高系统资源利用率和Redis 的使用效率。在提高数据获取速度时,我们需要用一些缓存技术,Redis的最大优势在于可将数据缓存到内存并能够分片存储,同时拥有很高的读写效率[3]。
2.2 Redis的存储及数据恢复方式
Redis存储机制的默认设置是:当更改了一个Key,那么从更改之时算起,在15分钟之后Redis进行一次持久化的数据存储操作。当更改了十个Key则自修改之时起5分钟后Redis进行一次持久化的数据存储操作,在完成持久化存储后,会将临时文件替换掉之前的RDB文件,完成数据的更新。此外,Redis在存储一些特殊数据信息时,如手机号码、imsi码等,采用a-z,A-Z,0-9组成的62进制替代10进制可以大大地节约内存,手机号码可以从11位压缩到6位,imsi码可以从15位压缩到9位[4]。通过这种方式可以进一步压缩数据信息所占用的内存。
通过RDB进行数据恢复的方式也很简单,这里介绍两种方式:
1)第一种,重启。只用重新启动Redis的服务就可以完成对数据的恢复。因为在启动时,RedisSever会先从Dump.rdb文件进行数据的同步;
2)第二种,利用AOF文件进行恢复。该方法是记录下来在Redis服务中已经执行过的指令,在进行恢复数据的时候,在AOF文件中按照从前往后的顺序将指令再次执行一遍以此来达到数据恢复的目的。采用这种方式的优点是,能够更好地保持数据的完整。采用种方式的缺点是,AOF文件比RDB文件大,并且采用AOF进行数据恢复速度较慢,因为它主要是记录执行过程中的操作指令。
为了能更好地体现出Redis缓存技术的作用和优势,一般需要在另一个服务器上搭建一个分布式系统。使用传统的关系型数据库远远不能满足互联网业务中存储大量数据的需求。此外,在实际应用中,传统的关系型数据库不能实时的统计和更新多种不同类型的数据资源。因此Redis在分布式系统上搭建好之后可以通过Redis确定各个影响数据存储有效性的影响因素,实现对分布式数据的可靠性评测和存储[5]。
3 Redis会话管理技术
3.1 有状态会话和无状态会话概述
平常在进行web开发时会遇到session,而平常所遇到的这些session统称为有状态session,所谓有状态session,就是在一个网站上,用户进行登录,登录成功后就会产生一个会话(session),这时如果有两个或者更多的用户来访问的话就会产生两个甚至多个的session,如图1所示,这些session都是用于维护我们系统和用户之间的会话,建立起连接后,系统可以在不同方法调用期间保持和维护用户的状态,通常对系统的开销较大。如果会话消失,也就是说用户没有访问我们的网站。当用户下次要再次进行访问时,或者要再次对网站进行操作时则需要再次进行验证,只有验证通过后,才能建立连接。
无状态session,就是指用户在调用系统中的不同方法时,不会保留任何状态,当然,由于是无状态的,所以占用的资源通常较少。假设有一套系统,有用户进行登录,但是在登录之后并没有将用户信息存储到session中去,那么用户去访问系统的时候其实是没有会话的,也就是没有session这种东西,这时如果有两个或者更多的用户来访问我们这个系统其实都是没有会话的,那这样的话,是没办法维护系统和用户之间的关系,因为用户访问一次我们这个系统,它的连接就断开了,当下次再要进行访问时,就必须重新去建立连接。那么这样子就称之为无状态session。对于无状态session,一般来说,我们还是要在后端对它进行一定的控制。
3.2 采用Redis-Session实现无状态会话管理分析
欲用一种方式去管理和维护无状态Session,既然Web容器也就是tomcat无法去做到的话,那么此时就可以去依靠Redis,也就是一直所谈到的缓存。
Redis-Session,当App用户,去访问这个系统的时候,就会产生一个User-Redis-Session,这样的一个Session就是把用户信息,以一个JSON的形式,把整个对象保存到Redis缓存中去就可以了,那么当然,缓存和有状态session可以说是类似的,是一个键值对。另外,对Redis也可以对用户设置一定的时间,比如说30分钟或者一个小时后无操作该User-Redis-Session自动失效。当然,当有更多的App用户来访问系统的时候,所产生的User-Redis-Session会越来越多。如图2所示。
像这种Redis-Session都可以直接存储到缓存里面去,不管是单机Redis还是集群Redis,都是没有问题的。
使用Redis-Session的好处:
1)用户信息存储到Redis缓存中,形成无状态会话,便于管理。
2)便于扩展,当一个单体应用扩展成集群的时候会相当方便。在我们的集成环境中,不管我们用户访问到我们的哪一節点,我们的用户缓存,用户Session全部都可以被访问到。这样就会相当方便。
3)便于权限验证。如果想获取到当前访问系统的App用户信息,则可以在后端设置一个拦截器,在该拦截器中可以直接获取到Redis-Session中的用户信息,从而用于识别该用户的权限。
3.3 Redis配置文件编写
Redis的配置文件信息如图3所示:
1)redis.hostname:Redis的服务器地址。这里由于部署Redis时,使用的是另一台服务器进行的部署,而这台服务器的IP地址是121.199.58.0,所以Redis的服务器地址就是121.199.58.0。
2)redis.port:Redis的端口号,这里采用的是它默认的端口号6379.
3)redis.pool.maxActive:Redis连接池最大能连接的数量,这里设置的是100。
4)redis.pool.maxIdle:Redis连接池最大的空闲连接数量,数量如果超过最大空闲连接数,则会直接将该对象丢弃。
5)redis.pool.maxWait:Redis连接池最大阻塞等待时间,在建立用户和Redis之间连接的时候所需要的最大的等待时间,当设置为负值是,就表示等待的时间无上限。这里设置的是3000毫秒。
6)redis.pool.testOnBorrow:Borrow一个Jedis实例的时候,是否需要进行alidate操作。这里设置为true,表示得到的Jedis对象都是可以使用的。
4 Redis实现无状态会话管理实验结果及分析。
4.1 实验预期和结果分析
用户在进行登录时,系统为用户生成一个唯一的token,同时将用户的ID作为键,token作为值一并存入到redis中,这样便能建立用户和系统的联系了,同时,当系统需要对该用户的某些权限时,直接到redis中,通过用户ID便能直接获取到用户的信息。
以下通过采用RedisDesktopManager图形化Redis管理工具展示实验结果:
如图4所示。
当用户登录成功时,系统会将用户的ID作为键,也就是图中的STRING,并将系统为该用户生成的唯一token(图中的Value)作为值缓存到redis数据库中。此外,与传统意义上的有状态Session相比较,redis能同时允许多个用户在同一台电脑,同一个浏览器上进行登录。因为对于传统的有状态session,一个浏览器只能和一个用户进行连接。当多个用户进行登录时,后登录用户的往往会把之前登录的用户的session给替换掉,对于开发人员,在对不同角色的用户进行测试时,造成极大不便。当采用Redis-Session对用户的无状态会话进行管理时,可以有效地保存用户的登录状态,并且这里同时登录了两个账号,但是并没有出现被后登录用户覆盖前一个用户的问题,相比较于有状态会话,无状态会话所耗费的服务器资源更少,能显著地提高系统的性能和用户体验感。
4.2 使用无状态会话和有状态会话性能对比分析
如表1所列,无状态会话在多项性能指标上优于有状态会话,但是无状态会话并不是适用于所有的场景,当出现需要进行频繁访问,且访问之间需要进行一些信息的共享,这个时候就应该选择有状态会话。然而,当系统中涉及一些不常使用的功能时,无状态会话的优先级高于有状态会话。
5 结束语
基于Redis的无状态会话管理技术可以有效地管理用户在访问系统时所产生的无状态会话,并且通过实验及对比,证实了,无状态会话的管理不仅能有效的管理用户的状态,且系统开销小于有状态会话,能极大改善系统性能,提高用户体验感。
参考文献:
[1] 阳瑞发.基于拦截器的Web服务会话技术研究[J].制造业自动化,2015,37(20):54-55.
[2] 宁方美,贺雪梅,牟晋娟.SpringBoot集成Redis缓存技术在企业一卡通系统中的应用[J].电子技术与软件工程,2019(24):133-134.
[3] 叶朋.网站访问性能优化的研究与实现[D].哈尔滨:哈尔滨理工大学,2020.
[4] 徐茂红,王飞,张明.基于大数据量的Redis技术应用与研究[J].信息技术与信息化,2019(11):228-230.
[5] 宋云奎,吴文鹏,赵磊,等.基于Redis的分布式数据存储方法[J].计算机产品与流通,2020(8):106.
【通联编辑:谢媛媛】