分布式session

第一,为什么会出现分布式Session

现在我们的项目都是服务化的,都是分布式的,服务器节点一般都是部署在不同服务器下的(同一个服务部署到不同的机器上),通过负载均衡进行访问的,所以呢,Session,也就被分布式化了,因为Session会话只能在同一台服务器上生效,在这种情况下,就会导致,用户访问不同的服务器导致Session会话不一致的问题,在JavaWeb中根本没有设置SessionId的方法,所以SessionID是只读的,而且SessionID是服务器内部生成的所以这就成了一个难题

第二,如何解决?

以下是市面上总结的四种解决方案

A.使用session内部共享机制可以解决跨域Session的处理,但是Session同步时会有问题的,当网络出现了延迟卡顿,那么很容易出现问题,而且实现起来非常复杂,所以我们不会用这种方案来做的

B.使用数据库存放Session(但是存储数据库里面需要进行查询校验,耗费数据库性能),所以何不把他放到缓存里面呢,所以这个方案我们也放弃了

C.Memcached(高效率的缓存数据库),他的并发效率效率比Redis高,他每秒的QPS(每秒访问量)可以达到10万,所以说,也是很不错的了,而redis的QPS只能达到5万,那么为什么我们秒杀中不使用memcached呢?用户是需要共享session,秒杀的时候,很多用户会去抢一样东西,产生我们的资源竞争,虽然它的效率比redis高,但是!!请注意,memcached中有个BUG,在进行加或者进行减的时候(decr和incr)会出现库存问题,如果你传过来的秒杀需求数量值大于你的真实库存值的时候,这时候就会默认库存为0,到现在这个问题还没有解决,所以,这个时候我们肯定不会用它,因为它有BUG,所以呢redis的可靠性就比mecached高,虽然效率没它高吧,但是数据最起码不会出现问题

D.第四种就是用我们的redis了,redis可靠性比较高,也没有什么突出或者致命的的BUG

所以我推荐,分布式Session解决方案就用redis解决

 

那么如何进行实现的呢?

服务其内部生成会话id,当客户端与服务器建立请求的时候,就会把服务器的sessionid通过cookie的方式写入到客户端里面来机制,这样就能保证是同一个会话了

具体点说:就是在建立请求时,建立一个SessionID,以response.addCookie(“Jsessionid”,"值")的方式发送到客户端(在登陆成功的时候产生唯一ID存储到Cookie中,id为key,用户登录对象为value的方式存储)

在操作功能的时候每次都获取到redis中ID与request->Header中的cookie进行对比,如果是就让其进行操作

看一下核心代码

private void addCookie(HttpServletResponse response,String token , UserInfo user) {
		// 存储到redis中
		redisService.set(COOKIE_TOKEN_PREFIX, token, user, TimeUnit.SECONDS, 3600);
		// 创建Cookie发送到客户端
		Cookie cookie = new Cookie(COOKIE_TOKEN_PREFIX, token);
		cookie.setMaxAge(3600);
		cookie.setPath("/");
		// 添加到客户端
		response.addCookie(cookie);
	}
@Override
	public boolean login(HttpServletResponse response, LoginVo loginVo) {
		UserInfo userInfo = userMapper.getUserByAccount(loginVo.getAccount());
		
		if (userInfo == null) {
			throw new GlobalException(CodeMsg.ACCOUNT_ERROR);
		}
		
		// 获取数据库中存储的密码及盐值
		String pass = userInfo.getUserPassword();
		String salt = userInfo.getSalt();
		// 获取页面输入的密码
		String inputPass = loginVo.getPassword();
		String handlerPass = MD5Util.clientPassToDbPass(inputPass, salt);
		
		if (!pass.equals(handlerPass)) {
			throw new GlobalException(CodeMsg.PASSWORD_ERROR);
		}
		
		// 模拟会话ID
		String token = UUIDUtil.uuid();
		// 调用添加保存cookie
		addCookie(response, token,userInfo);
		
		return true;
	}
	
	/**
	 * 根据token值获取到对应用户信息
	 * @param token
	 * @return
	 */
	public UserInfo getUserByToken(String token) {
		return null;
		
	}

为了安全这里进行了MD5加密 

其实就是这么回事,并不困难,有帮助的话记得点赞!

 

 

 

 

### 关于 'Microsoft Visual C++ 14.0 is required' 错误 在 Linux 上遇到提示 `Microsoft Visual C++ 14.0 is required` 的错误通常是由于某些依赖项未满足或者尝试运行的程序本身并非设计用于 Linux 平台。此错误通常发生在试图通过兼容层(如 Wine 或 PyInstaller 打包的应用)来运行 Windows 应用程序时。 以下是可能的原因以及解决方案: #### 原因分析 该错误表明当前环境中缺少编译器支持库或动态链接库文件,这些文件原本由 Microsoft 提供并专为 Windows 设计。然而,在 Linux 中无法直接安装 Microsoft Visual C++ Redistributable 包,因为它们仅适用于 Windows 系统[^1]。 --- #### 解决方案一:使用交叉编译工具链 如果目标是在 Linux 下开发针对 Windows 的应用程序,则可以设置一个跨平台构建环境。具体方法如下: - 安装 MinGW 工具链以模拟 Windows 编译过程。 - 使用 MSYS2 来获取最新的 GCC 和其他必要的头文件和库文件。 示例命令: ```bash sudo apt-get update && sudo apt-get install mingw-w64 ``` 对于特定版本的需求(例如 Visual C++ 14.0),可以通过配置 MinGW-W64 支持所需的 ABI 版本[^2]。 --- #### 解决方案二:借助虚拟机或容器化技术 另一种方式是利用虚拟化技术创建完整的 Windows 开发环境。这包括但不限于以下几种实现形式: - **Docker**: 创建基于 Windows Server Core 镜像的 Docker 容器; - **VirtualBox/KVM/QEMU**: 设置独立的操作系统实例专门处理此类需求; 注意,这种方法虽然功能强大但资源消耗较大,并且需要额外维护操作系统镜像及其更新频率等问题考虑进去。 --- #### 解决方案三:调整应用部署策略 如果是 Python 脚本项目引发上述警告消息的话,那么很可能是由于打包过程中嵌入了一些原生扩展模块而造成的结果。此时建议重新审视项目的依赖关系树图,确保所有第三方插件都已提供纯解释型实现或者是经过移植后的 POSIX 兼容版替代品。 另外还可以探索 Cython 进行性能优化的同时保持良好的可移植特性[^1]。 --- #### 注意事项 无论采取哪种途径解决问题之前都应该确认清楚实际业务场景下的约束条件是什么样的?比如是否有硬性规定必须保留原有执行流程不变等等因素影响最终决策方向的选择。 --- ### 示例代码片段展示如何验证是否存在缺失 DLL 文件情况 下面给出一段简单的 PowerShell 脚本来帮助识别潜在丢失的关键组件名称列表(需转换成适合 bash shell 形式的语法才能应用于 GNU/Linux 发行版当中) : ```powershell $missingDlls = @() foreach ($file in Get-ChildItem -Recurse | Where-Object { $_.Extension -eq ".exe" }) { try { $peInfo = ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName)) if (-not (Test-Path ("C:\Windows\System32\" + $peInfo.InternalName))) { $missingDlls += ,$peInfo.InternalName } } catch {} } Write-Output "Missing Dlls:" $missingDlls | Sort-Object -Unique ``` 将其改写为 Shell Script 后可用于初步排查问题所在位置。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值