天天看點

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

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

內建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:[email protected]}");


    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中放入對象

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

2.8081端口請求session中對象

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

開箱即用的便利

注釋掉第二步內建spring-session-Redis後的配置,隻導入jar包進行測試,其session還是存入了Redis中,結果如上面二圖所示,跟增加配置後的效果一緻

将引入spring-session-Redis jar包也注釋掉 進行測試,也就是回到沒內建session-redis前,如下圖所示,此時session不再存放在Redis中,且不同端口号之間的session不互通,相同端口session也會有過期時間。

1.8080往session中放入對象

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

2.8081讀取session資訊

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

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