4种分布式session解决方案

cookie和session的区别和联系

cookie是本地客户端用来存储少量数据信息的,保存在客户端,用户能够很容易的获取,安全性不高,存储的数据量小
session是服务器用来存储部分数据信息,保存在服务器,用户不容易获取,安全性高,储存的数据量相对大,存储在服务器,会占用一些服务器资源,但是对于它的优点来说,这个缺点可以忽略了

session有什么用

在一次客户端和服务器为之间的会话中,客户端(浏览器)向服务器发送请求,首先cookie会自动携带上次请求存储的数据(JSESSIONID)到服务器,服务器根据请求参数中的JSESSIONID到服务器中的session库中查询是否存在此JSESSIONID的信息,如果存在,那么服务器就知道此用户是谁,如果不存在,就会创建一个JSESSIONID,并在本次请求结束后将JSESSIONID返回给客户端,同时将此JSESSIONID在客户端cookie中进行保存

客户端和服务器之间是通过http协议进行通信,但是http协议是无状态的,不同次请求会话是没有任何关联的,但是优点是处理速度快

session是一次浏览器和服务器的交互的会话,当浏览器关闭的时候,会话就结束了,但是会话session还在,默认session是还保留30分钟的

分布式session一致性

客户端发送一个请求,经过负载均衡后该请求会被分配到服务器中的其中一个,由于不同服务器含有不同的web服务器(例如Tomcat),不同的web服务器中并不能发现之前web服务器保存的session信息,就会再次生成一个JSESSIONID,之前的状态就会丢失

4种分布式session解决方案

方案一 客户端存储

直接将信息存储在cookie中
cookie是存储在客户端上的一小段数据,客户端通过http协议和服务器进行cookie交互,通常用来存储一些不敏感信息

缺点

  • 数据存储在客户端,存在安全隐患
  • cookie存储大小、类型存在限制
  • 数据存储在cookie中,如果一次请求cookie过大,会给网络增加更大的开销

方案二 session复制

session复制是小型企业应用使用较多的一种服务器集群session管理机制,在真正的开发使用的并不是很多,通过对web服务器(例如Tomcat)进行搭建集群。

存在的问题

  • session同步的原理是在同一个局域网里面通过发送广播来异步同步session的,一旦服务器多了,并发上来了,session需要同步的数据量就大了,需要将其他服务器上的session全部同步到本服务器上,会带来一定的网路开销,在用户量特别大的时候,会出现内存不足的情况

优点

  • 服务器之间的session信息都是同步的,任何一台服务器宕机的时候不会影响另外服务器中session的状态,配置相对简单
  • Tomcat内部已经支持分布式架构开发管理机制,可以对tomcat修改配置来支持session复制,在集群中的几台服务器之间同步session对象,使每台服务器上都保存了所有用户的session信息,这样任何一台本机宕机都不会导致session数据的丢失,而服务器使用session时,也只需要在本机获取即可

如何配置
在Tomcat安装目录下的config目录中的server.xml文件中,将注释打开,tomcat必须在同一个网关内,要不然收不到广播,同步不了session
在web.xml中开启session复制:<distributable/>

方案三 session绑定:

Nginx介绍
Nginx是一款自由的、开源的、高性能的http服务器和反向代理服务器

Nginx能做什么
反向代理、负载均衡、http服务器(动静代理)、正向代理

如何使用nginx进行session绑定
我们利用nginx的反向代理和负载均衡,之前是客户端会被分配到其中一台服务器进行处理,具体分配到哪台服务器进行处理还得看服务器的负载均衡算法(轮询、随机、ip-hash、权重等),但是我们可以基于nginx的ip-hash策略,可以对客户端和服务器进行绑定,同一个客户端就只能访问该服务器,无论客户端发送多少次请求都被同一个服务器处理

在nginx安装目录下的conf目录中的nginx.conf文件

upstream aaa {Ip_hash;server 39.105.59.4:8080;Server 39.105.59.4:8081;
}
server {listen 80;server_name www.wanyingjing.cn;#root /usr/local/nginx/html;#index index.html index.htm;location / {proxy_pass http:39.105.59.4;index index.html index.htm;}
}

