分布式并发场景下SpringSession(Redis) 的数据脏读问题

问题现象

问题来源于一个临时订单重复提交管控场景,通过在Session中写入本次提交的临时订单ID防止同个表单的重复提交。但在用户使用某些浏览器(如QQ浏览器、微信内置浏览器)时,仍有偶发性的重复提交现象。
相关核心代码如下:
clipboard.png

原因分析

该问题主要原因是因为当有A、B两个一样的请求时,如果在A还没响应完毕的时候SpringMvc又接收了B请求,B请求在获取Session中的值时,会获取到A请求改写之前的数据。
其根本原因在于SpringSession在写入或删除Session属性时,会根据配置中的FlushMode决定在什么时候序列化到Redis,而默认的FlushMode为ON_SAVE,API原文是这样的:
clipboard.png
也就是说,在默认情况下只有在Response被提交时Session内容才会序列化到Redis。所以导致了并发场景下的Session数据脏读问题

解决方案

目前我们采取将RedisFlushMode改为IMMEDIATE,修改方法为在@EnableRedisHttpSession注解中指定flushMode:
clipboard.png
如此修改后,在每次调用removeAttribure后,都能正确的观察到Redis中相应的属性被置为空,问题也就基本得到了解决。


Akers的技术分享
主要分享java、python、koltin方面的个人技术整理

屡次转投Python神教失败的Java全栈工程师,目前主要关注微服务、人工智能、Koltin语言、用还没学会的区...

29 声望
1 粉丝
0 条评论
推荐阅读
BigTreeTech Octopus 必趣章鱼主板使用Klicky probe
注意,官方文档说的是接公共地(GND)和信号,对应章鱼主板,可以用J40接口(跟接近开关同个接口)分别接DC和PB7,DC电压建议改成5V![(HGL2}K(51}JD%IB[~{}]9Q.png](/img/bVcW50o)

Akers阅读 2.6k

spring boot 锁
由于当前的项目中由于多线程操作同一个实体,会出现数据覆盖的问题,后保存的实体把先保存的实体的数据给覆盖了。于是查找了锁的实现的几种方式。但写到最后发现,其实自己可以写sql 更新需要更新的字段即可,这...

weiewiyi3阅读 9.1k

利用Docker部署管理LDAP及其初次使用
前言:本周主要写了gitlabWebhook转github的项目,总体上没有遇到什么大问题,这周接触到了LDAP,于是就花时间实际操作了解了一下。

李明5阅读 841

记录本周问题
项目里两个地方都用到了hashmap。但是感觉自己用的时候并没有感觉非常的清晰。同时发现hashmap有线程不安全问题,而自己用的时候就是多线程来使用。于是在这里介绍一下。

weiewiyi5阅读 686

记录java 在遍历中删除元素 以及 mysql5.6版本添加unique失败
遍历中删除List或Queue等数据结构中,如何一边遍历一遍删除?1. 常犯错误ArrayList可能没遇到坑过的人会用增强for循环这么写: {代码...} 但是一运行,结果却抛 java.util.ConcurrentModificationException 异常即...

weiewiyi4阅读 749

Spring Security + JWT
Spring Security默认是基于session进行用户认证的,用户通过登录请求完成认证之后,认证信息在服务器端保存在session中,之后的请求发送上来后SecurityContextPersistenceFilter过滤器从session中获取认证信息、...

4阅读 1.4k

Reactive Spring实战 -- 理解Reactor的设计与实现
Reactor是Spring提供的非阻塞式响应式编程框架,实现了Reactive Streams规范。 它提供了可组合的异步序列API,例如Flux(用于[N]个元素)和Mono(用于[0 | 1]个元素)。

binecy3阅读 4.7k评论 2

屡次转投Python神教失败的Java全栈工程师,目前主要关注微服务、人工智能、Koltin语言、用还没学会的区...

29 声望
1 粉丝
宣传栏