【Redis】分布式Session
一、问题引出
1.1 Session的原理
//默认创建一个session,默认值为true没有找到对应的session 自动创建session
HttpSession session = request. getSession();
session.setAttribute("user", nameValue);
Object value = session.getAttribute("user");
- Session分为SessionId和SessionValue,Session本身是一个临时的,sessionid和token(令牌)非常相似保证临时且唯一;
- 请求和响应过程:服务器端接受到客户端请求,会创建一个Session,使用响应头返回SessionId给客户端。浏览器获取到SessionId后,保存在本地Cookie中;
- 下一次请求时:客户端读取到本地的SessionId,存放在请求头中,服务器端从请求头中获取到对应的Sessionid,使用SesisonId在本地Session内存中查询。
1.2 问题概述
1.分布式Session一致性(白话文服务器集群Session共享的问题)
2.分析分布式Session一致性
3.Session的作用?服务器(Tomcat) 与客户端(浏览器)保存整个通讯的会话基本信息。
4.应用场景: javaee基础 登陆流程做法(账号密码登陆成功之后,获取到userid,存放在session,下次获取用户信息的之后,直接从session会话中获取。)防止表单重复提交。
Session理解本地jvm缓存,sesison存放 服务器,返回sessionid给客户端。
二、解决方案
- 使用nginx (反向代理) ip绑定 同一个ip 只能在指定的同一个机器访问(没有 负载均衡)
- 使用数据库效率不是很高
- tomcat内置支持对session同步( 不推荐),同步可能会产生延迟
- 使用SpringSession框架相当于把我们的Session值缓存到redis中。面试题:你们项目在发布的时候,Session如何控制不失效的? 使用缓存框架,缓存Session的值(一级和二级) Spring Session重写httpsession框架,将对应的值缓存到redis中有点类似与一级和二级缓存
- 以使用token替代Session功能, sessionid不同他的域名也不同,移动会话信息使用令牌方式替代Session,Token最终存放在redis中, redis支持分布式共享
三、代码实现-使用Token代替Session
Token存放在Redis中
3.1 Service
RedisService.java
@Component
public class RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
// public void set(String key, Object object, Long time) {
// stringRedisTemplate.opsForValue();
// // 存放String 类型
// if (object instanceof String) {
// setString(key, object);
// }
// // 存放 set类型
// if (object instanceof Set) {
// setSet(key, object);
// }
// // 设置有效期 以秒为单位
// stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
// }
//
public void setString(String key, Object object) {
// 开启事务权限
// stringRedisTemplate.setEnableTransactionSupport(true);
try {
// 开启事务 begin
// stringRedisTemplate.multi();
String value = (String) object;
stringRedisTemplate.opsForValue().set(key, value);
System.out.println("存入完毕,马上开始提交redis事务");
// 提交事务
// stringRedisTemplate.exec();
} catch (Exception e) {
// 需要回滚事务
// stringRedisTemplate.discard();
}
}
public void setSet(String key, Object object) {
Set<String> value = (Set<String>) object;
for (String oj : value) {
stringRedisTemplate.opsForSet().add(key, oj);
}
}
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}
TokenService.java
@Service
public class TokenService {
@Autowired
private RedisService redisService;
// 新增 返回token
public String put(String value) {
//1.判断是否为空
if(value == null) {
return null;
}
//2. 获取对应的token(token实际等于key)
String token = getToken();
//3.存入redis中
redisService.setString(token, value);
//4.返回token
return token;
}
// 获取信息
public String get(String token) {
String reuslt = redisService.getString(token);
return reuslt;
}
public String getToken() {
return UUID.randomUUID().toString();
}
}
3.2 TokenController
@RestController
public class TokenController {
@Autowired
private TokenService tokenService;
@Value("${server.port}")
private String serverPort;
@RequestMapping("/put")
public String put(String nameValue) {
String token = tokenService.put(nameValue);
return token + "-" + serverPort;
}
@RequestMapping("/get")
public String get(String token) {
String value = tokenService.get(token);
return value + "-" + serverPort;
}
}
【Redis】分布式Session的更多相关文章
- C# redis 分布式session存储
https://github.com/uliian/SessionExtentionStore 一个基于Redis的Session存储扩展方案,解决ASP.NET中Session的局限性和跨应用程序使 ...
- Redis 分布式session
这里有三种和方式实现: 1.Harbour.RedisSessionStateStore , ServiceStack.Redis 配置web.config <sessionState mode ...
- 分布式中Redis实现Session终结篇
上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那么能不能实现无侵入式的分布式Session共 ...
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...
- redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题
先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...
- [Node.js] Node + Redis 实现分布式Session方案
原文地址: http://www.moye.me/?p=565 Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Sessi ...
- 分布式Session共享(一):tomcat+redis实现session共享
一.前言 本文主要测试redis实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port Tomcat ...
- 实现Asp.net Mvc分布式Session Redis群集
Redis群集实现Asp.net Mvc分布式Session Session的缺点 众所周知Asp.net Session默认存储在IIS中,IIS的重启会导致Session丢失. 如果你的网站使用了 ...
- 一篇文章让你深透理解cookie和session,附带分布式WEB系统redis共享session方案
cookie和session有什么区别?这是一个很基础的知识点,大家可能都知道一个大概:cookie是存在客户端的,session是存储在服务端,cookie和session用来验证识别用户的登录状态 ...
随机推荐
- pytorch0.4.1安装
pytorch官网:https://pytorch.org/ 这里安装pytorch0.4.1版本(最新版本为1.3.0系列,但是在跑github上的一些项目时会不断地报“ UseWarinig:Le ...
- Apache配置优化一(查看当前apache数据)
1.查看当前的运行模块 httpd -l 2.查看httpd进程数 ps -ef | grep httpd | wc -l 3.查看请求80服务的client ip按照连接数排序 netstat -n ...
- Spring Cloud(7.3):配置Consumer Server
接下来我们创建一个消费者服务.消费者服务从生产者服务拿取商品-价格信息,并保存在Redis中.同时,接收消息队列中生产者服务的更新提示,如果某个商品-价格被修改,则删除Redis中的缓存数据,并重新从 ...
- ubuntu18.04中将刚下载解压的eclipse添加到启动器
在/usr/share/applications/目录下新建一个名为eclipse.desktop的文件. 文件内容如下: [Desktop Entry] Version=2018.09 Name=E ...
- 【c# 学习笔记】所有类的父类:System.object
在c#中,所有的类都派生自System.Object类.如果定义的类,没有直达任何基类,编译器就会自动把Object类当作它的基类.和其他类 一样,System.Object类也定义了一组共有的成员, ...
- SVN安装使用【转】
SVN使用教程总结 SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Sub ...
- Flutter 弹出键盘屏幕溢出问题
在使用输入框获取焦点,弹出键盘的时候,会导致屏幕溢出, 解决办法: resizeToAvoidBottomPadding: false, //输入框抵住键盘 return Scaffold( appB ...
- 最新 乐游网络java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.乐游网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了乐游网络.6.7月主要是做系统复习.项目复盘.Leet ...
- centos7配置hadoop
hadoop压缩包下载: 链接:https://pan.baidu.com/s/1dz0Hh75VNKEebcYcbN-4Hw 提取码:g2e3 java压缩包下载: 链接:https://pan.b ...
- python之 -> 的含义
函数或方法标注通常用于 :类型提示:例如以下函数预期接受两个 int 参数并预期返回一个 int 值: def sum(a: int, b: int) -> int: return a + b ...