java高分面試指南:redis怎么保證高可用

緩存雪崩

緩存雪崩指的是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核心面試題庫

以下是我個人的一些做法,希望可以給各位提供一些幫助:

點擊《一線互聯網大廠Java核心面試題庫》即可免費領取,整理了很長一段時間,拿來復習面試刷題非常合適,其中包括了Java基礎、異常、集合、并發編程、JVM、Spring全家桶、MyBatis、Redis、數據庫、中間件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且還會持續的更新…可star一下!

image

283頁的Java進階核心pdf文檔

Java部分:Java基礎,集合,并發,多線程,JVM,設計模式

數據結構算法:Java算法,數據結構

開源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架構設計,Redis緩存,Zookeeper,kafka,RabbitMQ,負載均衡等

微服務部分:SpringBoot,SpringCloud,Dubbo,Docker

image

還有源碼相關的閱讀學習

image

gCloud,Dubbo,Docker

[外鏈圖片轉存中…(img-IQmcDROd-1625046573471)]

還有源碼相關的閱讀學習

[外鏈圖片轉存中…(img-sQ31gj3D-1625046573473)]

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

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

相關文章

linux文件系統只有幾k,關于Linux文件系統的的簡單理解和認識

關于Linux文件系統的的簡單理解和認識關于文件系統的運作,這與操作系統帶的檔案數據有關。例如Linux操作系統的檔案權限(rwx)與文件屬性(擁有者,群組,時間參數等)。文件系統通常會將這兩部分的數據分別存放在不同的區塊,權限與屬性…

Java高級工程師必備知識!java入門書籍pdf

美團技術一面20分鐘 晚7點,因為想到下周一才面試,我剛準備出去打個羽毛球,北京的電話就來了。面試官各種抱歉,說開會拖延了。 1、自我介紹 說了很多遍了,很流暢撿重點介紹完。 2、問我數據結構算法好不好 挺好的&…

機器人足球比賽linux,機器人足球實驗報告.doc

機器人足球實驗報告.doc實驗一一、實驗目的掌握RoboCup仿真機器人足球比賽相關知識點,具體內容如下:Linux操作系統的熟悉及了解其基本操作。掌握Linux下如何進行C編程,了解gcc編譯器以及一些簡單編輯工具,如:vi、emacs…

linux eclipse設置顏色,Linux Eclipse美化:解決工具欄過大和 Javadoc背景色修改

Eclipse 在Ubuntu 下總是感覺上面的工具欄感覺特別的大,控件之間的空隙非常的大,和在Windows 下的感覺非常的不一樣(畢竟是剛剛從windows叛逃出來),其實也不光光是Eclipse 是這樣,其他也軟件也同樣有這個問題。嘗試過通過更換主題…

Java高級工程師面試實戰,mysqlsettimeout

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

manjaro linux 關機,給本子安裝manjaro 出現無法關機的解決辦法

manjaro-kde-17.1.8-stable 和* win10* 雙系統 總是發現在關機或者重啟的時候,出現莫名凍屏的情況,只能按電腦的電源按鈕才可以強行關掉,(在進行解決的時候強行關機了 好多次!!。。心疼啊!!) 最…

Java高級開發面試,java字符串拼接的方法

一面:70分鐘 突擊電話面試 正思考著項目功能模塊,阿里面試官打來了電話,開始了阿里一面。 阿里面試官自我介紹,介紹了5分鐘左右,部門的情況,主要的業務 提問開始 會哪些操作系統 Linux會一點說一下操作指…

linux下安裝nginx1.10,Linux(RHEL7.0)下安裝nginx-1.10.2(示例代碼)

查看當前系統版本是否支持當前,nginx發布包支持以下Linux操作系統版本:RHEL/CentOS:VersionSupported Platforms5.xx86_64, i3866.xx86_64, i3867.xx86_64, ppc64leDebian:VersionCodenameSupported Platforms7.xwheezyx86_64, i3868.xjessiex86_64, i386Ubuntu:Ver…

Java高級開發面試,java泛型下界通配符

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

