文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springboot中如何使用redis和分布式session共享

2023-05-30 22:38

关注

这篇文章主要介绍了springboot中如何使用redis和分布式session共享,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash、轮训、根据权重、随机等。不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题。

实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat、Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis)中。

本文旨在解决分布式系统的session如何共享问题,大致思路:session放入redis。其他解决方案:持久化、放cache等都可以,但是自从有了redis,这完全可以变的简简单单。

本文大致分两步:

springboot中如何使用redis。
2.redis如何解决session共享

pom依赖

  <!--redis配置开始-->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-redis</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.data</groupId>   <artifactId>spring-data-redis</artifactId>   <version>${spring-data-redis.version}</version>  </dependency>  <dependency>   <groupId>redis.clients</groupId>   <artifactId>jedis</artifactId>   <version>${jedis.version}</version>  </dependency>  <dependency>   <groupId>org.springframework.session</groupId>   <artifactId>spring-session-data-redis</artifactId>  </dependency>  <!--redis配置结束-->

添加redis配置类

该配置类同样可以配置缓存失效时间等。

package com.mos.quote.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {  @Bean  public KeyGenerator KeyGenerator(){    return (target, method, params) -> {      StringBuilder sb = new StringBuilder();      sb.append(target.getClass().getName());      sb.append(method.getName());      for (Object obj : params) {        sb.append(obj.toString());      }      return sb.toString();    };  }  @Bean  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {    StringRedisTemplate template = new StringRedisTemplate(factory);    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);    ObjectMapper om = new ObjectMapper();    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);    jackson2JsonRedisSerializer.setObjectMapper(om);    template.setValueSerializer(jackson2JsonRedisSerializer);    template.afterPropertiesSet();    return template;  }  @Bean  public CacheManager cacheManager(RedisTemplate<String,String> redisTemplate) {    RedisCacheManager rcm = new RedisCacheManager(redisTemplate);    //设置缓存过期时间    rcm.setDefaultExpiration(600000);    return rcm;  }}

配置redis服务

# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=192.168.1.118# Redis服务器连接端口spring.redis.port=6381# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

单元测试

set值(字符串)

  @Test  public void put(){    stringRedisTemplate.opsForValue().set("test001","test001");    Assert.assertEquals("test001", stringRedisTemplate.opsForValue().get("test001"));  }

往redis放一个key为test001、value为test001的值,然后查看redis

springboot中如何使用redis和分布式session共享

key=test001

set值(object)

 @Test  public void testObj() throws Exception {    SysUser user=new SysUser();    user.setId("123456");    user.setName("张三");    ValueOperations<String, SysUser> operations=redisTemplate.opsForValue();    operations.set("user1", user);    operations.set("user2", user,5, TimeUnit.SECONDS);    Thread.sleep(6000);    Assert.assertFalse(redisTemplate.hasKey("user2"));  }

往redis分别放key为user1和user2的对象,user2设置5秒失效,线程等待6秒再完成,期望结果:redis中有user1,没有user2,bingo!!!

springboot中如何使用redis和分布式session共享

ObjTest

解决session共享

使用spring-session-data-redis实现session共享,pom中引入该依赖(上文已添加),添加SessionConfig配置类。
对,没看错,只需要这个就够了。最长有效时间根据自己情况随意配置即可。

package com.mos.quote.config;import org.springframework.context.annotation.Configuration;import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;@Configuration@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3000)public class SessionConfig {}

测试

写一个简单Controller,如下

@RequestMapping("testSessionTimeOut")  public String testSessionTimeOut(String id,HttpSession session,Model model){    Area area = areaService.getById(id);    System.out.println("sessionId-------->"+session.getId());    model.addAttribute("area",JSON.toJSONString(area));    session.setAttribute("area",JSON.toJSONString(area));    return "demo/test1";  }

这里可以看到sessionId:

springboot中如何使用redis和分布式session共享

sessionId

看redis中,可以看到失效时间,sessionId等

springboot中如何使用redis和分布式session共享

sessionId

共享session

另外找一个机器,照着这个配置再来一遍,自动启用session共享,因为sessionId都存在了同一个redis中。

感谢你能够认真阅读完这篇文章,希望小编分享的“springboot中如何使用redis和分布式session共享”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