Redis解决Session共享问题的方法详解

企业项目中,一般都是将项目部署到多台服务器上,用nginx做负载均衡。这样可以减轻单台服务器的压力,不过这样也带来一些问题,例如之前单机部署的话,session存取都是直接了当的,因为请求就只到这一台服务器上,不需要考虑数据共享。接下来分别用8000和8001端口启动同一个项目,做一个简单演示:

测试接口代码:

package com.wl.standard.controller;

import cn.hutool.core.util.StrUtil;
import com.wl.standard.common.result.HttpResult;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * @author wl
 * @date 2022/7/10 14:25
 */
@Api(tags = "测试接口")
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Resource
    Environment environment;

    @GetMapping("/demo")
    public HttpResult demo(HttpServletRequest request) {
        int maxInactiveInterval = request.getSession().getMaxInactiveInterval();
        log.info("session过期时间: {}秒", maxInactiveInterval);
        String port = (String) request.getSession().getAttribute("port");
        if (StrUtil.isEmpty(port)) {
            //获取当前服务端口
            port = environment.getProperty("local.server.port");
            request.getSession().setAttribute("port", port);
        }
        log.info("session-port: {}", port);
        return HttpResult.success(port);
    }
}

进入swagger的接口文档页面,进行测试接口请求:

8000端口控制台输出:

然后请求8001的同一个接口:

从上面两张图可以看出虽然是同一套代码,去session里获取的同一个参数,2个端口获取的值却不同,这就是分布式中需要解决的问题:数据共享。

之前的文章有讲过用redis做分布式锁,其实这里也可以用redis解决session共享的问题。

在引入redis之前,先简单贴一下怎么在配置文件里修改session默认过期时间。从上图可以看到session默认过期时间是1800秒,也就是30分钟,如果想要延长,可以在配置文件application.yml中修改:

server:
  port: 8000
  servlet:
    session:
      timeout: 3600 #延长session过期时间到1小时

回归正题,要用redis解决session共享,首先需要引入依赖包:

<!--springboot中的redis依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
      <dependency>
          <groupId>org.springframework.session</groupId>
          <artifactId>spring-session-data-redis</artifactId>
      </dependency>

然后还需要在配置文件中配置:

spring:
  # session配置
  session:
    timeout: 7200 # 设置session失效时间
    store-type: redis # 修改spring-session存储配置,默认存储到服务器内存中,现在设置存到redis中(关键)

其实这里也可以设置session的过期时间,为了和上面的作对比,此处设置过期时间为2小时。

无需修改代码,重新启动2个端口,再分别请求同一个接口:

8000端口控制台输出:

8001端口控制台输出:

再看redis:

另外值得注意的是,当上面2处都配置session过期时间时,实际是以spring下的配置为准的。

以上就是Redis解决Session共享问题的方法详解的详细内容,更多关于Redis解决Session共享的资料请关注我们其它相关文章!

(0)

