经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
redis实现分布式session的解决方案
来源:jb51  时间:2022/3/8 10:43:51  对本文有异议

一、首先Session

Session 是客户端与服务器通讯会话技术, 比如浏览器登陆、记录整个浏览会话信息。session存放在服务器,关闭浏览器不会失效。

Session实现原理

客户对向服务器端发送请求后,Session 创建在服务器端,返回Sessionid给客户端浏览器保存在本地,当下次发送请求的时候,在请求头中传递sessionId获取对应的从服务器上获取对应的Sesison

请求过程:

服务器端接受到客户端请求,会创建一个session,使用响应头返回 sessionId给客户端。客户端获取到sessionId后,保存到本地。

下次请求:客户端将本地的sessionId通过请求头发送到服务器。服务器从请求头获取到对应的sessionId,使用sessionId在本地session内存中查询。

  1. HttpSession session = request.getSession();
  2.  
  3. //默认创建一个session 默认值为true 没有找到对应的session 自动创建session
  4.  
  5. HttpSession session = request.getSession(false)
  6.  
  7. //true的情况是 客户端使用对应的sessionId查询不到对应的session 会直接创建一个新的session 如果有的话直接覆盖之前的
  8.  
  9. //false 客户端使用对应的sessionId查询不到对应的session 不会创建新的session

session 包括 sessionId和sessionValue

session本身是临时的 token(令牌)与 sessionId很相似 保证了临时且唯一

玩下session:

前提需要安装nginx

配置如下:

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

访问 www.toov5.com时候 走的nginx的服务器域名 然后默认监听的端口号80。 进而通过配置upstream 负载均衡!

lz在玩时候,弄到了半夜,也没排查出来原因,妈的气死了! 地址写成了 127.0.0.1

yml:

  1. server:
  2. port: 8080 

pom:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.toov5.loveCode</groupId>
  4. <artifactId>loveCode</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.0.0.RELEASE</version>
  10. <relativePath /> <!-- lookup parent from repository -->
  11. </parent>
  12. <properties>
  13. <weixin-java-mp.version>2.8.0</weixin-java-mp.version>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.build.locales>zh_CN</project.build.locales>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.projectlombok</groupId>
  23. <artifactId>lombok</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId>
  29. <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> -->
  30. </dependency>
  31. <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
  32. <dependency>
  33. <groupId>com.alibaba</groupId>
  34. <artifactId>fastjson</artifactId>
  35. <version>1.2.47</version>
  36. </dependency>
  37. <!-- Testing Dependencies -->
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-data-redis</artifactId>
  46. </dependency>
  47. <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
  48. <!-- <dependency>
  49. <groupId>org.springframework.session</groupId>
  50. <artifactId>spring-session-data-redis</artifactId>
  51. </dependency> -->
  52. <dependency>
  53. <groupId>org.apache.commons</groupId>
  54. <artifactId>commons-pool2</artifactId>
  55. </dependency>
  56. <dependency>
  57. <groupId>redis.clients</groupId>
  58. <artifactId>jedis</artifactId>
  59. </dependency>
  60. </dependencies>
  61. <build>
  62. <plugins>
  63. <plugin>
  64. <groupId>org.apache.maven.plugins</groupId>
  65. <artifactId>maven-compiler-plugin</artifactId>
  66. <configuration>
  67. <source>1.8</source>
  68. <target>1.8</target>
  69. </configuration>
  70. </plugin>
  71. <plugin>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-maven-plugin</artifactId>
  74. <configuration>
  75. <maimClass>com.meiteedu.WxMpApplication</maimClass>
  76. </configuration>
  77. <executions>
  78. <execution>
  79. <goals>
  80. <goal>repackage</goal>
  81. </goals>
  82. </execution>
  83. </executions>
  84. </plugin>
  85. </plugins>
  86. </build>
  87. </project>

