分佈式併發場景下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中相應的屬性被置爲空,問題也就基本得到了解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章