在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保存用户的身份信息,本质上是要做两件事情:

  1. 第一是保存用户的身份信息;
  2. 第二是验证用户的身份信息。

如果利用其它手段实现这两个目标,那么就可以不用session,或者说我们使用的是广义上的session了。

具体实现的思路如下图,我们在服务端增加两段程序:

  1. 第一是「创建令牌」的程序,就是在用户初次访问服务器时,给它创建一个「唯一的身份标识」,并且使用cookie封装这个标识再发送给客户端。那么当客户端下次再访问服务器时,就会自动携带这个身份标识了,这和sessionId的道理是一样的,只是改由我们自己来实现了。另外,在返回令牌之前,我们需要将它存储起来,以便于后续的验证。而这个令牌是不能保存在服务器本地的,因为其他服务器无法访问它。因此,我们可以将其存储在服务器之外的一个地方,那么Redis便是一个理想的场所。
  2. 第二是「验证令牌」的程序,就是在用户再次访问服务器时,我们获取到了它之前的身份标识,那么我们就要验证一下这个标识是否存在了。验证的过程很简单,我们从Redis中尝试获取一下就可以知道结果。

如何利用Redis实现分布式Session?相关推荐

  1. 场景应用:利用Redis实现分布式Session

    文章目录 原理:Redis实现分布式Session web开发session 分布式session同步问题 分布式session解决方案 实战:Redis实现分布式Session 技术栈:Spring ...

  2. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  3. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloopimport tornado.webfrom myhash ...

  4. SpringSession+redis解决分布式session不一致性问题

    七.案例实战:SpringSession+redis解决分布式session不一致性问题 步骤1:加入SpringSession.redis的依赖包 <dependency><gro ...

  5. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  6. 8.redis解决分布式session问题 、redis在项目中难点

    a.什么是session session是一种会话技术,我们知道http是无状态协议的,就是这次连接传输数据后,下次连接服务器是不知道这次的请求是谁的,因此我们要做一个标记,让服务器知道每次请求是哪个 ...

  7. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

  8. Redis实现分布式Session管理

    管理机制 redis的session管理是利用spring提供的session管理解决方案,将一个应用session交给Redis存储,整个应用中所有session的请求都会去redis中获取对应的s ...

  9. 利用redis实现分布式锁

    一.背景 在分布式项目中,由于一个服务会有多个实例运行,有些特定的场景需要我们用到分布式锁. 例如:最近我正在做的交易所项目,其中一个服务是钱包模块,需要每半个小时就去归集用户的资金,这个定时任务只能 ...

最新文章

  1. openoj的一个小比赛(F题解题报告)poj3978(dp+素数筛选)
  2. 掌握shell应用,Linux任你行走
  3. redhat 添加ssh端口_RHEL 7修改ssh默认端口号
  4. 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程)
  5. android sp缓存,Android sharedPreference设置缓存时间
  6. irf和链路聚合综合实验
  7. Java软件开发修炼过程
  8. Cocoa Touch框架浅析
  9. Python数学问题5:输入三个整数并由小到大进行输出
  10. 从零开始搭建自己的网站可外网访问从购买服务器开始
  11. Android的数据存储:SharedPrefrence存储,手机内部文件存储,手机外部文件存储
  12. Java流程控制之do....while 循环的详解,看完你就会
  13. python图色模拟脚本_python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
  14. ORA-02019:未找到远程数据库的连接说明(数据库链接创建)
  15. Labelme标注的json数据转化为coco格式的数据
  16. 实现Linux下的cp命令
  17. matlab 雷诺,matlab求解雷诺方程
  18. word2vec基础(非常容易理解)
  19. 租房项目 获取地区信息服务
  20. 智能优化算法:蜣螂优化算法-附代码

热门文章

  1. jdk、jre环境变量配置
  2. python 如何进行内存管理,Python是如何进行内存管理的?
  3. Everything搜索知识
  4. Oracle12c新特性大全(二)CDB的创建
  5. 【Python学习教程】Python异常处理机制
  6. ggplot2学习笔记2:ggplot()语法基础
  7. postgresql批量更新
  8. 2018 年 8 月面试路:6 天 21 家公司 | 掘金技术征文
  9. iOS开发之高级视图—— UINavigationController(二)简单导航功能进阶
  10. C语言 extern的用法