基于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 ...
随机推荐
- web前端开发面试题(附答案)-1
1.浏览器中输入url到网页显示,整个过程发生了什么 域名解析 发起tcp三次握手 建立tcp连接之后发起htttp请求 服务器端响应http请求,浏览器得到html代码 浏览器器解析html代码,并 ...
- Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)
Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二) 前言 上篇文章对Vue.js有了初步理解,接下来我们把Vue.js基础语法快速的过一遍,先混个脸熟留个印象就 ...
- NET Core 3.0 新姿势 将AutoFac替换内置DI
.NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServ ...
- thymeleaf 语法
一.语法: 1. 简单表达式 (simple expressions) ${...} 变量表达式 *{...} 选择变量表达式 #{...} 消息表达式 @{...} 链接url表达式 2.字 ...
- 【ADO.NET--MVC】初学MVC(MVC入门)(1)
最近一直在学MVC,本来今天想开始做项目了,但是一下手才发现还有好多好多都不懂,虽然想照搬别人的模板,但是还是觉得很虚,这也不懂哪也不懂.看来学习一门技术断不是那么简单,只要随便套套模板,看看别人代码 ...
- 在window里面安装ubuntu子系统并安装图形化界面
一.开启windows子系统 1. 在win10设置里面开启开发人员选项 (设置-->更新安全--> 开发者选项 )选择开启 2.在控制面板里面开启windows子系统 (启用或关闭wi ...
- 使用.NET Core创建Windows服务(二) - 使用Topshelf方式
原文:Creating Windows Services In .NET Core – Part 2 – The "Topshelf" Way 作者:Dotnet Core Tut ...
- java几个常见的基础错误
1.String 相等 稍微有点经验的程序员都会用equals比较而不是用 ==,但用equals就真的安全了吗,看下面的代码 user.getName().equals("xiaoming ...
- Kubernetes 系列(四):使用Traefik访问.net core api
一. 准备 本篇的要求是在前三篇的基础上已经搭建好的本地k8s以及部署了Traefik,我们将会使用Traefik Ingress来访问.net core api,比较简单,做个记录,如果还没有搭建k ...
- 经典面试题golang实现方式(一)
以下所有题目的关键信息都会用[]括起来,我们不对题目进行分析,只给出题目的解决方案:如有疑问请不吝赐教. 题目: 请实现一个算法,确定一个字符串的所有字符[是否全都不同].这里我们要求[不允许使用额外 ...