不愧是Alibaba技術官,java數組實現單向鏈表

緩存雪崩

緩存雪崩指的是Redis當中的大量緩存在同一時間全部失效,而假如恰巧這一段時間同時又有大量請求被發起,那么就會造成請求直接訪問到數據庫,可能會把數據庫沖垮。

緩存雪崩一般形容的是緩存中沒有而數據庫中有的數據,而因為時間到期導致請求直達數據庫。

解決方案

解決緩存雪崩的方法有很多:

  • 1、加鎖,保證單線程訪問緩存。這樣就不會有很多請求同時訪問到數據庫。

  • 2、失效時間不要設置成一樣。典型的就是初始化預熱數據的時候,將數據存入緩存時可以采用隨機時間來確保不會咋同一時間有大量緩存失效。

  • 3、內存允許的情況下,可以將緩存設置為永不失效。

緩存擊穿

緩存擊穿和緩存雪崩很類似,區別就是緩存擊穿一般指的是單個緩存失效,而同一時間又有很大的并發請求需要訪問這個key,從而造成了數據庫的壓力。

解決方案

解決緩存擊穿的方法和解決緩存雪崩的方法很類似:

  • 1、加鎖,保證單線程訪問緩存。這樣第一個請求到達數據庫后就會重新寫入緩存,后續的請求就可以直接讀取緩存。

  • 2、內存允許的情況下,可以將緩存設置為永不失效。

緩存穿透

緩存穿透和上面兩種現象的本質區別就是這時候訪問的數據其在數據庫中也不存在,那么既然數據庫不存在,所以緩存里面肯定也不會存在,這樣如果并發過大就會造成數據源源不斷的到達數據庫,給數據庫造成極大壓力。

解決方案

對于緩存穿透問題,加鎖并不能起到很好地效果,因為本身key就是不存在,所以即使控制了線程的訪問數,但是請求還是會源源不斷的到達數據庫。

解決緩存穿透問題一般可以采用以下方案配合使用:

  • 1、接口層進行校驗,發現非法的key直接返回。比如數據庫中采用的是自增id,那么如果來了一個非整型的id或者負數id可以直接返回,或者說如果采用的是32位uuid,那么發現id長度不等于32位也可以直接返回。

  • 2、將不存在的數據也進行緩存,可以直接緩存一個空或者其他約定好的無效value。采用這種方案最好將key設置一個短期失效時間,否則大量不存在的key被存儲到Redis中,也會占用大量內存。

布隆過濾器(Bloom Filter)

針對上面緩存穿透的解決方案,我們思考一下:假如一個key可以繞過第1種方法的校驗,而此時有大量的不存在key被訪問(如1億個或者10億個),那么這時候全部存儲到緩存,會占用非常大的空間,會浪費大量服務器內存,導致內存不足。

那么有沒有一種更好的解決方案呢?這就是我們接下來要介紹的布隆過濾器,布隆過濾器就可以最大程度的解決key值過多的這個問題。

什么是布隆過濾器

可能大部分人都知道有這么一個面試問題:如何在10億的海量的無序的數據中快速判斷一個元素是否存在?

要解決這個問題就需要用到布隆過濾器,否則大部分服務器的內存是無法存儲這么大的數量級的數據的。

布隆過濾器(Bloom Filter)是由布隆在1970年提出的。它實際上是一個很長的二進制向量(位圖)和一系列隨機映射函數(哈希函數)。

布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率而且刪除困難。

位圖(Bitmap)

Redis當中有一種數據結構就是位圖,布隆過濾器其中重要的實現就是位圖的實現,也就是位數組,并且在這個數組中每一個位置只有0和1兩種狀態,每個位置只占用1個字節,其中0表示沒有元素存在,1表示有元素存在。如下圖所示就是一個簡單的布隆過濾器示例(一個key值經過哈希運算和位運算就可以得出應該落在哪個位置):

image.png

哈希碰撞

上面我們發現,lonely和wolf落在了同一個位置,這種不同的key值經過哈希運算后得到相同值的現象就稱之為哈希碰撞。發生哈希碰撞之后再經過位運算,那么最后肯定會落在同一個位置。

如果發生過多的哈希碰撞,就會影響到判斷的準確性,所以為了減少哈希碰撞,我們一般會綜合考慮以下2個因素:

  • 1、增大位圖數組的大小(位圖數組越大,占用的內存越大)。

  • 2、增加哈希函數的次數(同一個key值經過1個函數相等了,那么經過2個或者更多個哈希函數的計算,都得到相等結果的概率就自然會降低了)。

上面兩個方法我們需要綜合考慮:比如增大位數組,那么就需要消耗更多的空間,而經過越多的哈希計算也會消耗cpu影響到最終的計算時間,所以位數組到底多大,哈希函數次數又到底需要計算多少次合適需要具體情況具體分析。

