redis实现分布式session共享_redis分布式session共享-程序员宅基地

技术标签: Redis&MongoDB  

为什么要共享session?

我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat上。

但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客户端C创建了会话session,那么Tomcat-B并不知道客户端已与集群中的Tomcat-A产生了会话,在访问时就会为C再创建一份session,如果是基于session的验证会话权限的接口(如用户登录认证后才可访问的数据接口),将会导致在访问集群中不同节点的时候重复认证。session的不共享导致原来的会话管理机制在Tomcat集群中无法工作。

所以,如果有一个Tomcat集群都能访问的公共session存取区就好了,基于这个概念,我们想到了使用Redis来做这个session公共存取区,这样子的话就有一个统一管理回话的地方了。回看我们上文提到的例子,如果Tomcat-A已经为客户端C创建了会话session,这个session信息会直接存储在公共的Redis里面,那么Tomcat-B就可以到公共session存储区里获得已为C产生的session,这样的结果是集群的公共session存取区在逻辑上就像一个tomcat的内部session存取区一样了。

Session的实现原理简介

背景:

1.  由于Http协议是无状态的,服务端如何识别客户端请求呢,只能依靠http报文中新增部分头字段来实现请求识别(如何在请求body或这参数中设置会员参数,服务器端会话就与自定义的会员识别绑定到一起)

2.  基于浏览器的web应用,请求都是有浏览器发起的,貌似也不能手动随便添加请求头(仅有XMLHttpRequest可以手动设置请求头),哪有没有一种可以由服务端生成,客户端请求是自动在请求中设置对应头字段的技术呢,这就是cookie

Cookie:

cookie是在客户端负责保存的,既可以客户端生成,也可以服务器端生成,Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:

(1)内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的

(2)硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除

(3)cookie一些重要的属性,path,domain,maxAge,secure,httponly,可以自己去研究一下

(4)服务端生成cookie的响应头为 Set-Cookie:JSESSIONID=164A9B3B768FD959AA20505D4C09; Path=/; HttpOnly

(5)客户端发送http请求带的cookie请求头 Cookie:AMCV_niwodai%40AdobeOrg=-15069…7-badf-4795-9c64-eb9960c23d48

Session的实现原理:

(1)服务端首先查找对应的cookie的值(sessionid)

(2)根据sessionid,从服务器端session存储中获取对应id的session数据,进行返回

(3)如果找不到sessionid,服务器端就创建session,生成sessionid对应的cookie,写入到响应头中

session共享实现

传统的session由服务器端生成并存储,当应用进行分布式集群部署的时候,如何保证不同服务器上session信息能够共享呢?

两种实现方式:1.session集中存储(redis,memcached,hbase等),2. 不同服务器上session数据进行复制,两种方式的优缺点,大家应该一目了然

基于session集中存储的实现方案:

(1)新增Filter,拦截请求,包装HttpServletRequest

(2)改写getSession方法,从session存储中获取session数据,返回自定义的HttpSession实现

(3)在生成新Session后,写入sessionid到cookie中

Redis存储session的需要考虑问题

1.  session数据如何在Redis中存储?

2.  session属性变更何时触发存储?

我们的实现:

考虑到session中数据类似map的结构,采用redis中hash存储session数据比较合适,如果使用单个value存储session数据,不加锁的情况下,就会存在session覆盖的问题,因此使用hash存储session,每次只保存本次变更session属性的数据,避免了锁处理,性能更好

如果每改一个session的属性就触发存储,在变更较多session属性时会触发多次redis写操作,对性能也会有影响,我们是在每次请求处理完后,做一次session的写入,并且之写入变更过的属性

如果本次没有做session的更改, 是不会做redis写入的,仅当没有变更的session超过一个时间阀值(不变更session刷新过期时间的阀值),就会触发session保存,以便session能够延长有效期

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39626154/article/details/94394834

智能推荐

windows server 2012 服务器打开系统远程功能_请确认将rd授权管理器安装为-程序员宅基地

文章浏览阅读974次。然后在服务器池中选择你需要使用的服务器。需要选择安装的服务器类型,如图所示。安装完成后,点击左边服务器,打开“验证完成后,就可以使用远程服务了。选择完成确认内容并等待安装完成。选择完成后,在图示列表下勾选“”并使用服务器ID进行验证。在右键其中服务器,点击“_请确认将rd授权管理器安装为

如何验证自己编译的交叉工具链是否可用_musl-x86_64.so库作用-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏2次。自己编译的交叉工具链,使用工具链生成可执行程序来验证工具链是否可用_musl-x86_64.so库作用

富文本编辑器不能正常显示(使用freemarker生成模板)_form generator 富文本编辑器不显示-程序员宅基地

文章浏览阅读1.6k次。一、快速解决:1、使用freemarker模板生成的html,有时不能被富文本编辑器插件识别。2、其中一个解决方案,HTML压缩。网上找一个在线的HTML压缩网站,例如https://tool.oschina.net/jscompress/,把模板压缩后,再次生成的HTML就可以被富文本识别。二、具体实例:1、场景:在一些政府项目,财务金融项目,办公系统项目等等都会大量使用到freemarker模板,来生成HTML。2、问题:使用freemarker模板生成的HTML文本,富.._form generator 富文本编辑器不显示

