分布式架构下的会话追踪实践【基于Cookie和Redis实现】

分布式架构下的会话追踪实践【基于Cookie和Redis实现】

博客分类:

  • NoSQL/Redis/MongoDB

session共享rediscookie分布式架构session

在单台Tomcat应用中,通常使用session保存用户的会话数据。面对高并发的场景,一台Tomcat难当大任,通常我们会使用Nginx在前端拦截用户请求,转发给后端的Tomcat服务器群组。在集群环境下,怎么才能做到session数据在多台Tomcat之间的共享呢?

当然我们可以在多台Tomcat之间进行session数据的相互复制。这样做的代价是巨大的,尤其是后端Tomcat服务器比较多的情况下(几十台、甚至上百台Tomcat),session数据在Tomcat之间的相互复制,将消耗大量的系统开销、甚至引发网络广播风暴,影响服务器的正常运行。

这时候可以考虑将session数据进行集中存储,比较常见的是使用Memcached来存放会话数据。但是使用Memcached有着诸多限制,比如:对存放对象大小的限制、无法进行数据的持久化等。在下面的demo中将使用Redis来充当Memcached的角色,同时使用Spring Data Redis来完成对Redis的操作。

<一>. 生成Cookie:

在非分布式环境下,每个用户打开浏览器发送请求时,服务器对针对每个用户创建一个session对象,

然后我们可以将和该用户相关的会话数据非常“透明”的存放到对应的session对象里面,直到用户关闭浏览器,服务器才将和该用户对应的session对象销毁。然而服务器如何把每个用户和TA对应的session进行“绑定”呢?

细心的童鞋会发现刚一打开浏览器进行访问的时候,服务器已经“偷偷”地在客户端写入了一个命名为

jsessionid的cookie、并且有效时间为session级别、也就是用户关闭浏览器时,该cookie即被清除。没错的,在我们调用servlet的api获取session对象时,其实服务器还访问了jsessionid这个cookie,服务器将根据这个唯一的jsessionid来区分不同的客户端。

依葫芦画瓢,在用户访问首页时,生成命名为user-key的cookie,值为uuid字符串。

1. 用户访问首页时,先进入到IndexServlet,添加如下配置到web.xml文件:

Xml代码  

  1. <welcome-file-list>
  2. <welcome-file>IndexServlet</welcome-file>
  3. </welcome-file-list>

2. 在IndexServlet中生成user-key并存放至cookie:

Java代码  

  1. String userKey = UUID.randomUUID().toString();
  2. Cookie cookie = new Cookie("user-key", userKey);
  3. response.addCookie(cookie);

3. 跳转到index.jsp:

Java代码  

  1. request.getRequestDispatcher("index.jsp").forward(request, response);

<二>. 用户登录,存放用户信息到Redis里面:

1. 从cookie中获取userKey:

Java代码  

  1. String userKey = null;
  2. Cookie[] cookies = request.getCookies();
  3. for (Cookie cookie : cookies) {
  4. if("user-key".equals(cookie.getName())) {
  5. userKey = cookie.getValue();
  6. break;
  7. }
  8. }

2. 如果用户成功登录,将用户信息存放至Redis:

Java代码  

  1. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  2. UserCache userCache = (UserCache)context.getBean("userCache");
  3. if(null != user && null != userKey) {
  4. userCache.addOrUpdate(userKey, user);
  5. }

3. 从Redis中获取用户数据:

Java代码  

  1. Userinfo loginUser = userCache.load(userKey);

<三>. UserCache类的API:

1. addOrUpdate:有效时间为30分钟

Java代码  

  1. public void addOrUpdate(String userKey, Userinfo user) {
  2. redisTemplate.opsForValue().set(userKey, user, 30, TimeUnit.MINUTES);
  3. }

2. load:访问用户信息时,更新失效时间

Java代码  

  1. public Userinfo load(String userKey) {
  2. Userinfo user = redisTemplate.opsForValue().get(userKey);
  3. redisTemplate.expire(userKey, 30, TimeUnit.MINUTES);
  4. return user;
  5. }

如上所述,简单介绍了使用Cookie和Redis保存会话数据的简单思路,详细的代码参见附件!

诚然,上述设计还有诸多不完善或者待优化的地方,比如生成Cookie的时机放到HttpSessionListener实现类的sessionCreated()方法为妥!有空了再优化一下,这里暂时抛砖引玉啦!

3 

0 

分享到:  

Java加密解密快速入门上篇【包括MD5、BASE ... | 深入浅出Nginx之七【重要知识补充】

参考知识库
人工智能知识库11581  关注 | 521  收录
Python知识库21207  关注 | 1342  收录
Java SE知识库24372  关注 | 477  收录
微信开发知识库19477  关注 | 784  收录
评论

4 楼 caijixu01 2016-05-15

good!

3 楼 u012730315 2015-09-21

请教一下,我之前也是这么做的。

今天面试的时候,面试官问我,如果服务器宕机怎么办?

那不是很多用户都下线了?

持久化的话,我觉得性能可能有问题

2 楼 Hello_Nick_Xu 2014-08-13

bert82503 写道

1,对session数据进行持久化,出于什么考虑? 
2,用户关闭浏览器时,该cookie即被清除。持久化真有必要吗?
3,时间久了之后,如何清理这些失效的持久化数据?

