如何利用Redis实现分布式Session?
在web开发中,我们会把用户的登录信息存储在「session」里。而session是依赖于「cookie」的,即服务器创建session时会给它分配一个唯一的ID,并且在响应时创建一个cookie用于存储这个「sessionId」。当客户端收到这个cookie之后,就会自动保存这个sessionId,并且在下次访问时自动携带这个sessionId,届时服务器就可以通过这个sessionId得到与之对应的session,从而识别用户的身。如下图:
现在的互联网应用,基本都是采用分布式部署方式,即将应用程序部署在多台服务器上,并通过nginx做统一的请求分发。而服务器与服务器之间是隔离的,它们的session是「不共享」的,这就存在session「同步」的问题了,如下图:
如果客户端第一次访问服务器,请求被分发到了服务器A上,则服务器A会为该客户端创建session。如果客户端再次访问服务器,请求被分发到服务器B上,则由于服务器B中没有这个session,所以用户的身份无法得到验证,从而产生了「不一致」的问题。
解决这个问题的办法有很多,比如可以协调多个服务器,让他们的session保持同步。也可以在分发请求时做绑定处理,即将某一个IP固定分配给同一个服务器。但这些方式都比较麻烦,而且性能上也有一定的消耗。更合理的方式就是采用类似于Redis这样的高性能缓存服务器,来实现分布式session。
从上面的叙述可知,我们使用session保存用户的身份信息,本质上是要做两件事情:
- 第一是保存用户的身份信息;
- 第二是验证用户的身份信息。
如果利用其它手段实现这两个目标,那么就可以不用session,或者说我们使用的是广义上的session了。
具体实现的思路如下图,我们在服务端增加两段程序:
- 第一是「创建令牌」的程序,就是在用户初次访问服务器时,给它创建一个「唯一的身份标识」,并且使用cookie封装这个标识再发送给客户端。那么当客户端下次再访问服务器时,就会自动携带这个身份标识了,这和sessionId的道理是一样的,只是改由我们自己来实现了。另外,在返回令牌之前,我们需要将它存储起来,以便于后续的验证。而这个令牌是不能保存在服务器本地的,因为其他服务器无法访问它。因此,我们可以将其存储在服务器之外的一个地方,那么Redis便是一个理想的场所。
- 第二是「验证令牌」的程序,就是在用户再次访问服务器时,我们获取到了它之前的身份标识,那么我们就要验证一下这个标识是否存在了。验证的过程很简单,我们从Redis中尝试获取一下就可以知道结果。
如何利用Redis实现分布式Session?相关推荐
- 场景应用:利用Redis实现分布式Session
文章目录 原理:Redis实现分布式Session web开发session 分布式session同步问题 分布式session解决方案 实战:Redis实现分布式Session 技术栈:Spring ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloopimport tornado.webfrom myhash ...
- SpringSession+redis解决分布式session不一致性问题
七.案例实战:SpringSession+redis解决分布式session不一致性问题 步骤1:加入SpringSession.redis的依赖包 <dependency><gro ...
- 使用Spring Session和Redis解决分布式Session跨域共享问题
大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...
- 8.redis解决分布式session问题 、redis在项目中难点
a.什么是session session是一种会话技术,我们知道http是无状态协议的,就是这次连接传输数据后,下次连接服务器是不知道这次的请求是谁的,因此我们要做一个标记,让服务器知道每次请求是哪个 ...
- c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...
- Redis实现分布式Session管理
管理机制 redis的session管理是利用spring提供的session管理解决方案,将一个应用session交给Redis存储,整个应用中所有session的请求都会去redis中获取对应的s ...
- 利用redis实现分布式锁
一.背景 在分布式项目中,由于一个服务会有多个实例运行,有些特定的场景需要我们用到分布式锁. 例如:最近我正在做的交易所项目,其中一个服务是钱包模块,需要每半个小时就去归集用户的资金,这个定时任务只能 ...
最新文章
- openoj的一个小比赛(F题解题报告)poj3978(dp+素数筛选)
- 掌握shell应用,Linux任你行走
- redhat 添加ssh端口_RHEL 7修改ssh默认端口号
- 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程)
- android sp缓存,Android sharedPreference设置缓存时间
- irf和链路聚合综合实验
- Java软件开发修炼过程
- Cocoa Touch框架浅析
- Python数学问题5:输入三个整数并由小到大进行输出
- 从零开始搭建自己的网站可外网访问从购买服务器开始
- Android的数据存储:SharedPrefrence存储,手机内部文件存储,手机外部文件存储
- Java流程控制之do....while 循环的详解,看完你就会
- python图色模拟脚本_python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
- ORA-02019:未找到远程数据库的连接说明(数据库链接创建)
- Labelme标注的json数据转化为coco格式的数据
- 实现Linux下的cp命令
- matlab 雷诺,matlab求解雷诺方程
- word2vec基础(非常容易理解)
- 租房项目 获取地区信息服务
- 智能优化算法:蜣螂优化算法-附代码