布隆過濾器的2大特點

下面這個就是一個經過了2次哈希函數得到的布隆過濾器,根據下圖我們很容易看到,假如我們的Redis根本不存在,但是Redis經過2次哈希函數之后得到的兩個位置已經是1了(一個是wolf通過f2得到,一個是Nosql通過f1得到)。

image.png

所以通過上面的現象,我們從布隆過濾器的角度可以得出布隆過濾器主要有2大特點:

  • 1、如果布隆過濾器判斷一個元素存在,那么這個元素可能存在。

  • 2、如果布隆過濾器判斷一個元素不存在,那么這個元素一定不存在。

而從元素的角度也可以得出2大特點:

  • 1、如果元素實際存在,那么布隆過濾器一定會判斷存在。

  • 2、如果元素不存在,那么布隆過濾器可能會判斷存在。

PS:需要注意的是,如果經過N次哈希函數,則需要得到的N個位置都是1才能判定存在,只要有一個是0,就可以判定為元素不存在布隆過濾器中。

fpp

因為布隆過濾器中總是會存在誤判率,因為哈希碰撞是不可能百分百避免的。布隆過濾器對這種誤判率稱之為假陽性概率,即:False Positive Probability,簡稱為fpp。

在實踐中使用布隆過濾器時可以自己定義一個fpp,然后就可以根據布隆過濾器的理論計算出需要多少個哈希函數和多大的位數組空間。需要注意的是這個fpp不能定義為100%,因為無法百分保證不發生哈希碰撞。

總結

其他的內容都可以按照路線圖里面整理出來的知識點逐一去熟悉,學習,消化,不建議你去看書學習,最好是多看一些視頻,把不懂地方反復看,學習了一節視頻內容第二天一定要去復習,并總結成思維導圖,形成樹狀知識網絡結構,方便日后復習。

這里還有一份很不錯的《Java基礎核心總結筆記》,特意跟大家分享出來,需要的話點擊這里免費獲取

目錄:

部分內容截圖:

iP-1626932288633)]

部分內容截圖:

[外鏈圖片轉存中…(img-ulePHIjj-1626932288635)]

[外鏈圖片轉存中…(img-Q54A4O50-1626932288637)]

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

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

相關文章

【線程】讀寫鎖

一、概念 一把讀寫鎖具備三種狀態: 讀模式下加鎖狀態(讀鎖)寫模式下加鎖轉態(寫鎖)不加鎖狀態2. 讀寫鎖特性: 讀寫鎖是寫模式加鎖時,解鎖前,所有對該鎖加鎖的線程都會阻塞。讀寫鎖是讀模式加鎖時,如果線程以…

不愧是阿里大佬,mysql存儲過程寫法案例

容器化時代來了 虛擬化技術已經走過了三個時代,沒有容器化技術的演進就不會有 Docker 技術的誕生。 虛擬化技術演進 (1)物理機時代:多個應用程序可能會跑在一臺機器上。 (2)虛擬機時代:一臺物…

讀寫鎖(二)

一、實驗項目 【問題描述】程序 trainticket 中,有 100 個線程,其中 90 個線程是查余票數量的,只有 10 個線程搶票,每個線程一次買 10 張票。初始狀態下一共有 1000 張票。因此執行完畢后,還會剩下 900 張票。 程序 …

不看絕對血虧!java字符串轉json

一、對Kafka的認識 1.Kafka的基本概念 2.安裝與配置 3.生產與消費 4.服務端參數配置 二、生產者 1.客戶端開發 必要的參數配置消息的發送序列化分區器生產者攔截器 2.原理分析 整體架構元數據的更新 3.重要的生產者參數 三、消費者 1.消費者與消費組 2.客戶端開發 必要的…

【線程】屏障

一、主要函數應用 1. 函數原型:初始化和回收 int pthread_barrier_init(pthread *barrier, const pthread_barrier_t *attr, unsigned int count); int pthread_barrier_destroy(pthread_barrier_t *barrier);分析: 初始化屏障時,可以使用c…

中高級工程師Java開發!java生成隨機數代碼包

微服務是什么 微服務起源于2005年Peter Rodgers博士在云端運算博覽會提出的微Web服務(Micro-Web-Service),根本思想類似于Unix的管道設計理念。2014年,由Martin Fowler 與 James Lewis共同提出了微服務的概念,定義了微服務架構風格是一種通過…

Java軟件開發面試題!hr和技術經理一起面

springspring5最全知識梳理大綱(總) spring最全知識梳理大綱(總) spring5最全知識梳理大綱(總) spring最全知識梳理大綱(分) 為什么要使用Spring? Bean spring事務 面向…