1. 如果仅是简单的进行会话追踪,使用Redis确实是大才小用了!
2. Redis提供了丰富的数据结构,比如可以基于list实现最为常见的TopN操作;
   基于Pub/Sub实现消息系统等;
   可以作为简单的数据库系统存放用户的登录日志;
   对于用户需要频繁访问、并且不会频繁修改的数据也可以放到Redis里面,减少对关系型数据库的直接访问。。。
3. 基于比较广泛的需求,Redis提供了数据持久化机制,即使Redis服务器宕机数据不会丢失!
对于不需要持久化的数据,设置失效时间即可

1 楼 bert82503 2014-08-13

1,对session数据进行持久化,出于什么考虑? 
2,用户关闭浏览器时,该cookie即被清除。持久化真有必要吗?
3,时间久了之后,如何清理这些失效的持久化数据?

时间: 2024-10-12 21:57:06

分布式架构下的会话追踪实践【基于Cookie和Redis实现】的相关文章

分布式架构下,session共享有什么方案么?

分布式架构下,session共享有什么方案么? 会点代码的大叔 科技领域创作者 分布式架构下的session共享,也可以称作分布式session一致性:关于这个问题,和大家说一说解决方案(如果有其他的方案,可以留言讨论). session的作用 如果大家做过web应用开发的话,应该对session比较熟悉:服务器会为每个用户创建一个会话,存储用户的相关信息,以便在后面的请求中,可以够定位到同一个上下文. 例如用户在登录之后,再进行页面跳转的时候,存储在session中的信息会一直保持,如果用户还

复杂分布式架构下的计算治理之路:计算中间件 Linkis

前言 在当前的复杂分布式架构环境下,服务治理已经大行其道.但目光往下一层,从上层 APP.Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的情况.如何做好“计算治理”,让复杂环境下各种类型的大量计算任务,都能更简洁.灵活.有序.可控的提交执行,和保障成功返回结果?计算中间件 Linkis 就是上述问题的最佳实践. 一.复杂分布式架构环境下的计算治理有什么问题? 1. 什么是复杂分布式架构环境? 分布式架构,指的是系统的组件分布在通过网络

Windows平台分布式架构实践 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

张升:农业银行的分布式架构应用实践与展望

近年来,以阿里为代表的互联网企业提出的"去IOE",在业界引起了广泛的讨论."去IOE"直接含义是不使用传统IT巨头的产品,这些厂商产品虽然好,但基本处于市场垄断地位,用户议价能力较弱,成本高昂,技术受制于人,供应链风险较大."去IOE"更深层次的含义是采用分布式的架构替代集中式的架构,构建高可用.易扩展.低成本的分布式架构. 随着国家安全可控政策的实施,移动互联网的兴起,业务量的迅速提升,以及利率市场化所带来的成本约束日益显现,银行业信息系统采

微服务架构下处理分布式事务,你必须知道的事儿

根据微服务架构的鼻祖 Martin Fowler 的忠告,微服务架构中应当尽量避免分布式事务.然而,在某些领域,分布式事务如同宿命中的对手无法避免. 在工程领域,分布式事务的讨论主要聚焦于强一致性和最终一致性的解决方案. 典型方案包括: 两阶段提交(2PC, Two-phase Commit)方案. eBay 事件队列方案. TCC 补偿模式. 缓存数据最终一致性. 一致性理论 分布式事务的目的是保障分库数据一致性,而跨库事务会遇到各种不可控制的问题,如个别节点永久性宕机,像单机事务一样的 AC

分布式架构的演进,分析的很详细,很到位

作者:李小翀链接:https://www.zhihu.com/question/22764869/answer/31277656来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 首先推荐4本书 大型分布式网站架构设计与实践 http://item.jd.com/11529266.html 大型网站技术架构:核心原理与案例分析 http://item.jd.com/11322972.html 大型网站系统与Java中间件实践 http://item.jd.com/11

微服务架构下的身份认证

从单体应用架构到分布式应用架构再到微服务架构,应用的安全访问在不断的经受考验.为了适应架构的变化.需求的变化,身份认证与鉴权方案也在不断的变革.面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本文将会为大家阐述微服务架构下的安全认证与鉴权方案. 单体应用 VS 微服务 随着微服务架构的兴起,传统的单体应用场景下的身份认证和鉴权面临的挑战越来越大.单体应用体系下,应用是一个整体,一般针对所有的请求都会进行权限校验.请求一般会通过一个

如何设计出高可用的分布式架构

在分布式架构中,SOA 和微服务架构是最常见的两种分布式架构,而且目前服务网格的概念也越来越火了,我们就先从这些常见的架构开始. SOA 架构解析 SOA 全称是:Service Oriented Architecture,中文释义为 "面向服务的架构". 它是一种设计理念,其中包含多个服务,服务之间通过相互依赖最终提供一系列完整的功能. 各个服务通常以独立的形式部署运行,服务之间通过网络进行调用,架构图如下: 跟 SOA 相提并论的还有一个 ESB(企业服务总线),简单来说 ESB

一文归纳总结分布式架构的那些事!

双十一购物狂欢节已经过去了,作为程序员的你,除了在关心自己的快递的运送情况之外,最关心的是不是双十一架构技术是如何承受亿级用户流量的冲击,又是如何在分布式架构中实现单点登陆,形成支持高并发,高可用的分布式架构技术呢?下面小编就来帮你总结如何从0到1学习分布式架构技术,如何实现从小白到架构师的蜕变!! 一.初识分布式架构: 1.初识分布式架构及意义 2.如何把应用从单机架构扩展到分布式 3.大型分布式架构的演进过程 4.构建分布式架构的重要因素 (1)CDN加速静态访问 (2)分布式储存 (3)分