您现在的位置是:网站首页> 编程资料编程资料

redis实现分布式session的解决方案_Redis_

2023-05-27 509人已围观

简介 redis实现分布式session的解决方案_Redis_

一、首先Session

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

Session实现原理

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

请求过程:

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

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

HttpSession session = request.getSession(); //默认创建一个session 默认值为true 没有找到对应的session 自动创建session HttpSession session = request.getSession(false) //true的情况是 客户端使用对应的sessionId查询不到对应的session 会直接创建一个新的session 如果有的话直接覆盖之前的 //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:

server: port: 8080 

pom:

4.0.0com.toov5.loveCodeloveCode0.0.1-SNAPSHOTorg.springframework.bootspring-boot-starter-parent2.0.0.RELEASE2.8.01.81.8UTF-8UTF-8zh_CNorg.projectlomboklombokorg.springframework.bootspring-boot-starter-webcom.alibabafastjson1.2.47org.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-data-redisorg.apache.commonscommons-pool2redis.clientsjedisorg.apache.maven.pluginsmaven-compiler-plugin1.81.8org.springframework.bootspring-boot-maven-plugincom.meiteedu.WxMpApplicationrepackage

服务器端代码:

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; } // 创建session 会话 @RequestMapping("/createSession") public String createSession(HttpServletRequest request, String nameValue) { // 默认 创建一个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) { // 设置为true 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 会直接创建一个新的session // 设置为false 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 不 会直接创建一个新的session HttpSession session = request.getSession(true); if (session == null) { return serverPort + " 该服务器上没有存放对应的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); } }

运行结果: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文件:

4.0.0com.toov5.loveCodeloveCode0.0.1-SNAPSHOTorg.springframework.bootspring-boot-starter-parent2.0.0.RELEASE2.8.01.81.8UTF-8UTF-8zh_CNorg.projectlomboklombokorg.springframework.bootspring-boot-starter-webcom.alibabafastjson1.2.47org.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-data-redisorg.springframework.sessionspring-session-data-redisorg.apache.commonscommons-pool2redis.clientsjedisorg.apache.maven.pluginsmaven-compiler-plugin1.81.8org.springframework.bootspring-boot-maven-plugincom.meiteedu.WxMpApplication<
                
                

-六神源码网