Java并發編程中高效緩存設計的哲學

文章目錄

    • 引言
    • 詳解緩存的設計和演進
      • 基于緩存存儲運算結果
      • 鎖分段散列減小鎖粒度
      • 異步化提升處理效率
      • 原子化避免重復運算
    • 小結
    • 參考

引言

本文將基于并發編程和算法中經典的哈希取模、鎖分段、 異步化、原子化。這幾個核心設計理念編寫逐步推演出一個相對高效的緩存工具,希望對你有所啟發。

我是 SharkChili ,Java 開發者,Java Guide 開源項目維護者。歡迎關注我的公眾號:寫代碼的SharkChili,也歡迎您了解我的開源項目 mini-redis:https://github.com/shark-ctrl/mini-redis。

為方便與讀者交流,現已創建讀者群。關注上方公眾號獲取我的聯系方式,添加時備注加群即可加入。

詳解緩存的設計和演進

基于緩存存儲運算結果

我們有一批數據需要通過運算才能獲得結果,而每一次運算大約耗時是500ms,所以為了避免重復運算導致的等待,我們希望對應數據第一次運算的結果直接緩存到容器中,后續線程可直接通過容器獲得結果:

在這里插入圖片描述

于是我們就有了第一個版本,利用緩存避免非必要的重復計算,從而提升程序在單位時間內的吞吐量

public class ComputeCache {public final Map<Integer, Integer> cache = new HashMap<>();public synchronized int compute(int arg) {if (cache.containsKey(arg)) {//若存在直接返回結果return cache.get(arg);} else {//若不存在則計算后緩存并返回int result = doCompute(arg);cache.put(arg, result);return result;}}//模擬耗時的計算private int doCompute(int key) {ThreadUtil.sleep(500);return key << 1;}public synchronized int size() {return cache.size();}}

我們利用下面這段單元測試來驗證緩存的性能和正確性,這里筆者也簡單介紹一下幾個比較核心的點:

