1. 程式人生 > >Redis共享Session原理及示例

Redis共享Session原理及示例

Redis共享session的作用

  • 微服務自身可以保持無狀態,應用例項數量的多少不會影響使用者登入狀態;
  • 可實現單點登入的踢出功能,如可以讓上次異地登入的使用者下線;
  • session在多個服務或伺服器間共享,實現多站點單點登入(參考SSO服務)

Redis快取session原理簡述

其工作原理,可簡單用圖描述(假設服務A執行有有個多個例項):
在這裡插入圖片描述

Springboot-session結合Redis示例

  • 新增maven依賴
		<dependency>  
				<groupId>org.springframework.boot</
groupId
>
<artifactId>spring-boot-starter-redis</artifactId> <version>1.4.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId>
</dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.3.3.RELEASE</version> </dependency>
  • 新增redis配置(application.properties)
spring.redis.database=1  
spring.redis.host=localhost
spring.redis.password=xxxxx
spring.redis.port=6379

# server.port=8080
server.port=8081
  • 新增配置類
package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration  
@EnableRedisHttpSession  
public class RedisSessionConfig {  
}
  • 新增controller
package com.example.demo.controller;

import java.util.*;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@RestController  
@RequestMapping(value = "/")
public class Hello {  
    @RequestMapping(value = "/set", method = RequestMethod.GET)  
    public Map<String, Object> firstResp (HttpServletRequest request){           
        request.getSession().setAttribute("testKey", "testValue");

        Map<String, Object> map = new HashMap<>(); 
        map.put("testKey", "testValue");  
        return map;
    }
  
    @RequestMapping(value = "/query", method = RequestMethod.GET)  
    public Object sessions (HttpServletRequest request){
        Map<String, Object> map = new HashMap<>();
        map.put("sessionId", request.getSession().getId());
        map.put("testKey", request.getSession().getAttribute("testKey"));
        return map;
    }
} 
  • 瀏覽器訪問測試

    • 啟動兩個springboot程式,分別監聽8080,8081埠
    • 瀏覽器分別訪問http://127.0.0.1:8080/set, 127.0.0.1:8081/query介面,效果如下:
      在這裡插入圖片描述
    • 檢視redis中的key
      在這裡插入圖片描述

可以看出兩個獨立的應用已經共享了同一個session。