首頁 > 軟體

Redis解決Session共用問題的方法詳解

2022-07-11 14:04:05

企業專案中,一般都是將專案部署到多臺伺服器上,用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共用的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com