  1. 聲明本機CPU核心數+1的線程數執行并發運算
  2. 利用倒計時門閂控制線程并發流程起止,保證準確感知所有運算任務結束后,執行耗時統計
  3. 利用容器中最直觀且容易檢查出錯誤的屬性size進行比對判斷我們的緩存是否正確

最終在筆者的機器下5000并發的耗時大約是26765ms,整體還是不太符合我們的預期:

//初始化緩存工具<

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

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

相關文章

MATLAB的.mat文件

.mat文件是MATLAB的專有二進制數據文件格式&#xff0c;用于保存MATLAB工作空間中的變量和數據。 主要特點&#xff1a; 1. 存儲內容&#xff1a; 各種類型的變量&#xff08;數組、矩陣、結構體、單元數組等&#xff09;函數句柄、對象稀疏矩陣多維數組 2. 文件特性&#…

ICM-20948 Wake on Motion功能開發全過程(7)

接前一篇文章:ICM-20948 Wake on Motion功能開發全過程(6) 探索工作 深入探索 上一回講到,筆者在InvenSense官網上找到了實現Wake on Motion功能的指導文檔。其中主要步驟如下: 本回就來結合文檔中的步驟,詳細講解每一步。 (1)第1步 —— 初始化所有配置 注意,文檔…

Dipal D1:數字人時代的全新人機關系形態

在科技不斷突破的今天,虛擬與現實之間的界限正變得越來越模糊。Dipal D1 作為全球首款搭載2.5K曲面OLED顯示屏的3D AI數字人硬件產品,不僅是一款情感陪伴設備,更是AI、AIGC、動漫文化與情感科技深度融合下的全新交互入口。它代表著“孤獨經濟”、“創作者經濟”和“虛擬互動…

Linux離線編譯安裝nginx

Linux離線安裝nginx 1.切換到root用戶 #切換到root用戶 su - #退出root用戶 exit2.目錄操作 #切到根目錄 cd / #查看目錄 ls #切目錄 cd /home/... #到對應的目錄下解壓3.安裝Nginx 在有網絡的設備上下載以下文件&#xff1a; Nginx&#xff1a;從 nginx.org/en/download…

Qt PyQt與PySide技術-C++庫的Python綁定

Qt PyQt與PySide技術-C庫的Python綁定 一、概述二、區別于聯系1、PyQt&#xff1a;Riverbank Computing的解決方案a、發展歷程b、許可模式c、技術特點 2、PySide&#xff1a;Qt官方的Python綁定a、發展歷程b、許可模式c、技術特點 三、對比許可證功能與兼容性社區與維護其他差異…

使用.detach()代替requires=False避免計算圖錯誤

解決對一個對象多次BP更新時造成的RuntimeError: you can only change requires_grad flags of leaf variables.問題_解決對一個對象多次bp更新時造成的問題-CSDN博客 代碼中存在一個特征需要參與輔助損失的計算&#xff0c;由于需要反復進行反向傳播更新&#xff0c;計算圖容易…

linux+docker+ollama+git常用指令

1、Linux命令 新建txt文件&#xff1a;touch xxx.txt 給txt文件夾權限&#xff1a;chmod x xxx.txt 查看日志&#xff1a;tail -f xxx.log / less xxx.log 根據關鍵字查看日志&#xff1a;grep "error" 文件名 查看端口狀態&#xff1a;netstat -an|grep xxxxx 查看…

【八股消消樂】消息隊列優化—系統架構設計

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一個正在變禿、變強的文藝傾年。 &#x1f514;本專欄《八股消消樂》旨在記錄個人所背的八股文&#xff0c;包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點&#xff…

WebSocket長連接在小程序中的實踐:消息推送與斷線重連機制設計

一、引言&#xff1a;為什么需要WebSocket長連接&#xff1f; 傳統方案的痛點&#xff1a;HTTP輪詢的低效性&#xff08;高延遲、高資源消耗&#xff09;小程序場景需求&#xff1a;實時消息推送&#xff08;如IM、直播彈幕、IoT設備狀態同步&#xff09;技術選型對比&#xf…

MySQL索引使用指南:何時該為字段添加索引?

在MySQL的性能優化中&#xff0c;索引是最常用且有效的手段之一。但“索引不是萬能藥”——盲目添加索引可能導致寫操作變慢、存儲空間浪費&#xff0c;甚至引發索引失效問題。本文將結合原理與實戰場景&#xff0c;幫你理清??“何時該用索引”??的核心判斷邏輯。 一、先理…

AI時代關鍵詞SEO優化

內容概要 在人工智能&#xff08;AI&#xff09;驅動的時代浪潮下&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;正迎來深刻變革&#xff0c;關鍵詞策略已成為流量獲取的核心戰場。本文將系統剖析AI時代關鍵詞優化的前沿方法&#xff0c;涵蓋語義分析的精準研究、用戶意…

GO 語言學習 之 代碼風格

1. 命名規范 字母數字和下劃線組成 以小寫字母、大寫字母或下劃線開頭 不允許包含標點符號、運算符、空白字符&#xff08;空格、TAB、換行&#xff09;等 采用駝峰命名法 &#xff08;大駝峰、小駝峰&#xff09; 見名知義&#xff1a;命名要有實際意義&#xff0c;易讀性&am…

【軟考高級系統架構論文】論云上自動化運維及其應用

論文真題 云上自動化運維是傳統IT運維和 DevOps的延伸,通過云原生架構實現運維的再進化。云上自動化運維可以有效幫助企業降低IT運維成本,提升系統的靈活度,以及系統的交付速度,增強系統的可靠性,構建更加安全、可信、開放的業務平臺。 請圍繞“云上自動化運維及其應用”…

錯誤: 程序包androidx.fragment.app不存在 import android

錯誤: 程序包androidx.fragment.app不存在 import androidx.fragment.app.FragmentActivity; 這個是什么錯?dependencies { //implementation fileTree(dir: libs, include: [*.jar]) implementation project(path: :libscan) //noinspection GradleCompatible implementation…

Java UDP Socket 實時在線刷卡掃碼POS消費機門禁控制板服務端示例源碼

本示例使用的設備&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bYG0BuO&ftt&id17021194999 一、獲取本電腦所有網卡IP public static String getIP() {Enumeration<NetworkInterface> netInterfaces;ArrayList<String>…

MATLAB基礎應用精講-【數模應用】層次分析法(AHP)(附MATLAB和python代碼實現)

目錄 前言 算法原理 什么是層次分析法(AHP) 注意事項 基本原理 算法步驟 1建立層次結構 2構建判斷矩陣 3計算權重向量 4一致性檢驗 SPSSAU AHP層次分析案例 1、背景 2、理論 3、操作 4、SPSSAU輸出結果 5、文字分析 6、剖析 疑難解惑 數據如何錄入? 如何…

Macintosh小電腦、小手機 | openKylin最新硬件創意形態首次亮相!

近期&#xff0c;OpenAtom openKylin&#xff08;簡稱 “openKylin”&#xff09;社區與嘉立創旗下的立創開發板團隊展開深度技術合作&#xff0c;成功完成立創?泰山派1開發板與openKylin 2.0操作系統的兼容適配。5月24日&#xff0c;嘉立創“第三屆開源硬件星火會”在深圳盛大…

基于Spring Boot的計算機考研交流系統的設計與實現

基于Spring Boot的計算機考研交流系統的設計與實現 隨著計算機科學的發展&#xff0c;越來越多的學生選擇考研來提高自己的專業水平。然而&#xff0c;考研的過程中&#xff0c;學生們面臨著各種問題&#xff0c;如學習資料的獲取、交流平臺的缺乏等。為了更好地滿足這些需求&…

技術逐夢之旅:從C語言到Vue的成長之路

董翔&#xff0c;一個對軟件技術充滿熱忱的00后。從初次在屏幕上敲出"Hello World"的激動&#xff0c;到如今能夠獨立開發完整Web應用的從容&#xff0c;我的編程之路見證了技術的迭代與自我的蛻變。 作為軟件專業的學生&#xff0c;我始終堅信"技術是解決問題…

Qt QMap數據清除測試(驗證QMap內存正確釋放方法)

環境 Qt C (msvc編譯環境) 測試代碼 //定義 動子信息 &#xff08;可放在.cpp文件 中&#xff09; struct MoverInfo{uint32_t ID;double PartPosition;uint16_t ModuleID;uint32_t PartID;uint32_t TrackID;uint32_t TrackID2; };//使用Windows任務管理器查看內存使用情況//…