日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

redis實現(xiàn)分布式session的解決方案_Redis

作者:toov5 ? 更新時間: 2022-05-07 編程語言

一、首先Session

Session 是客戶端與服務(wù)器通訊會話技術(shù), 比如瀏覽器登陸、記錄整個瀏覽會話信息。session存放在服務(wù)器,關(guān)閉瀏覽器不會失效。

Session實現(xiàn)原理

客戶對向服務(wù)器端發(fā)送請求后,Session 創(chuàng)建在服務(wù)器端,返回Sessionid給客戶端瀏覽器保存在本地,當(dāng)下次發(fā)送請求的時候,在請求頭中傳遞sessionId獲取對應(yīng)的從服務(wù)器上獲取對應(yīng)的Sesison

請求過程:

服務(wù)器端接受到客戶端請求,會創(chuàng)建一個session,使用響應(yīng)頭返回 sessionId給客戶端??蛻舳双@取到sessionId后,保存到本地。

下次請求:客戶端將本地的sessionId通過請求頭發(fā)送到服務(wù)器。服務(wù)器從請求頭獲取到對應(yīng)的sessionId,使用sessionId在本地session內(nèi)存中查詢。

HttpSession session = request.getSession(); 

//默認(rèn)創(chuàng)建一個session 默認(rèn)值為true 沒有找到對應(yīng)的session 自動創(chuàng)建session

HttpSession session = request.getSession(false)

//true的情況是 客戶端使用對應(yīng)的sessionId查詢不到對應(yīng)的session 會直接創(chuàng)建一個新的session 如果有的話直接覆蓋之前的

//false 客戶端使用對應(yīng)的sessionId查詢不到對應(yīng)的session 不會創(chuàng)建新的session

session 包括 sessionId和sessionValue

session本身是臨時的 token(令牌)與 sessionId很相似 保證了臨時且唯一

玩下session:

前提需要安裝nginx

配置如下:

host文件:c:\windows\system32\drivers\etc

訪問 www.toov5.com時候 走的nginx的服務(wù)器域名 然后默認(rèn)監(jiān)聽的端口號80。 進(jìn)而通過配置upstream 負(fù)載均衡!

lz在玩時候,弄到了半夜,也沒排查出來原因,媽的氣死了! 地址寫成了 127.0.0.1

yml:

server:
  port: 8080 

pom:


  4.0.0
  com.toov5.loveCode
  loveCode
  0.0.1-SNAPSHOT
   
  
        org.springframework.boot
        spring-boot-starter-parent
        2.0.0.RELEASE
         
    
    
        2.8.0
        1.8
        1.8
        UTF-8
        UTF-8
        zh_CN
    
 
    
        
            org.projectlombok
            lombok
        
        
            org.springframework.boot
            spring-boot-starter-web
            
        
        
        
            com.alibaba
            fastjson
            1.2.47
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
        
        
            org.apache.commons
            commons-pool2
        
        
            redis.clients
            jedis
        
 
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    com.meiteedu.WxMpApplication
                
                
                    
                        
                            repackage
                        
                    
                
 
            
        
    
   

服務(wù)器端代碼:

package com.toov5.loveCode;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class TestSessionController {
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping("/")
    public String index() {
        return serverPort;
    }

    // 創(chuàng)建session 會話
    @RequestMapping("/createSession")
    public String createSession(HttpServletRequest request, String nameValue) {
        // 默認(rèn) 創(chuàng)建一個session,
        HttpSession session = request.getSession();
        System.out.println(
                "存入Session  sessionid:信息" + session.getId() + ",nameValue:" + nameValue + ",serverPort:" + serverPort);
        session.setAttribute("name", nameValue);
        return "success-" + serverPort;
    }

    // 獲取session 會話
    @RequestMapping("/getSession")
    public Object getSession(HttpServletRequest request) {
        // 設(shè)置為true 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 會直接創(chuàng)建一個新的session
        // 設(shè)置為false 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 不 會直接創(chuàng)建一個新的session
        HttpSession session = request.getSession(true);
        if (session == null) {
            return serverPort + "  該服務(wù)器上沒有存放對應(yīng)的session值";
        }
        System.out.println("獲取Session sessionid:信息" + session.getId() + "serverPort:" + serverPort);
        Object value = session.getAttribute("name");
        return serverPort + "-" + value;
    }

}

啟動類:啟動兩次 端口號修改8080、 8081

package com.toov5.loveCode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@EnableAutoConfiguration
@SpringBootApplication
public class AppSession {

    public static void main(String[] args) {
        SpringApplication.run(AppSession.class, args);
    }

}

運(yùn)行結(jié)果:8080 和 8081來回切換 負(fù)載均衡

調(diào)用服務(wù)器端方法: fist 存放在8080

查詢不到哦!