XSI IPC

一、查詢IPC的命令 顯示: ipcs -a 顯示所有共享內核對象 ipcs -m 顯示共享內存 m memory ipcs -q 消息隊列 q queue ipcs -s 顯示信號量 s semphore刪除: ipcrm -m ID 刪除共享內存 ipcrm -q ID 刪除共享隊列 ipcrm -s ID 刪除信號量 二…

Java進階之光!javaunicode碼轉字符

01 如何理解高并發? 高并發意味著大流量,需要運用技術手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩地被系統所處理,帶給用戶更好的體驗。 我們常見的高并發場景有:淘寶的雙11、春運時的搶票、…

Java進階之光!java字符串類型轉換為int

阿里巴巴篇 1.扎實的計算機專業基礎,包括算法和數據結構,操作系統,計算機網絡,計算機體系結構,數據庫等2.具有扎實的Java編程基礎,理解IO、多線程等基礎框架3.熟練使用Linux系統的常用命令及shell有一定了…

Java進階之光!mysql創建用戶并授權建表

正文 MyBatis 的整體架構分為三層, 分別是基礎支持層、核心處理層和接口層,如下圖所示。 基礎支持層 反射模塊 該模塊對 Java 原生的反射進行了良好的封裝,提供了更加簡潔易用的 API ,方便上層使調用,并且對反射操作…

System V 信號量

一、System V 信號量 1.信號量linux命令 顯示&#xff1a; ipcs -a 顯示所有共享內核對象 ipcs -s 顯示信號量 s semphore刪除&#xff1a; ipcrm -s ID 刪除信號量 二、主要函數應用 1. 函數原型&#xff1a; #include <sys/sem.h> int semget(key_t key, int …

Java進階之光!mysql安裝包安裝教程

我聽到的一些發聲 你們賺的錢已經可以了&#xff1a; 我一個發小是做土木工程的&#xff0c;上海大學博士&#xff0c;參與很多著名建筑的工程&#xff0c;但是從薪資上看&#xff0c;還不如一些稍微像樣的公司的6年多的高級開發。為什么&#xff1f;這就是行業的紅利&#xf…

Java進階學習資料!dockerjar內存

準備好套路 **①自我介紹&#xff1a;**千萬不能筐瓢&#xff0c;一定要牢記&#xff0c;自然流暢地介紹自己的學習經歷、工作經歷、項目經歷、個人優勢等等&#xff1b; **②抽象概念&#xff1a;**當面試官問你是如何理解多線程的時候&#xff0c;你要知道從定義、來源、實…

管道(二)

無名管道 測試代碼&#xff1a; #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <string.h>#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); }while(0) #define TEST_SIZE 68*1024int mai…

Java進階:java字符串定位語句

正文 模塊&#xff08;Module&#xff09;、組件&#xff08;Component&#xff09;、包&#xff08;Package&#xff09;&#xff0c;這些概念對于我們技術同學并不陌生&#xff0c;但并不是所有人都能理解其要義。 深入理解之后&#xff0c;我才發現&#xff0c;其背后的深…

有名管道

一、有名管道 1. 為何提出有名管道的說法&#xff0c;目的是為了克服無名管道的不足之處&#xff1a; 無名管道只能是用于具有親緣關系的進程之間&#xff0c;這就限制了無名管道的使用范圍。有名管道可以使互不相關的兩個進程互相通信&#xff0c;有名管道可以通過路徑名來指…

Java進階:mysql的事務隔離級別面試題

一面&#xff1a; 阿里巴巴面試答案文末可以領取&#xff01; 1. 觸發新生代GC&#xff0c;如果存活對象總量大于survivor區容量&#xff0c;咋辦 2. 如果任務很多&#xff0c;線程池的阻塞隊列會撐爆內存的哪個區域 3. 棧在堆上嗎 4. GC root有哪些 5. 實例變量可以是GC…

有名管道(二)

一、從FIFO中讀取數據&#xff1a; 約定&#xff1a;如果一個進程為了從FIFO中讀取數據而以阻塞的方式打開FIFO&#xff0c;則稱內核為該進程的讀操作設置了阻塞標志。 如果有進程為寫而打開FIIF&#xff08;寫端存在&#xff09;&#xff0c;且當前FIFO內沒有數據&#xff0…

Java面試2021,java數據可視化項目

AOP簡介 AOP (Aspect Oriented Programing) 稱為&#xff1a;面向切面編程&#xff0c;它是一種編程思想。AOP 是 OOP&#xff08;面向對象編程 Object Oriented Programming)的思想延續 AOP采取橫向抽取機制&#xff0c;取代了傳統縱向繼承體系重復性代碼的編寫方式&#xff0…