服务器端代码:

  1. package com.toov5.loveCode;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5.  
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.boot.autoconfigure.SpringBootApplication;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10.  
  11. @SpringBootApplication
  12. @RestController
  13. public class TestSessionController {
  14. @Value("${server.port}")
  15. private String serverPort;
  16.  
  17. @RequestMapping("/")
  18. public String index() {
  19. return serverPort;
  20. }
  21.  
  22. // 创建session 会话
  23. @RequestMapping("/createSession")
  24. public String createSession(HttpServletRequest request, String nameValue) {
  25. // 默认 创建一个session,
  26. HttpSession session = request.getSession();
  27. System.out.println(
  28. "存入Session sessionid:信息" + session.getId() + ",nameValue:" + nameValue + ",serverPort:" + serverPort);
  29. session.setAttribute("name", nameValue);
  30. return "success-" + serverPort;
  31. }
  32.  
  33. // 获取session 会话
  34. @RequestMapping("/getSession")
  35. public Object getSession(HttpServletRequest request) {
  36. // 设置为true 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 会直接创建一个新的session
  37. // 设置为false 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 不 会直接创建一个新的session
  38. HttpSession session = request.getSession(true);
  39. if (session == null) {
  40. return serverPort + " 该服务器上没有存放对应的session值";
  41. }
  42. System.out.println("获取Session sessionid:信息" + session.getId() + "serverPort:" + serverPort);
  43. Object value = session.getAttribute("name");
  44. return serverPort + "-" + value;
  45. }
  46.  
  47. }

启动类:启动两次 端口号修改8080、 8081

  1. package com.toov5.loveCode;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6.  
  7.  
  8. @EnableAutoConfiguration
  9. @SpringBootApplication
  10. public class AppSession {
  11.  
  12. public static void main(String[] args) {
  13. SpringApplication.run(AppSession.class, args);
  14. }
  15.  
  16. }

运行结果:8080 和 8081来回切换 负载均衡

调用服务器端方法: fist 存放在8080

查询不到哦!

8081 没有 就创建新的session 覆盖原来的sessionId true没有就创建

下次 又去8080 又没有 又创建 来回折腾..............

此时:

修改false 没有时候不创建

然后传入 value 然后继续轮训访问;

二、分布式Session

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

2、Nginx的IP绑定 目的是同一个IP只能指定同一个机器访问(相当于没做集群了)

3、 使用数据库(效率低)

4、tomcat内置Session同步,通过广播可能产生延迟,占用带宽

5、使用 Spring-Session框架,相当于把session缓存缓存到redis中 (缓存框架,缓存Session的值)

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

Spring-Session 重写httpsession框架,将对应的值缓存到redis中,有点类似于一级、二级缓存。

必须要有的!

yml文件:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.toov5.loveCode</groupId>
  4. <artifactId>loveCode</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.0.0.RELEASE</version>
  10. <relativePath /> <!-- lookup parent from repository -->
  11. </parent>
  12. <properties>
  13. <weixin-java-mp.version>2.8.0</weixin-java-mp.version>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.build.locales>zh_CN</project.build.locales>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.projectlombok</groupId>
  23. <artifactId>lombok</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId>
  29. <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> -->
  30. </dependency>
  31. <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
  32. <dependency>
  33. <groupId>com.alibaba</groupId>
  34. <artifactId>fastjson</artifactId>
  35. <version>1.2.47</version>
  36. </dependency>
  37. <!-- Testing Dependencies -->
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-data-redis</artifactId>
  46. </dependency>
  47. <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
  48. <dependency>
  49. <groupId>org.springframework.session</groupId>
  50. <artifactId>spring-session-data-redis</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.apache.commons</groupId>
  54. <artifactId>commons-pool2</artifactId>
  55. </dependency>
  56. <dependency>
  57. <groupId>redis.clients</groupId>
  58. <artifactId>jedis</artifactId>
  59. </dependency>
  60. </dependencies>
  61. <build>
  62. <plugins>
  63. <plugin>
  64. <groupId>org.apache.maven.plugins</groupId>
  65. <artifactId>maven-compiler-plugin</artifactId>
  66. <configuration>
  67. <source>1.8</source>
  68. <target>1.8</target>
  69. </configuration>
  70. </plugin>
  71. <plugin>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-maven-plugin</artifactId>
  74. <configuration>
  75. <maimClass>com.meiteedu.WxMpApplication</maimClass>
  76. </configuration>
  77. <executions>
  78. <execution>
  79. <goals>
  80. <goal>repackage</goal>
  81. </goals>
  82. </execution>
  83. </executions>
  84. </plugin>
  85. </plugins>
  86. </build>
  87. </project>

 非常非常重要的:一定要jredis引入 同时这个对session提供了大力支持哈哈

