基于redis解决session分布式一致性问题
1.session是什么
当用户在前端发起请求时,服务器会为当前用户建立一个session,服务器将sessionId回写给客户端,只要用户浏览器不关闭,再次请求服务器时,将sessionId传给服务器,
服务器会根据sessionId找到与之对应的session为其服务。
如果是分布式部署时,session存储在服务器端,下次用户请求过来,通过负载均衡,可能会分发到其他服务器节点;所以,需要解决session一致性的问题,
使用redis来实现分布式session,个人理解是将session存放到redis中,每次请求过来时,会从redis读取session信息
2.代码实现
①.maven需要引入的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
②.配置文件指定redis的ip和端口
spring.redis.host=172.18.66.45
spring.redis.port=6379
③.httpSession配置
package com.session.config; 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;
//maxInactiveIntervalInSeconds设置session有效时间,单位是秒;默认是30分钟
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=180)
public class SessionConfig { @Value("${spring.redis.host}")
private String hostName;
@Value("${spring.redis.port}")
private int port; @Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPort(port);
connectionFactory.setHostName(hostName);
System.out.println("获取到的hostName是:"+hostName + ",port :"+port);
return connectionFactory;
}
}
再实现一个controller,就可以模拟实际业务场景写session、根据session校验用户是否登录
package com.session.controller; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class SessionController { //模拟第一次登陆时,保存session
@RequestMapping(value="/login")
public String login(HttpServletRequest request) {
HttpSession session = request.getSession();
String str = (String) session.getAttribute("userInfo");
if(str == null || "".equals(str)) {
session.setAttribute("userInfo", "mpy test session");
return "用户登录成功-success";
}else{
return "session中存在数据,用户已登录";
}
} /*该方法模式登陆之后,调用业务接口
*在实际的业务场景中,可以使用拦截器,对每次请求进行判断,校验用户是否登录、session是否过期
*/
@RequestMapping(value="/getSession")
public String getSession(HttpServletRequest request) {
HttpSession session = request.getSession();
String str = (String) session.getAttribute("userInfo");
if(str == null || "".equals(str)) {
return "session中没有数据,请登录";
}else{
//已登录用户,进行其他业务代码的处理
System.out.println("session中的属性是:"+str);
return str;
}
} @RequestMapping(value="/logout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession();
String str = (String) session.getAttribute("userInfo");
if(str != null && "".equals(str)) {
session.invalidate();
}
return "退出成功";
}
}
@EnableRedisHttpSession和spring-session的实现原理还有待研究学习
具体的代码,已经上传至GitHub,https://github.com/mapy95/spring-session.git
基于redis解决session分布式一致性问题的更多相关文章
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...
- .Net分布式架构(二):基于Redis的Session共享
一:Session简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台web服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台web服务器建立连 ...
- 基于redis的简易分布式爬虫框架
代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...
- 基于redis实现的分布式锁
基于redis实现的分布式锁 我们知道,在多线程环境中,锁是实现共享资源互斥访问的重要机制,以保证任何时刻只有一个线程在访问共享资源.锁的基本原理是:用一个状态值表示锁,对锁的占用和释放通过状态值来标 ...
- Tomcat7基于Redis的Session共享实战二
目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无 ...
- 基于Redis的简单分布式锁的原理
参考资料:https://redis.io/commands/setnx 加锁是为了解决多线程的资源共享问题.Java中,单机环境的锁可以用synchronized和Lock,其他语言也都应该有自己的 ...
- Tomcat7基于redis的session共享
一,项目需求 因开发人员在登录后台时需要反复认证,tomcat反复切换,所以给运维组提出需求,解决session共享问题. 二,解决方法 环境:基于Centos6.8 Jdk 版本 java ve ...
- [转]Tomcat7基于Redis的Session共享
转自:http://blog.csdn.net/catoop/article/details/48603891 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均 ...
- Tomcat7基于Redis的Session共享实战一
本文主要介绍如何使用redis对tomcat7的session进行托管. 1.安装Redisredis安装比较简单,此处略过. 2.配置两个Tomcat在本机上配置两个Tomcat,分别为tomcat ...
随机推荐
- 使用Fedora8 iso开发环境开发gtk3跨Linux多版本桌面应用
原文: https://bbs.otherhill.com/index.php/topic/show/82 gtk3 demo在/usr/local/gtk3demo 目录下 cd /usr/loca ...
- selenium-05-常见问题
一:日期控件 selenium不能直接对日期控件操作,可以通过js对日期控件做赋值操作 WebElement inputTimeBox=driver.findElement(by.name(" ...
- python库之turtle(图形绘制) 开启新的快乐源泉
相信有不少人学习python 都是听了老前辈的推荐 “学python好,python有趣的代码多” 比如说画一只小狮子 这就是今天想要介绍的绘制图形库-turtle 如果也想这样画一只小狮子,或者其他 ...
- 基于计算机操作系统的Linux的进程管理
一.实验目的 1.熟悉和理解进程和进程树的概念,掌握有关进程的管理机制. 2.了解进程与程序.并行与串行执行的区别. 3.掌握使用Linux命令管理和操作进程的方法 二.实验内容 1. 用ps命令观察 ...
- 从壹开始学习NetCore 45 ║ 终于解决了事务问题
一.项目说明 哈喽,又来写文章了,原来放假可以这么爽,可以学习和分享,
- SpringBoot数据聚合(spring-boot-data-aggregator-starter)
背景 接口开发是后端开发中最常见的场景, 可能是RESTFul接口, 也可能是RPC接口. 接口开发往往是从各处捞出数据, 然后组装成结果, 特别是那些偏业务的接口. 例如, 我现在需要实现一个接口, ...
- angular6 iframe应用
问题一. iframe如何自适应屏幕高度 解决思路:通过设置iframe外层父元素高度等于window高度,再相对于父元素定位iframe元素:案例如下: 第一步: 模板文件中使用iframe // ...
- 前端深入之css篇|link和@import到底有什么区别?
写在前面 在真正的前端开发中,我们很少去写行内样式和内嵌样式,通常都是去引用外部样式. 而在我们学习之初的外部样式表都是用link引入的,但是当后来我们学习的逐渐深入,发现@import也可以引入样式 ...
- pyinstaller 打包exe程序读不到配置文件No such file
挺久没更新博客的,一来之前是觉得才疏学浅,记录下来的太简单没人看.二来时间上不是很充裕(不是借口,有时间打游戏,没时间总结) 偶然有一次发现同事在搜索解决问题的时候正在看我博客的解决思路,很奇妙的感觉 ...
- Spark 学习笔记之 共享变量
共享变量: 共享变量通常情况下,当向Spark操作(如map,reduce)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被 ...