缺点

  • 容易造成单点故障,如果有一台服务器宕机,那么该台服务器上的session信息将会丢失
  • 前端不能有负载均衡,如果有,session绑定将会出问题

优点

  • 配置简单

方案四 基于redis存储session方案

基于redis存储session方案流程示意图
在这里插入图片描述
引入pom依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-data-starter-redis</artifactId>
</dependency>

配置redis

#redis数据库索引(默认是0)
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#默认密码为空
spring.redis.password=
#连接池最大连接数(负数表示没有限制)
spring.redis.jedis.pool.max-active=1000
#连接池最大阻塞等待时间(负数表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
#连接超时时间(毫秒)
spring.redis.timeout=500ms

优点

  • 这是企业中使用的最多的一种方式
  • spring为我们封装好了spring-session,直接引入依赖即可
  • 数据保存在redis中,无缝接入,不存在任何安全隐患
  • redis自身可做集群,搭建主从,同时方便管理

缺点

  • 多了一次网络调用,web容器需要向redis访问

总结
一般会将web容器所在的服务器和redis所在的服务器放在同一个机房,减少网络开销,走内网进行连接


---------------------
作者:断橋殘雪
来源:CSDN
原文:https://blog.csdn.net/qq_35620501/article/details/95047642
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blazor University (43)JavaScript 互操作 —— 类型安全

原文链接&#xff1a;https://blazor-university.com/javascript-interop/calling-dotnet-from-javascript/type-safety/类型安全在从 JavaScript 调用 .NET[1] 部分中&#xff0c;您可能已经注意到我们的 JavaScript 的第 6 行在将随机生成的数字传递给 .NET 之前调用了 toStr…

分享 60 个神级 VS Code 插件

文章来源&#xff1a;juejin.cn/post/6994327298740600839 本文不做任何编辑器的比较&#xff0c;只是我本人日常使用 vscode 进行开发&#xff0c;并且比较喜欢折腾 vscode &#xff0c;会到处找这一些好玩的插件&#xff0c;于是越攒越多&#xff0c;今天给大家推荐一下我收…

PHP 基础篇 - PHP 中 DES 加解密详解

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 DES 是对称性加密里面常见一种&#xff0c;全称为 Data Encryption Standard&#xff0c;即数据加密标准&#xff0c;是一种使用密钥加密的块算法。密钥长度是64位(bit)&#xff0c;超过位数密钥被忽略。所谓对…

PerfView专题 (第一篇): 如何寻找热点函数

一&#xff1a;背景 准备开个系列来聊一下 PerfView 这款工具&#xff0c;熟悉我的朋友都知道我喜欢用 WinDbg&#xff0c;这东西虽然很牛&#xff0c;但也不是万能的&#xff0c;也有一些场景他解决不了或者很难解决&#xff0c;这时候借助一些其他的工具来辅助&#xff0c;是…

Centos7设置IP为固定值

1.进入到系统的IP地址保存文件所在目录 [rootlocalhost ~]# cd /etc/sysconfig/network-scripts 2.修改保存IP信息的文件 [rootlocalhost ~]# vim ifcfg-eth0 &#xff08;你机器上的名字有可能不是这个&#xff0c;但是是以ifcfg-eth开头的文件&#xff09; 保存后退出 3.重启…

为 EditorConfig 文件开启错误编译失败

前言上次&#xff0c;我们介绍了 EditorConfig 文件可以自定义代码样式规则。但是&#xff0c;当我们想设置代码样式严重性&#xff0c;比如不允许编译成功时&#xff0c;又踩了不少坑。修改无效想把 var 首选项&#xff0c;从“首选"var" 仅重构”&#xff0c;改成“…

【.NET特供-第三季】ASP.NET MVC系列:传统WebForm站点和MVC站点执行机制对照

本文以图形化的方式&#xff0c;从‘执行机制’方面对照传统WebForm站点和MVC站点。请參看下面图形&#xff1a; 一、执行机制 当我们訪问一个站点的时候&#xff0c;浏览器和server都是做了哪些动作呢&#xff1f; &#xff08;本文仅仅是提供一个简单的执行过程&#xff0c;有…

投阿里被拒,说跳槽太频繁!三年两个工作,问题真的那么大吗?

