Java,八股,cv,算法——雙非研0四修之路day16

目錄

?昨日總結

今日計劃

算法——兩個數組的交集

算法——兩數之和

緩存穿透

常見解決方案

緩存雪崩

常見解決方案

緩存擊穿

常見解決方案

棧溢出

堆溢出

功能接口式參數&泛型函數

?編輯


?昨日總結

  • 緩存問題完結(緩存穿透、雪崩、擊穿),了解堆、棧溢出,功能接口式參數&泛型函數,完成點評緩存部分
  • cv(停滯中)
  • 背誦小林coding--Java并發面試篇(1/3)
  • 代碼隨想錄——兩個數組的交集,兩數之和

今日計劃

  • 跟進點評項目
  • cv(停滯中)
  • 背誦小林coding--Java并發面試篇(1/3)
  • 代碼隨想錄——四數相加,三數之和

算法——兩個數組的交集

給定兩個數組?nums1?和?nums2?,返回?它們的?交集?。輸出結果中的每個元素一定是?唯一?的。我們可以?不考慮輸出結果的順序?。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解釋:[4,9] 也是可通過的
class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> set = new HashSet<>();for(int num : nums1) {set.add(num);}Set<Integer> T = new HashSet<>();for(int num : nums2) {if(set.contains(num))T.add(num);}//通過 stream() 方法將 List 轉換為流,mapToInt 方法將 Integer 類型的流//轉換為 int 類型的流, 最后使用 toArray 方法將流轉換為 int 數組。int[] t = T.stream().mapToInt(Integer::intValue).toArray();return t;}
}

算法——兩數之和

給定一個整數數組?nums?和一個整數目標值?target,請你在該數組中找出?和為目標值?target? 的那?兩個?整數,并返回它們的數組下標。

你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。

你可以按任意順序返回答案。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<>();for(int i = 0; i< nums.length; i++) {int temp = target - nums[i];if(map.containsKey(temp))return new int[] {map.get(temp),i};map.put(nums[i],i);}return new int[0];}
}

緩存穿透

緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在,這樣緩存永遠不會生效,這些請求都會打到數據庫。
常見解決方案
  • 緩存空對象:當客戶端訪問redis未命中時,會訪問數據庫 ,若此時數據庫也未命中,將會redis緩存一個null空對象
優點:實現簡單,維護方便
缺點 :額外的內存消耗,可能造成 短期的不一致(針對此問題,1.可以為緩沖空數據設置一個TTL生存時間 2.可以每完成一次數據庫的操作 ,便立即更新緩存 )
  • 布隆過濾
當客戶端發出 請求 時 ,會首先經過布隆過濾器進行判斷,是否 存在該數據 。若存在之后在經過redis或再經過數據庫。
布隆過濾器原理 :用二進制位和哈希函數來存在 該數據是否存在
優點 :內存占用較小,沒有多余key
缺點:實現 復雜 ,存在誤判可能

緩存雪崩

緩存雪崩是指在同一時段大量的緩存key同時失效或者Redis服務宕機,導致大量請求到達數據庫,帶來巨大壓力。
常見解決方案
  • 給不同的Key的TTL添加隨機值
  • 利用Redis集群提高服務的可用性
  • 給緩存業務添加降級限流策略
  • 給業務添加多級緩存

緩存擊穿

緩存擊穿問題也叫熱點Key問題,就是一個被高并發訪問并且緩存重建業務較復雜的key突然失效了,無數的請求訪問會在瞬間給數據庫帶來巨大的沖擊。
常見解決方案
  • 互斥鎖
優點:沒有額外的內存消耗 ,保證 一致性,實現簡單
缺點:縣城 需要等待,性能受影響,可能會出現死鎖風險
  • 邏輯過期
優點:線程無需等待 ,性能較好
缺點:不保證一致性,有額外的內存消耗,實現復雜。

棧溢出

在Java中,棧是線程私有的,主要用于存儲局部變量和方法調用等。每個線程創建時都會分配一定大小的棧空間,當空間被分配完時,便會發出棧溢出。一般出現棧溢出的情況如下:
  • 陷入死循環的遞歸調用
如果遞歸方法沒有正確的終止條件或者終止條件設置不合理,會導致方法不斷地調用自身,棧幀不斷入棧,最終耗盡棧空間。
  • 方法調用的層次過深
在一個嵌套很深的方法調用中,每個方法都會在棧上分配一定的空間,當調用層次過深時,棧空間就會被耗盡。
  • 局部變量占用的空間過大
如果在方法中定義了大量的局部變量,尤其是一些占用空間較大的數組或對象,會增加每個棧幀的大小,從而使棧空間更快地被耗盡。

堆溢出

在Java中,堆是線程共享的內存區域,主要存儲對象的實例。當空間無法為新的對象分配內存時,就會發生堆溢出。一般出現堆溢出的情況如下:
  • 創建的大量對象沒有及時回收
  • 內存泄漏
內存泄漏是指程序中某些對象不再使用,但由于存在引用關系,垃圾回收器無法回收這些對象,導致堆空間不斷被占用。例如靜態集合類中的對象不會被垃圾回收、某些資源的連接未關閉,造成資源泄漏
  • 分配的堆空間過小