8081 沒有 就創(chuàng)建新的session 覆蓋原來的sessionId true沒有就創(chuàng)建

下次 又去8080 又沒有 又創(chuàng)建 來回折騰..............

此時:

修改false 沒有時候不創(chuàng)建

然后傳入 value 然后繼續(xù)輪訓(xùn)訪問;

二、分布式Session

1、直接使用cookie替代session 不安全(存客戶端)

2、Nginx的IP綁定 目的是同一個IP只能指定同一個機(jī)器訪問(相當(dāng)于沒做集群了)

3、 使用數(shù)據(jù)庫(效率低)

4、tomcat內(nèi)置Session同步,通過廣播可能產(chǎn)生延遲,占用帶寬

5、使用 Spring-Session框架,相當(dāng)于把session緩存緩存到redis中 (緩存框架,緩存Session的值)

6、可以使用token替代session功能。自定義令牌替代session

Spring-Session 重寫httpsession框架,將對應(yīng)的值緩存到redis中,有點類似于一級、二級緩存。

必須要有的!

yml文件:


  4.0.0
  com.toov5.loveCode
  loveCode
  0.0.1-SNAPSHOT
   
  
        org.springframework.boot
        spring-boot-starter-parent
        2.0.0.RELEASE
         
    
    
        2.8.0
        1.8
        1.8
        UTF-8
        UTF-8
        zh_CN
    
 
    
        
            org.projectlombok
            lombok
        
        
            org.springframework.boot
            spring-boot-starter-web
            
        
        
        
            com.alibaba
            fastjson
            1.2.47
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
           
            org.springframework.session
            spring-session-data-redis
        
        
            org.apache.commons
            commons-pool2
        
        
            redis.clients
            jedis
        
 
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    com.meiteedu.WxMpApplication
                
                
                    
                        
                            repackage
                        
                    
                
 
            
        
    
   

 非常非常重要的:一定要jredis引入 同時這個對session提供了大力支持哈哈

yml 的redis配置文件:

server:
  port: 8080
 
redis:
  hostname: 192.168.91.3    
  port:  6379
  password:  123

 后臺業(yè)務(wù)邏輯:

package com.toov5.loveCode;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class TestSessionController {
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping("/")
    public String index() {
        return serverPort;
    }

    // 創(chuàng)建session 會話
    @RequestMapping("/createSession")
    public String createSession(HttpServletRequest request, String nameValue) {
        // 默認(rèn) 創(chuàng)建一個session,
        HttpSession session = request.getSession();
        System.out.println(
                "存入Session  sessionid:信息" + session.getId() + ",nameValue:" + nameValue + ",serverPort:" + serverPort);
        session.setAttribute("name", nameValue);
        return "success-" + serverPort;
    }

    // 獲取session 會話
    @RequestMapping("/getSession")
    public Object getSession(HttpServletRequest request) {
        // 設(shè)置為true 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 會直接創(chuàng)建一個新的session
        // 設(shè)置為false 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 不 會直接創(chuàng)建一個新的session
        HttpSession session = request.getSession(false);
        if (session == null) {
            return serverPort + "  該服務(wù)器上沒有存放對應(yīng)的session值";
        }
        System.out.println("獲取Session sessionid:信息" + session.getId() + "serverPort:" + serverPort);
        Object value = session.getAttribute("name");
        return serverPort + "-" + value;
    }

}

配置:

package com.toov5.loveCode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

//這個類用配置redis服務(wù)器的連接
//maxInactiveIntervalInSeconds為SpringSession的過期時間(單位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {

    // 冒號后的值為沒有配置文件時,制動裝載的默認(rèn)值
    @Value("${redis.hostname:localhost}")
    String HostName;
    @Value("${redis.port:6379}")
    int Port;
    @Value("${redis.password}") 
    String password;
    
    @Bean
    public JedisConnectionFactory connectionFactory() {
        JedisConnectionFactory connection = new JedisConnectionFactory();
        connection.setPort(Port);
        connection.setHostName(HostName);
        connection.setPassword(password);
        return connection;
    }
}

初始化:

package com.toov5.loveCode;

import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;

//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
    public SessionInitializer() {
        super(SessionConfig.class);
    }
}

啟動類:

package com.toov5.loveCode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@EnableAutoConfiguration
@SpringBootApplication
public class AppSession {

    public static void main(String[] args) {
        SpringApplication.run(AppSession.class, args);
    }

}

雖然是存放在8081,但是訪問時候 都有哦~ 大家試試玩玩吧~~

 引入的jar包重寫了 HttpSession類 去解決Session共享問題

而此時的:redis

控制臺:

補(bǔ)充:

Spring Boot 整合redis:

原文鏈接:https://www.cnblogs.com/toov5/p/9903017.html

欄目分類
最近更新