Script error.全面解析_#r北:script error: luaj.luaerror: @/data/data/com.t-程序员宅基地

文章浏览阅读3.4k次。一些用户向我们反馈,Fundebug的JavaScript监控插件抓到了很多Script error.,然后行号和列号都是0…这就很尴尬了。今天,我们来详细地解析一下Script error.,后续我们还会深度测试并且提供解决方法。同源策略 (Same origin policy)解释Script error.之前,我们先简单聊聊同源策略。摘自MDN - Same-origin policy:_#r北:script error: luaj.luaerror: @/data/data/com.tencent.mobile**.sb/co

视频会议常用术语——转自华为TE40帮助文档_华为会议终端演示会场锁定-程序员宅基地

文章浏览阅读2.9k次。术语查看Web页面在线帮助中用到的术语。数字1080i 分辨率为1920×1080的隔行扫描图像格式。 1080p 分辨率为1920×1080的逐行扫描图像格式。 2CIF 分辨率为352×576的逐行扫描图像格式。 2SIF 分辨率为352×480的逐行扫描图像格式。 4CIF 分辨率为704×576的逐行扫描图像格式。 4SIF 分辨率为704×480的逐行扫描图像格式。 720p 分辨率为1_华为会议终端演示会场锁定

【 linux如何查看cuda版本】_linux cuda version-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏2次。linux如何查看cuda版本终端输入nvcc -V命令,即可查询到CUDA版本号_linux cuda version

随便推点

2023年3月| 红帽RHCE考试战报-微思红帽官方授权培训中心_rhce全国考点-程序员宅基地

文章浏览阅读1.1k次。每一张RHCE证书不仅代表了学员成为一名红帽认证工程师,同时也是对微思老师和学员辛勤的付出的肯定。正所谓“不想当将军的士兵不是好兵”,对于一个Linux从业人员来说升职加薪是他们的共同愿望,而考取红帽认证是行之有效的方式之一。企业对Linux人才特别是RHCE的需求不断的增大,而RHCE认证在Linux行业里属于含金量较高的一个认证,这种专业的技能认证越来越多的成为公司考虑一个员工加薪、升职、晋升的标准和参考。热烈祝贺微思的15名学员成为真正意义上的红帽认证工程师。来看看部分学员的高分成绩单。_rhce全国考点

【传智播客】Javaweb程序设计任务教程 黑马程序员 第二章 课后答案_javaweb程序设计任务教程第二版课后答案-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏18次。第二章 问题【测一测】学习完前面的内容,下面来动手测一测吧,请思考以下问题:1、简述HTTP1.1协议的通信过程?2、简述POST请求和GET请求有什么不同?(至少2点)3、请列举出Tomcat安装目录下的子目录,并对其进行简要说明?(至少列出5个)4、请编写一个格式良好的XML文档,要求包含足球队一支,队名为Madrid,球员5人:Ronaldo、Casillas、Ramos、Modric、Benzema;篮球队一支,队名为Lakers,队员2人:Oneal,Bryant。里面要求含有注释,注_javaweb程序设计任务教程第二版课后答案

testng的用法--未消化的,未研究明白-程序员宅基地

文章浏览阅读117次。2019独角兽企业重金招聘Python工程师标准>>> ..._f网站

二、svn分支策略原理:-程序员宅基地

文章浏览阅读159次。零、说明:-----欢迎拍砖1、下面内容是找的网上资料总结的,不是生产环境内容,svn分支策略好麻烦啊2、merge很重要而且不好理解,merge修改的只是本地的工作副本,所以只要不提交,不会对服务端造成影响3、多个项目互相依赖,会不会混乱,版本怎么管理那????一、Trunk,Branches,Tags说明1、Branches、Tags生成都是使用svncopy命令生成..._svn切换分支的底层原理

阿里云轻量应用服务器LAMP镜像下搭建网站_阿里云轻量服务器lamp不用域名怎么建站-程序员宅基地

文章浏览阅读915次。阿里云轻量应用服务器LAMP镜像下搭建网站1.服务器选择我配的是2GB内存1核 40GB SSD系统盘。阿里的云翼计划24岁以下自动获取学生身份,这样购买的话一个月只要9.5元。2.选择应用镜像因为部署的是php项目所以选择的是LAMP应用镜像。3.购买之后,环境都是搭配好的。剩下的就是按照步骤配置MySQL和上传文件。1.解析域名。阿里云解析域名可在此快速添加DNS解析,其他域..._阿里云轻量服务器lamp不用域名怎么建站

Makefile教程-程序员宅基地

文章浏览阅读2次。Makefile学习教程: 跟我一起写 Makefile 0 Makefile概述 0.1 关于程序的编译和链接1 Makefile 介绍 1.1 Makefile的规则1.2 一个示例1.3 make是如何工作的1.4 makefile中使用变量1.5 让make自动推导1.6 另类风格的makefile1.7 清空目标文件的规则2 Makefile 总述 2.1 Makefile里...

推荐文章

热门文章

相关标签