如果Java虛擬機(JVM)的堆空間設置過小,無法滿足程序運行時的內存需求。

功能接口式參數&泛型函數

函數傳遞功能參數通常指的是將行為(函數)作為參數傳遞給另一個方法。
在寫工具類時,如果返回類型不確定,要 利用泛型來解決,讓調用者去告訴具體的函數類型

例如:當在一個工具類中調用數據庫函數時,需要通過函數自身傳遞的參數來傳入,因此通過Lambda表達式傳遞功能

public <R, ID> R queryWithPassThrough(String keyPrefix, ID id , Class<R> type, Function<ID, R> dbFallback,Long time, TimeUnit unit) {String key = "cache:shop:" + id;//從redis查詢商鋪緩存String json = stringRedisTemplate.opsForValue().get(key);//判斷緩存是否存在if (StrUtil.isNotBlank(json)) {//存在 直接返回return JSONUtil.toBean(json, type);}//判斷命中的是否是空值if(json != null) {//返回一個錯誤信息return null;}//不存在,根據id查詢數據庫R r = dbFallback.apply(id);//數據庫不存在返回錯誤if (r == null) {//將空值寫入redisstringRedisTemplate.opsForValue().set(key,"",2L,TimeUnit.MINUTES);return null;}//數據庫存在,寫入redisthis.set(key,r,time,unit);//返回return r;
}

?this::getById?是一個實例方法引用,它等價于Lambda表達式:id -> this.getById(id);

public Result queryById(Long id) {Shop shop = cacheClient.queryWithPassThrough(CACHE_SHOP_KEY,id, Shop.class,this::getById,CACHE_SHOP_TTL,TimeUnit.MINUTES);return Result.ok(shop);
}

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

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

相關文章

基于python的微博評論和博文文本分析,包括LDA+聚類+詞頻分析+lstm熱度預測,數據量10000條

思路步驟&#xff1a;本文實現了從文本評論數據中提取有用信息&#xff0c;分析其情感分布、主題分布&#xff0c;并通過可視化展示。以下是具體步驟和思路&#xff1a;1、數據準備與預處理加載數據&#xff1a;通過 pandas 讀取文本和評論數據&#xff0c;并進行合并處理。文本…

【CNN】模型評估標準

1.分類模型評價指標在模型評估中&#xff0c;有多個標準用于衡量模型的性能&#xff0c;這些標準包括準確率&#xff08;Accuracy&#xff09;、精確率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1 分數&#xff08;F1-Score&#xff09;等。…

Python爬蟲實戰:詩詞名句網《三國演義》全集

Beautiful Soup實戰案例&#xff1a;爬取"詩詞名句網" 目標 爬取"詩詞名句網"上的古典文學作品內容&#xff0c;包括書籍目錄和章節內容&#xff0c;并將每章內容獨立保存為文本文件。 目標網址: 《三國演義》全集在線閱讀_史書典籍_詩詞名句網 要求 書…

AWS CAF:企業云轉型的戰略指南

在數字化轉型的大潮中&#xff0c;企業正面臨前所未有的變革壓力。如何利用云計算驅動業務創新、提升IT敏捷性、優化成本結構&#xff0c;已成為眾多企業迫切需要解決的關鍵課題。然而&#xff0c;云遷移并不是簡單地將本地應用“復制”到云上&#xff0c;它是一項牽涉企業組織…

【Redis】Linux 配置Redis

一、Redis介紹 Redis&#xff08;Remote Dictionary Server&#xff09;是一款開源的、高性能的鍵值對&#xff08;Key-Value&#xff09;存儲數據庫&#xff0c;由 Salvatore Sanfilippo 于 2009 年開發&#xff0c;采用 ANSI C 語言編寫。它以內存存儲為核心&#xff0c;支持…

MongoDB數據庫高并發商業實踐優化·運行優化之不可使用root賬戶進行MongoDB運行-優雅草卓伊凡

MongoDB數據庫高并發商業實踐優化運行優化之不可使用root賬戶進行MongoDB運行-優雅草卓伊凡 引言 關于最近優雅草卓伊凡發布關于MongoDB的內容是由于我們的甲方上線了一個很老的產品&#xff0c;但是他的用戶量極大&#xff0c;并且還有各種人搞事情&#xff0c;不斷的來GJ&a…

戴爾電腦 Linux 安裝與配置指南_導入mysql共享文件夾

本指南將詳細介紹在戴爾電腦上安裝 Linux 操作系統的步驟&#xff0c;以及后續的重要配置&#xff0c;包括系統選擇、安裝流程、MySQL 數據恢復、網絡配置、文件共享和遠程維護等。步驟清晰且配有命令行示例和配置文件示例&#xff0c;適合初中級用戶參考。1、Linux 系統選擇與…

昇思學習營-DeepSeek-R1-Distill-Qwen-1.5B 模型LoRA微調學習心得

