jedis+redis pipeline詭異的鏈接損壞、數據讀取異常問題解決

文章目錄

    • 問題現象
      • 棧溢出(不斷的重連)
      • 讀取超時
      • 未知響應
      • 嘗試讀取損壞的鏈接
      • 讀取到的數據和自己要讀的無關,導致空指針、類型轉換錯誤,數據讀取錯亂
    • 問題寫法
    • 問題分析
    • 修復
    • 注意點

問題現象

棧溢出(不斷的重連)

		at redis.clients.jedis.Connection.sendCommand(Connection.java:163)at redis.clients.jedis.Connection.sendCommand(Connection.java:154)at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:815)at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:145)at redis.clients.jedis.Connection.sendCommand(Connection.java:163)at redis.clients.jedis.Connection.sendCommand(Connection.java:154)at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:815)at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:145)

在這里插入圖片描述

讀取超時

在這里插入圖片描述

未知響應

在這里插入圖片描述

嘗試讀取損壞的鏈接

在這里插入圖片描述

讀取到的數據和自己要讀的無關,導致空指針、類型轉換錯誤,數據讀取錯亂

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

問題寫法

對Redis操作封裝了一個Redis類
在這里插入圖片描述
同事對pipeline加了這個方法
在這里插入圖片描述
使用的時候

   public Map<String, AnswerModel> batchGetAnswersPipeline(List<String> answerIdList) {Map<String, AnswerModel> resultMap = new HashMap<>();try (Pipeline pipelined = redis.pipelined()) {List<Response<Map<String, String>>> responses = new ArrayList<>();for (String answerId : answerIdList) {String key = String.format(MOMENT_ANSWER_INFO, answerId);responses.add(pipelined.hgetAll(key));}pipelined.sync();for (Response<Map<String, String>> response : responses) {Map<String, String> map = response.get();AnswerModel answers = BeanUtil.mapToBean(map, AnswerModel.class);if (answers != null){resultMap.put(answers.getAnswerId(), answers);}}} catch (Exception e) {log.error("執行batchGetAnswersPipeline發生異常, redis pipeline error", e);throw new CatVillageException();}return resultMap;}

問題分析

在redis這個工具類中調pipelined時獲取一個Pinelined對象,而獲取這個方法里用了try with ,with了一個jedis鏈接,當try結束時鏈接會被歸還jedispool連接池。而返回的這個pipeline仍然在用這個鏈接,當其他線程去拿鏈接的時候可能拿到的正好是這個鏈接,導致多個線程共用一個鏈接,一個線程在執行pipeline多條命令,另一個線程也在用這個鏈接。而jedis底層執行命令的時候是使用的OutputStream流式去執行命令,使用二進制流讀取結果。當出現這種線程不安全問題的時候,讀取寫入就會有問題。

修復

刪除Redis工具類中的pipelined方法,使用getJedis方法獲取鏈接對象,再獲取管道Pineline對象,自行close管道,最后執行完釋放管道,鏈接。

public Map<String, QuestionModel> batchGetQuestionPipeline(List<String> questionIdList) {if (CollectionUtils.isEmpty(questionIdList)){return new HashMap<>();}Map<String, QuestionModel> resultMap = new HashMap<>();try (Jedis jedis = redis.getJedis()) {Pipeline pipelined = jedis.pipelined();List<Response<Map<String, String>>> responses = new ArrayList<>();for (String questionId : questionIdList) {String key = String.format(MOMENT_QUESTION_INFO, questionId);responses.add(pipelined.hgetAll(key));}pipelined.sync();for (Response<Map<String, String>> response : responses) {Map<String, String> map = response.get();QuestionModel question = convertFromMap(map);if (question != null) {resultMap.put(question.getPostId(), question);}}pipelined.close();} catch (Exception e) {log.error("執行batchGetQuestionPipeline發生異常, redis pipeline error", e);throw new CatVillageException();}return resultMap;}

注意點

若jedis在3.7版本以下的版本也會有管道二進制讀取異常問題,請升級到3.7.0+版本

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81132.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81132.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++STL-list的模擬實現

cSTL-list的模擬實現 list源碼剖析list模擬實現list構造函數拷貝構造函數賦值重載迭代器 iterator訪問結點數size和判空尾插 push_back頭插 push_front尾刪pop_back頭刪pop_front插入 insert刪除 erase清空clear和析構函數訪問結點 參考程序 list源碼剖析 建議先看cSTL-list的…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; https://wago.io/BarneyICC/69 全量英文字符串&#xff1a; !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

校園網規劃與設計方案

一、項目概述 校園網是學校實現信息化教學、科研與管理的重要基礎設施,其性能與穩定性直接影響學校的整體發展。隨著學校規模不斷擴大、教學科研活動日益豐富,對校園網的帶寬、可靠性、安全性以及智能化管理等方面提出了更高要求。本規劃與設計方案旨在構建一個高速、穩定、…

算法分析:蠻力法

一、實驗目的 1 掌握蠻力法的設計思想(利用計算機去窮舉所有的可能解,再從中依次找出可行解) 2 掌握蠻力法的具體實現和時間復雜度分析 3 理解蠻力法的常見特性 實驗要求&#xff1a;先用偽代碼描述利用蠻力法解決的算法解決方案&#xff0c;再用程序實現&#xff0c;計算時間…

信息系統運行管理員:臨陣磨槍版