yml 的redis配置文件:

  1. server:
  2. port: 8080
  3. redis:
  4. hostname: 192.168.91.3
  5. port: 6379
  6. password: 123

 后台业务逻辑:

  1. package com.toov5.loveCode;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5.  
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.boot.autoconfigure.SpringBootApplication;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10.  
  11. @SpringBootApplication
  12. @RestController
  13. public class TestSessionController {
  14. @Value("${server.port}")
  15. private String serverPort;
  16.  
  17. @RequestMapping("/")
  18. public String index() {
  19. return serverPort;
  20. }
  21.  
  22. // 创建session 会话
  23. @RequestMapping("/createSession")
  24. public String createSession(HttpServletRequest request, String nameValue) {
  25. // 默认 创建一个session,
  26. HttpSession session = request.getSession();
  27. System.out.println(
  28. "存入Session sessionid:信息" + session.getId() + ",nameValue:" + nameValue + ",serverPort:" + serverPort);
  29. session.setAttribute("name", nameValue);
  30. return "success-" + serverPort;
  31. }
  32.  
  33. // 获取session 会话
  34. @RequestMapping("/getSession")
  35. public Object getSession(HttpServletRequest request) {
  36. // 设置为true 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 会直接创建一个新的session
  37. // 设置为false 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 不 会直接创建一个新的session
  38. HttpSession session = request.getSession(false);
  39. if (session == null) {
  40. return serverPort + " 该服务器上没有存放对应的session值";
  41. }
  42. System.out.println("获取Session sessionid:信息" + session.getId() + "serverPort:" + serverPort);
  43. Object value = session.getAttribute("name");
  44. return serverPort + "-" + value;
  45. }
  46.  
  47. }

配置:

  1. package com.toov5.loveCode;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
  5. import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
  6.  
  7. //这个类用配置redis服务器的连接
  8. //maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)
  9. @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
  10. public class SessionConfig {
  11.  
  12. // 冒号后的值为没有配置文件时,制动装载的默认值
  13. @Value("${redis.hostname:localhost}")
  14. String HostName;
  15. @Value("${redis.port:6379}")
  16. int Port;
  17. @Value("${redis.password}")
  18. String password;
  19. @Bean
  20. public JedisConnectionFactory connectionFactory() {
  21. JedisConnectionFactory connection = new JedisConnectionFactory();
  22. connection.setPort(Port);
  23. connection.setHostName(HostName);
  24. connection.setPassword(password);
  25. return connection;
  26. }
  27. }

初始化:

  1. package com.toov5.loveCode;
  2.  
  3. import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
  4.  
  5. //初始化Session配置
  6. public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
  7. public SessionInitializer() {
  8. super(SessionConfig.class);
  9. }
  10. }

启动类:

  1. package com.toov5.loveCode;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6.  
  7.  
  8. @EnableAutoConfiguration
  9. @SpringBootApplication
  10. public class AppSession {
  11.  
  12. public static void main(String[] args) {
  13. SpringApplication.run(AppSession.class, args);
  14. }
  15.  
  16. }

虽然是存放在8081,但是访问时候 都有哦~ 大家试试玩玩吧~~

 引入的jar包重写了 HttpSession类 去解决Session共享问题

而此时的:redis

控制台:

补充:

Spring Boot 整合redis:

 到此这篇关于redis实现分布式session的解决方案的文章就介绍到这了,更多相关redis 分布式session内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号