LoRA微調&#xff1a;加入參數式微調凍結原始網絡參數&#xff0c;對Attention層中QKV等添加旁支&#xff0c;包含兩個低維度的矩陣A和矩陣B&#xff0c;微調過程中僅更新A、B 矩陣效果&#xff1a;訓練參數被大幅降低&#xff0c;資源消耗較低。對attention的參數加入如下圖所…

彩色轉灰度的核心邏輯:三種經典方法及原理對比

灰度實驗將彩色圖像轉換為灰度圖像的過程稱為灰度化&#xff0c;這種做法在圖像處理和計算機視覺領域非常常見。灰度圖與彩色圖最大的不同就是&#xff1a;彩色圖是由R、G、B三個通道組成&#xff0c;而灰度圖只有一個通道&#xff0c;也稱為單通道圖像&#xff0c;所以彩色圖轉…

Spring Boot 項目啟動自動執行邏輯的最佳實踐:掌握 CommandLineRunner

前言 Spring Boot 啟動階段,總有些操作迫不及待沖在前線:配置要加載,數據要準備,日志要搶首發,仿佛個個爭當“啟動 MVP”。如果你也想讓項目一啟動就自動開工,少寫點手動觸發的“苦力邏輯”,那 CommandLineRunner 就是你的得力助手。它像那個永遠第一個打卡的同事,不喝…

高可用集群KEEPALIVED的詳細部署

一.高可用集群 1.1 集群類型 LB&#xff1a;Load Balance 負載均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 數據庫、Redis SPoF: Single Point of Failure&#xff0c;解決單點故障 HPC&#x…

[論文閱讀] 人工智能 + 軟件工程 | NoCode-bench:評估LLM無代碼功能添加能力的新基準

NoCode-bench&#xff1a;評估LLM無代碼功能添加能力的新基準 論文&#xff1a;NoCode-bench: A Benchmark for Evaluating Natural Language-Driven Feature Addition 研究背景&#xff1a;當AI嘗試給軟件"加新功能"&#xff0c;我們需要一張靠譜的"考卷"…

【Git知識】Git 常用知識集合之基礎--分支系統與 Tag 標簽機制

&#x1f9f0; Git 常用知識集合Git 是程序員的“時間機器”。這份手冊幫你從入門到精通&#xff0c;把 Git 玩明白。1?? Git 基礎操作流程 &#x1f4cc; 三步走流程&#xff1a;添加 → 提交 → 推送 git add . # 把所有修改加入暫存區 git commit -m …

深入解析 Spark:關鍵問題與答案匯總

在大數據處理領域&#xff0c;Spark 憑借其高效的計算能力和豐富的功能&#xff0c;成為了眾多開發者和企業的首選框架。然而&#xff0c;在使用 Spark 的過程中&#xff0c;我們會遇到各種各樣的問題&#xff0c;從性能優化到算子使用等。本文將圍繞 Spark 的一些核心問題進行…

Python-初學openCV——對openCV的簡單使用

一、概述1、簡單介紹OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺庫&#xff0c;旨在為實時圖像處理提供強大的功能。它由Intel開發&#xff0c;現由開源社區維護。OpenCV 提供了跨平臺的解決方案&#xff0c;支持 Windows、Linu…

去中心化時代的通信革命:briefing與cpolar技術融合帶來的安全范式革新

文章目錄前言1.關于briefing2.本地部署briefing3.使用briefing4.cpolar內網穿透工具安裝5.創建遠程連接公網地址6.固定briefing公網地址前言 數字協作本該是提升效率的過程&#xff0c;卻被這些數據管理問題不斷困擾&#xff1a;平臺條款中的監控聲明、跨網絡環境的接入障礙、…

GitHub新手生存指南:AI項目版本控制與協作實戰

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 代碼倉庫創建 分支管理 PR提交 開源項目復現 讀者收獲&#xff1a;掌握團隊開發必備技能…

Axios封裝以及添加攔截器

在前端開發中&#xff0c;http請求層的封裝可以極大提升代碼的復用性和可維護性&#xff0c;本文將完整的用axios封裝接口請求&#xff0c;配置請求與響應攔截器&#xff0c;封裝統一的請求方法全過程。封裝的目的和思路在項目直接用axios發送請求當然沒問題&#xff0c;但是如…

C語言中奇技淫巧04-僅對指定函數啟用編譯優化

相信很多人使用GCC編譯代碼時&#xff0c;都會接觸到gcc -O0/1/2/3/s&#xff0c;知道它可以對工程進行全局優化。 事實上&#xff0c;除了全局優化外&#xff0c;使用GCC擴展方式&#xff0c;我們還可以僅對部分關鍵函數實施差異化編譯優化。 在GCC編譯器中&#xff0c;attrib…

HTML Style 對象深度解析:從基礎到高級應用

一、Style 對象的核心概念定義與作用 Style 對象是 HTML DOM 中用于操作元素內聯樣式的接口&#xff0c;通過 element.style 訪問。它允許動態修改元素的 CSS 屬性&#xff0c;但僅能直接影響內聯樣式&#xff08;即通過 style 屬性直接寫在標簽中的樣式&#xff09;。與外部樣…