分布式架构下的对话追踪实践【基于库克ie和Redis实现】

分布式架构下的对话追踪实践【基于库克ie和Redis实现】

博客分类:

session共享rediscookie分布式架构session

   
 在单台汤姆(Tom)cat应用被,平时使用session保存用户之对话数据。面对高起的情景,一台汤姆cat难当大任,平时大家相会下Nginx在前端拦截用户要,转发给后端平的汤姆(Tom)cat服务器群组。在集群环境下,怎么才会成功session数据以差不多宝Tomcat之间的共享为?NoSQL 1

 

   
 当然我们得以多台汤姆cat之间展开session数据的互动复制。这样做的代价是宏伟的,尤其是后端Tomcat服务器相比多之情下(几十大、甚至多高汤姆cat),session数据以汤姆(Tom)cat之间的互相复制,将吃大量底序列开发、甚至吸引网络播放风暴NoSQL 2,影响服务器的正常运转。

 

   
 这时候能够设想用session数据开展汇总储存,相比广泛的凡以Memcached来存放会话数据。但是利用Memcached有着广大限量,比如:对存放对象大小的范围、无法展开多少的持久化等。在底下的demo将官以Redis来充当Memcached的角色,同时接纳Spring
Data Redis来完成对Redis的操作。

 

<一>. 生成Cookie:

 

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

接下来我们得以用同拖欠用户相关的对话数据很“透明”的寄放到对应之session对象中,直到用户关闭浏览器,服务器才以和拖欠用户对应之session对象销毁。可是服务器怎样管每个用户与TA对应的session举行“绑定”呢?

 

     
细心的童鞋会发现刚一打开浏览器举行走访的时刻,服务器就“偷偷”地在客户端写副了一个命名吧

jsessionid的cookie、并且有效时间吧session级别、也就是用户关闭浏览器时,该cookie即被辟。NoSQL 3然的,在我们调用servlet的api获取session对象时,其实服务器还拜了jsessionid那些cookie,服务器将因是唯一的jsessionid来区分不同的客户端。

 

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

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

Xml代码  NoSQL 4

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

 2.
以IndexServlet中生成user-key并存放到cookie:NoSQL 5 

Java代码  NoSQL 6

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

 3. 跳转到index.jsp: 

Java代码  NoSQL 7

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

 

 

<二>. 用户登录,存放用户音讯及Redis里面:

  1. 从cookie中获取userKey:NoSQL 8 

Java代码  NoSQL 9

  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:NoSQL 10 

Java代码  NoSQL 11

  1. NoSQL,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代码  NoSQL 12

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

 

 

 <三>.
UserCache类的API:NoSQL 13

  1. addOrUpdate:有效时间吗30秒钟 

Java代码  NoSQL 14

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

 2. load:访问用户消息日常,更新失效时 

Java代码  NoSQL 15

  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保存会话数据的简要思路,详细的代码参见附件!

     
诚然,上述计划还有多无到家或用优化的地点NoSQL 16,比如生成库克ie的空子放到HttpSessionListener实现类的sessionCreated()方法也当!有空了重复优化一下,这里小抛砖引玉啦!NoSQL 17

 

3 

0 

分享到: NoSQL 18 NoSQL 19

Java加密解密快速入帮派及篇【包括MD5、BASE
 | 通俗Nginx之七【首要文化上】

参照知识库

NoSQL 20

事在人为智能知识库11581  关注 | 521  收录

NoSQL 21

Python知识库21207  关注 | 1342  收录

NoSQL 22

Java SE知识库24372  关注 | 477  收录

NoSQL 23

微信支付知识库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,时间久了后,怎么样理清那么些失效的持久化数据?

网站地图xml地图