c語言extern作用域,函數內定義extern變量是怎么回事?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓http://ca21days.blog.163.com/blog/static/4383729420096102223744/變量的聲明(declarations)會將變量的類型和名稱傳達給程序。當然,定義(definitions)也是一種聲明:當我們定義一個變量的時候,…

Java高級進階學習資料!java開發環境的搭建是什么意思

1. static 和 final 的用法 static 的作用從三個方面來談,分別是靜態變量、靜態方法、靜態類。 靜態變量:聲明為 static 的靜態變量實質上就是全局變量,當聲明一個對象時,并不產生static 變量的拷貝,而是該類所有實例…

交大c語言第一次作業答案,第一次作業答案(供參考)

以下為《第一次作業答案(供參考)》的無排版文字預覽,完整格式請下載下載前請仔細閱讀文字預覽以及下方圖片預覽。圖片預覽是什么樣的,下載的文檔就是什么樣的。計算最優投資組合:無風險的短期國債貨幣基金期望收益率為:8%股票基金…

Java高級面試題!java小游戲制作視頻

首先我們先來看看這份Spring源碼分析筆記 Spring源碼分類的一覽無余,詳細清晰明了!讓你分分鐘把握! Spring源碼分析筆記手冊內容,共七個部分 第一部分Spring概述 Spring 簡介Spring 發展歷程Spring 的優勢Spring 的核?結構Sprin…

c語言 字符轉int型,C語言—類型之間的轉換

原標題:C語言—類型之間的轉換當混合不同類型的數據進行計算時,便會發生類型轉換。當不同類型的數據進行計算時,應首先將操作數轉換成相同的數據類型,然后再進行計算。類型轉換有兩種形式,即隱式類型轉換和顯示類型轉換…

Java高級面試題!java構造方法的作用和特點

1. Redis面試專題 絕大部分寫業務的程序員,在實際開發中使用 Redis 的時候,只會 Set Value 和 Get Value 兩個操作,對 Redis 整體缺乏一個認知。這里以面試題的形式對 Redis 常見問題做一個總結,解決大家的知識盲點。 什么是Red…

c語言程序改頻率,求問。這個fft c語言程序 采樣的聲音頻率為多少?

timernum,timernum2,LEDnum3,Ltime;//用于分離/*加入數組用于顯示相應led燈數目*/uchar lednum[]{0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的顯示數組 P2組控制int xdata FftReal[SAMPLE_NUM];int xdata FftImage[SAMPLE_NUM];sbit p30P3^0;sbit p31P3^1;sbit p3…

Java高級面試題!java編程思想怎么學

專題5:Java序列化 1、什么是java序列化,如何實現java序列化? 2、保存(持久化)對象及其狀態到內存或者磁盤 3、序列化對象以字節數組保持-靜態成員不保存 4、序列化用戶遠程對象傳輸 5、Serializable 實現序列化 6、writeObject 和 readO…

計算星期c語言編碼,[轉載]計算任何一天是星期幾的C語言源代碼.

[轉載]計算任何一天是星期幾的C語言源代碼.#include int main(){int day,mn,yr,i,days0,s,k;int mont[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};char wek[][9]{ {S,u,n,d,a,y},{M,o,n,d,a,y},{T,u,e,s,d,a,y},{W,e,d,n,s,d,a,y},{T,h,u,r,s,d,a,y},{F,r,i,d,a,y},{S,a,t,u,…

Java高級:mysqllimit兩個參數

零基礎如何學習Java? 首先,你要明白一點,Java入門不難! 無論你是從事哪個行業,興趣一定是最好的老師,也是你學習的動力。 學習方式1:自學 自學模式其實我個人不建議絕大部分的人選擇&#x…

db2 c語言游標名稱可以是變量,mysql?c語言?游標能取多行嗎

滿意答案xuyingcxm2015.02.03采納率:45% 等級:12已幫助:7182人1、 無返回結果語句,如:INSERT,UPDATE,DROP, DELETE等2、 select語句返回單行變量并可傳給本地變量(select ..into)3、 返回多行結果集的select語句,并…