信息系統運行管理員考試 - 全覆蓋詳細背誦大綱 (根據考情分析和原始材料&#xff0c;力求完整覆蓋考點細節) 第一部分&#xff1a;基礎知識與運維概覽 Chapter 1: 信息系統運維概述 (上午題 5分) 信息&#xff1a; 含義&#xff1a;香農 - 減少隨機不確定性的東西&#xff1b…

Linux的進程管理和用戶管理

gcc與g的區別 比如有兩個文件&#xff1a;main.c mainc.cpp&#xff08;分別是用C語言和C語言寫的&#xff09;如果要用gcc編譯&#xff1a; gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc表明使用C標準庫&#xff1b; 區別一&#xff1a; gcc默認只鏈接C庫&#x…

Python 常用模塊(八):logging模塊

目錄 一、引言&#xff1a;日志模塊在項目開發中的重要性二、從 Django 日志配置看 Logging 模塊的核心組成三、logging模塊核心組件詳解3.1 記錄器Logger3.2 級別Level3.3 根記錄器使用3.4 處理器Handler3.5 格式化器Formatter3.6 日志流3.7 日志示例 四、日志模塊總結 一、引…

Servlet原理

Servlet 體系結構的類層次關系 Servlet&#xff08;接口&#xff09;&#xff1a;定義了 Servlet 的核心生命周期方法&#xff08;如 init()、service()、destroy()&#xff09;&#xff0c;是所有 Servlet 的頂層規范&#xff0c;任何 Servlet 都需實現該接口。GenericServlet…

數據科學和機器學習的“看家兵器”——pandas模塊 之五

目錄 4.5 pandas 高級數據處理與分析 一、課程目標 二、對數據表格進行處理 (一)行列轉置 (二)將數據表轉換為樹形結構 三、數據表的拼接 (一)merge () 函數的運用 (二)concat () 函數的運用 (三)append () 函數的運用 四、對數據表格的同級運算 五、計算數據表格中數…

組合問題(去重)

40. 組合總和 II - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>&used)…

論QT6多線程技術

前言 以前我多線程使用傳統的繼承qthread重寫run()或者繼承qrunable類把對象丟到線程池解決。經過昨天的面試讓我了解到新的技術&#xff0c;我之前看到過只不過沒有詳細的去了解movetotread技術&#xff0c;這個技術是qt5推出的&#xff0c;qt6還在延續使用 代碼結構 以下是…

VTEP是什么

VTEP&#xff08;VXLAN Tunnel Endpoint&#xff0c;VXLAN 隧道端點&#xff09;是 VXLAN&#xff08;Virtual Extensible LAN&#xff09;網絡中的關鍵組件&#xff0c;用于處理 VXLAN 流量的封裝和解封裝。以下以可讀的 Markdown 格式詳細解釋 VTEP 的定義、功能、實現方式以…

antdv3 Tabs.TabPane 右上角增加一個角標Badge

1、Tabs官方說明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角標官方效果圖 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要實現的效果 4、代碼 <Tabs v-m…

淺析 Spring 啟動過程:從源碼到核心方法

淺析 Spring 啟動過程&#xff1a;從源碼到核心方法 一、Spring 注解方式啟動類 Demo二、Spring 啟動過程源碼解析?AnnotationConfigApplicationContext構造函數refresh()方法詳解 三、refresh()的核心方法/步驟obtainFreshBeanFactory() - 獲取Bean工廠prepareBeanFactory(be…

貝葉斯優化Transformer融合支持向量機多變量回歸預測,附相關性氣泡圖、散點密度圖,Matlab實現

貝葉斯優化Transformer融合支持向量機多變量回歸預測&#xff0c;附相關性氣泡圖、散點密度圖&#xff0c;Matlab實現 目錄 貝葉斯優化Transformer融合支持向量機多變量回歸預測&#xff0c;附相關性氣泡圖、散點密度圖&#xff0c;Matlab實現效果一覽基本介紹程序設計參考資料…

智慧化系統安全分析報告

智慧化系統的安全背景與現狀 一、政策法規背景 &#xff08;一&#xff09;全球主要國家/地區政策對比 地區政策名稱核心內容實施時間特點中國《生成式人工智能服務管理暫行辦法》明確服務提供者責任&#xff0c;強調數據合法、隱私保護&#xff0c;禁止生成違法內容2023年8…

【學習筆記】點云自動化聚類簡要總結

聚類是將將具有相似特征劃分為相同點集的操作。 基于空間鄰近性的方法 核心思想&#xff1a;依據點的空間距離進行分組 歐式聚類&#xff08;DBSCAN&#xff0c;KD-tree) 原理&#xff1a;基于半徑搜索和最小點數擴展簇。 優點&#xff1a;適應不規則形狀&#xff0c;無需預…

全志F10c200開發筆記——移植uboot

相關資料&#xff1a; &#xff08;二&#xff09;uboot移植--從零開始自制linux掌上電腦&#xff08;F1C200S)&#xff1c;嵌入式項目&#xff1e;-CSDN博客 F1C200S挖坑日記&#xff08;3&#xff09;——Uboot編譯篇_f1c200s uboot-CSDN博客 一、安裝編譯器 Linaro Rele…

常見WEB漏洞----暴力破解

什么是暴力破解 暴力破解 (Brue Force) 是一種攻擊方法 (窮舉法)&#xff0c;簡稱為“爆破”&#xff0c;黑客通過反復猜解和實驗&#xff0c;旨在以暴力手段登入、訪問目標主機獲取服務&#xff0c;破壞系統安全&#xff0c;其屬于 ATT&CK技術中的一種&#xff0c;常利用…

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令變體4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…