相关推荐

  • nginx+redis实现session共享

    上一篇我们介绍了nginx实现的负载均衡和动静分离,可看这边. 我们在文章的末尾说到,负载均衡需要面临的一个问题是内存数据的同步.例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且将登录数据存入session的时候,这些session数据只存在于A服务器上,而没有在B服务器上,假如在处理下一个请求的时候,我需要用到session的数据,而不巧的是,这个请求刚好被交由B服务器来处理,这时候就会出现B服务器拿不到session数据的情况,从而造成错误. 这是一个无法避免的问题,有

  • redis实现分布式session的解决方案

    目录 一.首先Session 二.分布式Session 补充: 一.首先Session Session 是客户端与服务器通讯会话技术, 比如浏览器登陆.记录整个浏览会话信息.session存放在服务器,关闭浏览器不会失效. Session实现原理 客户对向服务器端发送请求后,Session 创建在服务器端,返回Sessionid给客户端浏览器保存在本地,当下次发送请求的时候,在请求头中传递sessionId获取对应的从服务器上获取对应的Sesison 请求过程: 服务器端接受到客户端请求,会创建

  • Redis实现分布式Session管理的机制详解

    一. Redis实现分布式Session管理 1. Memcached管理机制 2. Redis管理机制 1.redis的session管理是利用spring提供的session管理解决方案,将一个应用session交给Redis存储,整个应用中所有session的请求都会去redis中获取对应的session数据. 二. SpringBoot项目开发Session管理 1. 引入依赖pop.xml <!--springboot-redis--> <dependency> <

  • Redis快速实现分布式session的方法详解

    目录 前言 Spring Security Apache Shiro Session作用 spring-session 支持功能 分布式seesion实战 步骤1:依赖包 步骤2:配置文件 步骤3:实现逻辑 步骤4:编写session拦截器 步骤5:把拦截器注入到拦截器链中 步骤6:测试 前言 我们在开发一个项目时通常需要登录认证,常用的登录认证技术实现框架有Spring Security和shiro Spring Security Spring Security是一个功能强大且高度可定制的身份

  • spring boot与redis 实现session共享教程

    如果大家对spring boot不是很了解,大家可以参考下面两篇文章. Spring Boot 快速入门教程 Spring Boot 快速入门指南 这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: @Configuration @EnableRedisHttpSession public class RedisSessi

  • Redis解决Session共享问题的方法详解

    企业项目中,一般都是将项目部署到多台服务器上,用nginx做负载均衡.这样可以减轻单台服务器的压力,不过这样也带来一些问题,例如之前单机部署的话,session存取都是直接了当的,因为请求就只到这一台服务器上,不需要考虑数据共享.接下来分别用8000和8001端口启动同一个项目,做一个简单演示: 测试接口代码: package com.wl.standard.controller; import cn.hutool.core.util.StrUtil; import com.wl.standar

  • 基于SpringBoot+Redis的Session共享与单点登录详解

    前言 使用Redis来实现Session共享,其实网上已经有很多例子了,这是确保在集群部署中最典型的redis使用场景.在SpringBoot项目中,其实可以一行运行代码都不用写,只需要简单添加添加依赖和一行注解就可以实现(当然配置信息还是需要的). 然后简单地把该项目部署到不同的tomcat下,比如不同的端口(A.B),但项目访问路径是相同的.此时在A中使用set方法,然后在B中使用get方法,就可以发现B中可以获取A中设置的内容. 但如果就把这样的一个项目在多个tomcat中的部署说实现了单

  • redis中opsForList().range()的使用方法详解

    目录 结论(具体测试数据请往下看) 1.环境 redis 2.测试代码: 3.测试数据(假设List长度为N) 4.测试从索引倒数开始 4.1.stringRedisTemplate.opsForList().range(key, -4, -1) 4.2.stringRedisTemplate.opsForList().range(key, -3, -1) 4.3.stringRedisTemplate.opsForList().range(key, -3, -2) 4.4.stringRedi

  • laravel使用Redis实现网站缓存读取的方法详解

    redis的简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. Redis支持数据的备份,即master-slave模式的数据备份. Redis 优势 性能极高 – Red

  • Python使用循环神经网络解决文本分类问题的方法详解

    本文实例讲述了Python使用循环神经网络解决文本分类问题的方法.分享给大家供大家参考,具体如下: 1.概念 1.1.循环神经网络 循环神经网络(Recurrent Neural Network, RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络. 卷积网络的输入只有输入数据X,而循环神经网络除了输入数据X之外,每一步的输出会作为下一步的输入,如此循环,并且每一次采用相同的激活函数和参数.在每次循环中,x0乘以系数U得到s0,再经过系数W输入

  • redis分布式锁的go-redis实现方法详解

    在分布式的业务中 , 如果有的共享资源需要安全的被访问和处理 , 那就需要分布式锁 分布式锁的几个原则; 1.「锁的互斥性」:在分布式集群应用中,共享资源的锁在同一时间只能被一个对象获取. 2. 「可重入」:为了避免死锁,这把锁是可以重入的,并且可以设置超时. 3. 「高效的加锁和解锁」:能够高效的加锁和解锁,获取锁和释放锁的性能也好. 4. 「阻塞.公平」:可以根据业务的需要,考虑是使用阻塞.还是非阻塞,公平还是非公平的锁. redis实现分布式锁主要靠setnx命令 1. 当key存在时失败

  • MySQL解决SQL注入的另类方法详解

    本文实例讲述了MySQL解决SQL注入的另类方法.分享给大家供大家参考,具体如下: 问题解读 我觉得,这个问题每年带来的成本可以高达数十亿美元了.本文就来谈谈,假定我们有如下 SQL 模板语句: select * from T where f1 = '{value1}' and f2 = {value2} 现在我们需要根据用户输入值填充该语句: value1=hello value2=5 我们得到了下面的 SQL 语句,我们再提交给数据库: select * from T where f1='h

  • Laravel5.4框架中视图共享数据的方法详解

    本文实例讲述了Laravel5.4框架中视图共享数据的方法.分享给大家供大家参考,具体如下: 每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图空控制器中传入这些数据,但显然并不是我们想要的结果.另一种方法就是使用视图数据共享,视图数据共享的基本使用很简单,可查看视图文档了解详情,这里我们演示两个使用示例:在视图间共享数据和视图Composer 在视图中共享数据 除了在单个视图中传递指定数据之外,有时候需要在所有视图中传入同一数据,即我们需

  • PHP Session 变量的使用方法详解与实例代码

    当您运行一个应用程序时,您会打开它,做些更改,然后关闭它.这很像一次会话.计算机清楚你是谁.它知道你何时启动应用程序,并在何时终止.但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态.通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称.购买商品等).不过,会话信息是临时的,在用户离开网站后将被删除.如果您需要永久储存信息,可以把数据存储在数据库中. 把手册抄一下,然后每个都试试然后写出来,方便自己查阅滴,谁

  • Android Theme以及解决启动黑屏的方法详解

    前言 本文主要介绍了关于Android Theme及解决启动黑屏的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.修改AndroidManifest.xml 设置App的全局Theme或者Activity的界面Theme <application android:allowBackup="true" android:icon="@drawable/ipod_icon" android:label="@string/app

随机推荐