利用SpringSession和redis对Session进行共享详解-创新互联

前言

创新互联建站作为成都网站建设公司,专注成都网站建设、网站设计,有关成都定制网站方案、改版、费用等问题,行业涉及成都效果图设计等多个领域,已为上千家企业服务,得到了客户的尊重与认可。

我们在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。


session的处理有很多种方法,详情见转载的上篇博客:集群/分布式环境下5种session处理策略


在这里我们讨论其中的第三种方法:session共享。

redis集群做主从复制,利用redis数据库的最终一致性,将session信息存入redis中。当应用服务器发现session不在本机内存的时候,就去redis数据库中查找,因为redis数据库是独立于应用服务器的数据库,所以可以做到session的共享和高可用。

不足:

1.redis需要内存较大,否则会出现用户session从Cache中被清除。


2.需要定期的刷新缓存

初步结构如下:


但是这个结构仍然存在问题,redis master是一个重要瓶颈,如果master崩溃的时候,但是redis不会主动的进行master切换,这时session服务中断。

但是我们先做到这个结构,后面再进行优化修改。

Spring Boot提供了Spring Session来完成session共享。

官方文档:http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sample

首先创建简单的Controller:

@Controller 
public class UserController { 
 
 @RequestMapping(value="/main", method=RequestMethod.GET) 
 public String main(HttpServletRequest request) { 
 HttpSession session = request.getSession(); 
 String sessionId = (String) session.getAttribute("sessionId"); 
 if (null != sessionId) { // sessionId不为空 
 System.out.println("main sessionId:" + sessionId); 
 return "main"; 
 } else { // sessionId为空 
 return "redirect:/login"; 
 } 
 } 
 
 
 @RequestMapping(value="/login", method=RequestMethod.GET) 
 public String login() { 
 return "login"; 
 } 
 
 @RequestMapping(value="/doLogin", method=RequestMethod.POST) 
 public String doLogin(HttpServletRequest request) { 
 System.out.println("I do real login here"); 
 HttpSession session = request.getSession(); 
 String sessionId = UUID.randomUUID().toString(); 
 session.setAttribute("sessionId", sessionId); 
 System.out.println("login sessionId:" + sessionId); 
 return "redirect:/main"; 
 } 
} 

本文名称:利用SpringSession和redis对Session进行共享详解-创新互联
转载源于:http://hbruida.cn/article/dgesjs.html