spring boot 中利用redis实现session共享

        虽然我的CRM系统现在还没有使用负载均衡,没有使用多机。但是session共享是必须要考虑的事情。各位可能都是大牛,但是保不齐有不知道的,先介绍下负载均衡和session共享方面的知识:

        由于我们的用户越来越多,并发量越来越高,一台机器无法应付所有请求,获取为了系统安全,一台机器坏了,网站系统还能正常访问,我们可以考虑用nginx做负载均衡服务器,将请求分发到不同的tomcat服务器处理(本处只介绍nginx做负载均衡tomcat做java服务器),集群框架如下图所示:

spring boot 中利用redis实现session共享_第1张图片

从图中我们看出负载均衡后,我们的请求会分发到其中的一个tomcat中去,我们知道session是在机器的内存中,那么由于我们的连续请求可能是在不同的机器去处理,那么很可能前一次请求的session后一次无法取得,如何解决这个问题?redis为我们提供了很好的session共享方案。

        我们的CRM是采用spring boot 开发的,在spring boot里面可以非常方便的集成redis,通过redis实现session共享,下面我就给大家介绍下具体的实现。


    
        org.springframework.boot
        spring-boot-devtools
        true
    

    
        org.springframework.boot
        spring-boot-starter-data-redis
    

    
        redis.clients
        jedis
        2.8.1
    

    
        org.springframework.data
        spring-data-redis
        
    

    
    
        com.google.code.gson
        gson
        
    

    
        com.google.zxing
        core
        3.0.0
    
    
        com.google.zxing
        javase
        3.0.0
    

    
        com.aliyun.oss
        aliyun-sdk-oss
        2.8.2
    

    
        net.sf.json-lib
        json-lib
        2.4
        jdk15
    

    
        org.springframework.session
        spring-session-data-redis
        1.2.1.RELEASE
    

    
        org.apache.httpcomponents
        httpclient
        4.4.1
    
    
        org.apache.httpcomponents
        httpcore
        4.4.1
    

    
        org.projectlombok
        lombok
    

    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        mysql
        mysql-connector-java
        5.1.39
    
    
    
        org.springframework.boot
        spring-boot-starter-thymeleaf
        1.4.0.RELEASE
    
    
    
        org.springframework.boot
        spring-boot-starter-data-jpa
        1.5.1.RELEASE
    

    
        org.springframework.boot
        spring-boot-starter-web
    

    
        org.projectlombok
        lombok
        1.16.10
    

    
    
        com.alibaba
        druid
        1.0.11
    

    
        com.fasterxml.jackson.core
        jackson-core
    
    
        com.fasterxml.jackson.core
        jackson-databind
    
    
        com.fasterxml.jackson.datatype
        jackson-datatype-joda
    
    
        com.fasterxml.jackson.module
        jackson-module-parameter-names
    
    
    
        com.github.pagehelper
        pagehelper-spring-boot-starter
        1.1.2
    

    
        com.alibaba
        druid-spring-boot-starter
        1.1.0
    
    
        ch.qos.logback
        logback-core
        1.1.9
    

以上是maven 的pom依赖设置,和redis相关的是
          
            org.springframework.boot  
            spring-boot-starter-redis  
            1.4.6.RELEASE  
         
      
        org.springframework.session  
        spring-session-data-redis  
          
     

spring-session-data-redis 支持redis session 共享


application.yml 配置如下,这个配置让我们的系统客户获取redis的连接。

  1. logging:  
  2.   config: classpath:logback.xml  
  3.   path: d:/logs  
  4. server:  
  5.   port: 8080  
  6.   session-timeout: 60  
  7.   
  8. spring:  
  9.     redis:  
  10.        database: 0  
  11.        host: 127.0.0.1  
  12.        port: 6379  
  13.        password:  
  14.        timeout: 0  
  15.        pool:  
  16.            max-active: 8  
  17.            max-wait: -1  
  18.            max-idle: 8  
  19.            min-idle: 0  
  20.     session:  
  21.       store-type: none 


有点朋友是用application.properties的,只是编写的结构不一样,内容一一对应就好了。

接下来就是编写config文件,使我们的系统能支持redis缓存session共享

新建一个java文件 

package com.hzucan.crmConfig;

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * Created by tongjianbin on 18/4/17.
 */
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisSessionConfig {

}


@EnableRedisHttpSession(maxInactiveIntervalInSeconds 1800)

用于指定sess的过期时间,默认是30分钟,可以按系统的实际情况改写maxInactiveIntervalInSeconds,设置session过期时间。


在写完配置类后,前万记得要在在spring boot的启动类上写上注解@EnableRedisHttpSession

@SpringBootApplication
@EnableCaching
@EnableRedisHttpSession
@EnableTransactionManagement
@ComponentScan(basePackages = "com.hzucan")
@MapperScan(basePackages = "com.hzucan.mapper")
@EntityScan(basePackages = "com.hzucan.entity")
public class Entry {
    public static void main(String[] args) throws Exception{
        SpringApplication.run(Entry.class,args);
    }
}

接下来写一个测试类来进行测试

@EnableRedisHttpSession
@Controller
@RequestMapping(value= "/")
public class IndexController {
    @Autowired
    private UserService userService;
    @Autowired
    HttpServletRequest request;
    @Autowired
    HttpServletResponse response;
    @Autowired
    HttpSession httpSession;

    @RequestMapping(value="/getSessionId")
    @ResponseBody
    public String getSessionId(HttpServletRequest request){
        Object o = httpSession.getAttribute("springboot");
        if(o == null){
            o = "spring boot 牛逼了!!!有端口"+request.getLocalPort()+"生成";
            httpSession.setAttribute("springboot", o);
        }

        return "端口=" + request.getLocalPort() +  " sessionId=" + request.getSession().getId() +"
"
+o; }}

启动springboot, 访问http://localhost:8080/getSessionId

网页上显示如下内容:

端口=8080 sessionId=5F1FB48698294843039010C1B8253B0D

spring boot 牛逼了!!!有端口8080生成

我们再查看redis


当session 失效的时候,我们再查看redis,发现session相关的key已经没有了,虽然我们这里是使用了单台设备,但是通过看key是否存在redis里面,可以大致证明是否实现 了redis session共享,因为虽然负责均衡会让我们的请求转发到不同的服务器,但是cookie里面的sessionId是不会变的,都会到同一个redis里面去查询session。

好了,到此已经在我的crm里面通过redis 实现了session共享。



你可能感兴趣的:(分布式系统)