spring boot 中利用redis实现session共享

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

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


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

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

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <!--<version>1.0.2.RELEASE</version>-->
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <!--<version>2.8.0</version>-->
    </dependency>

    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>2.8.2</version>
    </dependency>

    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk15</classifier>
    </dependency>

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>1.2.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4.1</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.39</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>1.4.0.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>1.5.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>

    <!-- alibaba的druid数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.11</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
    </dependency>
    <!-- 分页插件 -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.1.2</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.9</version>
    </dependency>

</dependencies>
以上是maven 的pom依赖设置,和redis相关的是
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-redis</artifactId>  
            <version>1.4.6.RELEASE</version>  
        </dependency> 
    <dependency>  
        <groupId>org.springframework.session</groupId>  
        <artifactId>spring-session-data-redis</artifactId>  
          
    </dependency> 

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() +"<br/>"+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共享。



  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Redis实现Spring Boot应用程序的会话共享,您需要执行以下步骤: 1. 添加Redis依赖项 在您的Spring Boot项目添加spring-boot-starter-data-redis依赖项,这将为您提供Redis客户端和Spring Session依赖项。 2. 配置Redisapplication.properties文件添加Redis配置,包括Redis服务器的主机名、端口和密码。 3. 启用Spring SessionSpring Boot应用程序启用Spring Session,您需要将@EnabaleRedisHttpSession注释添加到Spring Boot主应用程序类上。 4. 配置会话超时 您可以在application.properties文件设置会话超时时间,例如:spring.session.timeout=30m。 5. 测试 最后,您可以测试您的Spring Boot应用程序是否正在使用Redis进行会话共享,通过多个实例运行应用程序,并在每个实例访问同一URL并查看结果是否相同。 通过这些步骤,您应该能够在Spring Boot应用程序使用Redis进行会话共享。 ### 回答2: 在Spring Boot使用Redis实现session共享可以通过以下步骤实现: 1. 首先,确保在pom.xml文件添加以下依赖项以在Spring Boot使用Redis: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 在application.properties文件配置Redis连接信息: ```properties spring.redis.host=your-redis-host spring.redis.port=your-redis-port spring.redis.password=your-redis-password ``` 3. 创建一个配置类(如RedisConfig.java),用于配置与Redis的连接以及序列化的设置: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400) // 设置session的有效时间,单位为秒 public class RedisConfig { @Bean public RedisSerializer<Object> redisSerializer() { // 使用JSON序列化器,存储到RedisSession以JSON格式保存,方便阅读 return new GenericJackson2JsonRedisSerializer(); } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 设置key和value的序列化器 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(redisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(redisSerializer()); return template; } } ``` 4. 在需要使用session的地方注入`HttpSession`,并使用它来获取、设置和删除session的属性: ```java import javax.servlet.http.HttpSession; // 注入HttpSession @Autowired private HttpSession session; // 获取session的属性 Object attributeValue = session.getAttribute("attributeName"); // 设置session的属性 session.setAttribute("attributeName", attributeValue); // 删除session的属性 session.removeAttribute("attributeName"); ``` 这样,通过以上步骤,就可以在Spring Boot使用Redis实现session共享了。注意,由于Redis是内存数据库,需要设置session的有效时间以避免占用过多的内存资源。 ### 回答3: 使用Spring Boot实现Session共享的方法有两种:使用Spring Session和使用RedisTemplate。 第一种方法是使用Spring Session实现Session共享Spring Session是一个用于在分布式环境下管理SessionSpring项目,它提供了一种基于SpringSession管理解决方案。要使用Spring Session,需要在pom.xml文件添加相关依赖,然后在Spring Boot配置类加上@EnableRedisHttpSession注解,配置Redis连接信息。这样,Spring Session会将Session信息存储到Redis实现Session共享。 第二种方法是使用RedisTemplate来实现Session共享RedisTemplate是Spring Data Redis提供的一个用于操作Redis的模板类,可以方便地进行Redis的读写操作。要使用RedisTemplate实现Session共享,首先需要在pom.xml文件添加相关依赖,然后在Spring Boot配置类创建一个RedisConnectionFactory实例,并将其注入到RedisTemplate。通过RedisTemplate,可以将Session信息存储到Redis,并实现Session共享。 无论是使用Spring Session还是使用RedisTemplate,都需要在Spring Boot配置文件配置Redis连接信息,包括Redis服务器的IP地址、端口号和密码(如果有)。此外,还可以配置Redis的连接池参数,以提高性能和并发能力。 总结起来,要使用Spring Boot实现RedisSession共享,可以使用Spring SessionRedisTemplate两种方式。通过配置相关依赖和连接信息,将Session信息存储到Redis实现Session共享。这样,在分布式环境下,不同的应用实例之间就能够共享Session,并实现会话的跨应用访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值