什么样的跳槽频率才不算频繁&#xff1f;一位网友发问&#xff1a;投阿里被拒&#xff0c;理由是跳槽太频繁&#xff0c;不合适。三年两个工作&#xff0c;问题真的那么大吗&#xff1f;网友说&#xff0c;阿里对稳定性要求非常高&#xff0c;三年两跳和五年三跳都是红线&#…

为什么信息化 ≠ 数字化?终于有人讲明白了

作者&#xff1a;石秀峰 来源&#xff1a;谈数据&#xff08;ID&#xff1a;learning-bigdata&#xff09; 近期&#xff0c;我一做数字化咨询的朋友&#xff08;化名老王&#xff09;遇到了一个头痛的问题&#xff1a;话说老王的团队近期接了一个大单——一大型制造业的数字化…

JAVA代码—算法基础:数独问题(Sodoku Puzzles)

JAVA代码—算法基础&#xff1a;数独问题&#xff08;Sodoku Puzzles&#xff09; 数独问题&#xff08;Sodoku Puzzles&#xff09; 数独游戏&#xff08;日语&#xff1a;数独 すうどく&#xff09;是一种源自18世纪末的瑞士的游戏&#xff0c;后在美国发展、并在日本得以发扬…

Linux系统恢复

实验目的&#xff1a;熟悉了前面的启动流程&#xff0c;系统的一个大致的启动流程是怎样的&#xff0c;而其中牵扯到了些许文件&#xff0c;这些文件在系统启动时用于衔接各个步骤&#xff0c;如果这些文件损坏或缺失&#xff0c;系统将不能正常启动&#xff0c;这次写的内容就…

PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏

一&#xff1a;背景 上一篇我们聊到了如何去找 热点函数&#xff0c;这一篇我们来看下当你的程序出现了 非托管内存泄漏 时如何去寻找可疑的代码源头&#xff0c;其实思路很简单&#xff0c;就是在 HeapAlloc 或者 VirtualAlloc 时做 Hook 拦截&#xff0c;记录它的调用栈以及分…

关于 extern C的说明

在用C的项目源码中&#xff0c;经常会不可避免的会看到下面的代码 1 #ifdef __cplusplus 2 extern "C" { 3 #endif 4 5 /*...*/ 6 7 #ifdef __cplusplus 8 } 9 #endif 它到底有什么用呢&#xff0c;你知道吗&#xff1f;而且这样的问题经常会出现在面试or笔试…

Nginx 面试 40 问

Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。 那么关于 Nginx 的核心技术点有哪些呢&#xff1f; 什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的…

用Cocos2dx开发棋牌游戏的观点解析

众所周知&#xff0c;目前棋牌游戏特别的火。很多游戏公司都想在这一块赚钱&#xff0c;可是却不知用什么软件比较好的去开发棋牌游戏&#xff0c;对此&#xff0c;我列出了两款比较靠谱的软件去开发棋牌游戏&#xff0c;希望对大家有帮助&#xff01; 第一款软件是cocos2dx,它…

我把《系统设计》系列整理成了 PDF

大家好&#xff0c;我是等天黑。相信很多朋友应该注意到了&#xff0c;我最近发了很多系统设计的文章。是的&#xff0c;到目前为止&#xff0c;已经发了有 7 篇文章。这些内容主要翻译自 Alex Xu 的 《System Design Interview》&#xff0c;有卷一和卷二两本。System Design …

高性能IO模型浅析

服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即传统的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blocking IO&#xff09;…

PHP个人博客项目------切切歆语博客

2019独角兽企业重金招聘Python工程师标准>>> phpmysqlapache, ThinkPHP3.2框架开发 我的个人博客项目 适合新手练习 源码地址下载&#xff1a;https://github.com/DickyQie/php-myblog 转载于:https://my.oschina.net/zhangqie/blog/1785867

IOS_SearchBar搜索栏及关键字高亮

搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: ?123456//获取文件的路径pathNSString *path [[NSBundle mainBundle] pathForResourc…

Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

工厂模式&#xff1a; 工厂模式可以分为三类&#xff1a; 1&#xff09;简单工厂模式&#xff08;Simple Factory&#xff09; 2&#xff09;工厂方法模式&#xff08;Factory Method&#xff09; 3&#xff09;抽象工厂模式&#xff08;Abstract Factory&#xff09; 简单工…