2步轻松搞定SpringBoot2.x分布式session共享,极少配置

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 不配置RedisTemplate,也是可以自动注入StringRedisTemplate进行redis的读写操作,但是不能注入 RedisTemplate对象,这里先配置了 RedisTemplate来操作redis。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

集成redis
1.引入jar包

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

2.配置属性
在application.properties增加Redis服务的相关信息

#################redis单服务基础配置#################
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.password=
spring.redis.port=6379
  1. RedisTemplate配置
/**
   * RedisTemplate配置
     */
  @Bean
  public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    // 设置序列化
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
        Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    // 配置redisTemplate
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    RedisSerializer<?> stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringSerializer);// key序列化
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
    redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
  }

不配置RedisTemplate,也是可以自动注入StringRedisTemplate进行redis的读写操作,但是不能注入 RedisTemplate对象,这里先配置了 RedisTemplate来操作redis。

@RequestMapping(path = "/redis" )
public class RedisController {
    @Autowired
  private StringRedisTemplate stringRedisTemplate;

  @Autowired
  private RedisTemplate<String, Object> redisTemplate;
       /**
   * stringRedisTemplate 传入对象
   * @return
   */
  @GetMapping("/test2")
  public UUser testRedis2() {
    UUser user = new UUser();
    user.setUserName("test2");
    user.setEmail("11费@QQ.com");
    stringRedisTemplate.opsForValue().set("A2", JSONObject.toJSONString(user));
    UUser stu1 = JSONObject.parseObject(stringRedisTemplate.opsForValue().get("A2"), UUser.class);
    return stu1;
  }

  /**
   * redisTemplate传入对象
   * @return
   */
  @GetMapping("/test1")
  public UUser testRedis1() {
    UUser user = new UUser();
    user.setUserName("test1");
    user.setEmail("11飞@163.com");
    redisTemplate.opsForValue().set("A1", user);
    UUser stu1 = (UUser) redisTemplate.opsForValue().get("A1");
// redisTemplate.delete("A1");
    return stu1;
  }
}

通过localhost:8080/redis/test1、localhost:8080/redis/test2来进行验证
5.可配置连接池

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

Jedis与Lettuce的区别:
Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接
Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

springboot2.0后将之前的jedis已经改成Lettuce,默认使用Lettuce

集成spring-session-Redis

参考 https://blog.csdn.net/qq_35206261/article/details/82289066

1 引入jar包

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

2 配置

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1900)
public class RedisSessionConfig {


}

application.properties增加

spring.session.store-type=redis

也可不进行配置,都有默认值,开箱即用。
这里的maxInactiveIntervalInSeconds设置还没生效,原因还在寻找中。

@RestController
@RequestMapping(path = "/redis" )
public class RedisController {
  /**
   * session测试
   * @param request
   * @return
   */
  @RequestMapping(value = "/session", method = RequestMethod.GET)
  public Map<String, String> addSession (HttpServletRequest request){
    String sessionId = request.getSession().getId();
    String requestURI = request.getRequestURI() + ":"  + request.getServerPort();
    // 向session中保存用户信息 key规则:user + "_" + uid
    request.getSession().setAttribute("user_1", "{uid:1,username:11@qq.com}");


    Map<String, String> sessionInfoMap = new HashMap<>(2);
    sessionInfoMap.put("sessionId", sessionId);
    sessionInfoMap.put("requestURI", requestURI);
    return sessionInfoMap;
  }

  /**
   * session测试
   * @param request
   * @return
   */
  @RequestMapping(value = "/getSession", method = RequestMethod.GET)
  public Map<String, String> getSession (HttpServletRequest request){
    String sessionId = request.getSession().getId();
    String requestURI = request.getRequestURI() + ":"  + request.getServerPort();

    Map<String, String> sessionInfoMap = new HashMap<>(2);
    // 获取session中uid为1的用户的信息
    String user_1 = (String) request.getSession().getAttribute("user_1");

    sessionInfoMap.put("sessionId", sessionId);
    sessionInfoMap.put("requestURI", requestURI);
    sessionInfoMap.put("user_1", user_1);
    return sessionInfoMap;
  }
}

分别启动不同的端口号,使用浏览器、postman、rest client测试sessionID

结果:使用同一工具,例如postman测试不同端口号请求,其sessionId值一致,并且能从一个端口获取另一个端口存在request中的user信息。session数据存放在redis中

1.8080端口往session中放入对象
9503290E_83C0_42a4_99A9_AF4B7EB71BF7
2.8081端口请求session中对象

584A66B9_4237_493f_959B_CD228A109B1F

开箱即用的便利

注释掉第二步集成spring-session-Redis后的配置,只导入jar包进行测试,其session还是存入了Redis中,结果如上面二图所示,跟增加配置后的效果一致

将引入spring-session-Redis jar包也注释掉 进行测试,也就是回到没集成session-redis前,如下图所示,此时session不再存放在Redis中,且不同端口号之间的session不互通,相同端口session也会有过期时间。

1.8080往session中放入对象
96795D60_9685_42e4_B37B_66B99FCBAB82
2.8081读取session信息
E0BF97E4_E531_4676_B3D4_F8452842FB2D
B9B4EADB_C4D1_4f9a_A8C4_2F2D3653F1D3
3.8081再次读取session信息(刷新一次)
结果:相同端口之间的session共享,不同端口间session隔离
出现上下两种情况是springboot开箱即用的效果,引入jar包后无需配置即可使用。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-06-28
本文作者:日常打BUG
本文来自:“互联网架构师 微信公众号 ”,了解相关信息可以关注“[互联网架构师](https://mp.weixin.qq.com/s/IKNoYdFTrNjdOGlkwnfg5w

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
27天前
|
NoSQL Java Redis
Springboot使用Redis实现分布式锁
通过这些步骤和示例,您可以系统地了解如何在Spring Boot中使用Redis实现分布式锁,并在实际项目中应用。希望这些内容对您的学习和工作有所帮助。
160 83
|
9天前
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
98 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
18天前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
2月前
|
消息中间件 负载均衡 Java
如何设计一个分布式配置中心?
这篇文章介绍了分布式配置中心的概念、实现原理及其在实际应用中的重要性。首先通过一个面试场景引出配置中心的设计问题,接着详细解释了为什么需要分布式配置中心,尤其是在分布式系统中统一管理配置文件的必要性。文章重点分析了Apollo这一开源配置管理中心的工作原理,包括其基础模型、架构模块以及配置发布后实时生效的设计。此外,还介绍了客户端与服务端之间的交互机制,如长轮询(Http Long Polling)和定时拉取配置的fallback机制。最后,结合实际工作经验,分享了配置中心在解决多台服务器配置同步问题上的优势,帮助读者更好地理解其应用场景和价值。
115 18
|
4月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
243 53
|
3月前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
89 3
|
负载均衡 NoSQL Java
SpringBoot 实现Session共享
HttpSession,是通过Servlet容器创建并进行管理的,创建成功以后将会保存在内存中,这里将会使用Redis解决session共享的问题。
2268 0
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!