一文搞懂JVM架構:跳槽面試大廠被拒

正文

在實際的工作項目中, 緩存成為高并發、高性能架構的關鍵組件 ,那么Redis為什么可以作為緩存使用呢?首先可以作為緩存的兩個主要特征:

  • 在分層系統中處于內存/CPU具有訪問性能良好,
  • 緩存數據飽和,有良好的數據淘汰機制

由于Redis 天然就具有這兩個特征,Redis基于內存操作的,且其具有完善的數據淘汰機制,十分適合作為緩存組件。

其中,基于內存操作,容量可以為32-96GB,且操作時間平均為100ns,操作效率高。而且數據淘汰機制眾多,在Redis 4.0 后就有8種了促使Redis作為緩存可以適用很多場景。

那Redis緩存為什么需要數據淘汰機制呢?有哪8種數據淘汰機制呢?

數據淘汰機制

Redis緩存基于內存實現的,則其緩存其容量是有限的,當出現緩存被寫滿的情況,那么這時Redis該如何處理呢?

Redis對于緩存被寫滿的情況,Redis就需要緩存數據淘汰機制,通過一定淘汰規則將一些數據刷選出來刪除,讓緩存服務可再使用。那么Redis使用哪些淘汰策略進行刷選刪除數據?

在Redis 4.0 之后,Redis 緩存淘汰策略6+2種,包括分成三大類:

  • 不淘汰數據

    • noeviction ,不進行數據淘汰,當緩存被寫滿后,Redis不提供服務直接返回錯誤。
  • 在設置過期時間的鍵值對中,

    • volatile-random ,在設置過期時間的鍵值對中隨機刪除
    • volatile-ttl ,在設置過期時間的鍵值對,基于過期時間的先后進行刪除,越早過期的越先被刪除。
    • volatile-lru , 基于LRU(Least Recently Used) 算法篩選設置了過期時間的鍵值對, 最近最少使用的原則來篩選數據
    • volatile-lfu ,使用 LFU( Least Frequently Used ) 算法選擇設置了過期時間的鍵值對, 使用頻率最少的鍵值對,來篩選數據。
  • 在所有的鍵值對中,

    • allkeys-random, 從所有鍵值對中隨機選擇并刪除數據
    • allkeys-lru, 使用 LRU 算法在所有數據中進行篩選
    • allkeys-lfu, 使用 LFU 算法在所有數據中進行篩選

Note: LRU( 最近最少使用,Least Recently Used)算法, LRU維護一個雙向鏈表 ,鏈表的頭和尾分別表示 MRU 端和 LRU 端,分別代表最近最常使用的數據和最近最不常用的數據。

LRU 算法在實際實現時,需要用鏈表管理所有的緩存數據,這會帶來額外的空間開銷。而且,當有數據被訪問時,需要在鏈表上把該數據移動到 MRU 端,如果有大量數據被訪問,就會帶來很多鏈表移動操作,會很耗時,進而會降低 Redis 緩存性能。

其中,LRU和LFU 基于Redis的對象結構redisObject的lru和refcount屬性實現的:

typedef struct redisObject {unsigned type:4;unsigned encoding:4;// 對象最后一次被訪問的時間unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or* LFU data (least significant 8 bits frequency// 引用計數                        * and most significant 16 bits access time). */int refcount;void *ptr;
} robj;

Redis的LRU會使用redisObject的lru記錄最近一次被訪問的時間,隨機選取參數maxmemory-samples 配置的數量作為候選集合,在其中選擇 lru 屬性值最小的數據淘汰出去。

在實際項目中,那么該如何選擇數據淘汰機制呢?

  • 優先選擇 allkeys-lru算法,將最近最常訪問的數據留在緩存中,提升應用的訪問性能。
  • 有頂置數據使用 volatile-lru算法 ,頂置數據不設置緩存過期時間,其他數據設置過期時間,基于LRU 規則進行篩選 。

在理解了Redis緩存淘汰機制后,來看看Redis作為緩存其有多少種模式呢?

Redis緩存模式

Redis緩存模式基于是否接收寫請求,可以分成只讀緩存和讀寫緩存:

只讀緩存:只處理讀操作,所有的更新操作都在數據庫中,這樣數據不會有丟失的風險。

  • Cache Aside模式

讀寫緩存,讀寫操作都在緩存中執行,出現宕機故障,會導致數據丟失。緩存回寫數據到數據庫有分成兩種同步和異步:

  • 同步:訪問性能偏低,其更加側重于保證數據可靠性

    • Read-Throug模式
    • Write-Through模式
  • 異步:有數據丟失風險,其側重于提供低延遲訪問

    • Write-Behind模式

Cache Aside模式

查詢數據先從緩存讀取數據,如果緩存中不存在,則再到數據庫中讀取數據,獲取到數據之后更新到緩存Cache中,但更新數據操作,會先去更新數據庫種的數據,然后將緩存種的數據失效。

而且Cache Aside模式會存在并發風險:執行讀操作未命中緩存,然后查詢數據庫中取數據,數據已經查詢到還沒放入緩存,同時一個更新寫操作讓緩存失效,然后讀操作再把查詢到數據加載緩存,導致緩存的臟數據。

Read/Write-Throug模式

查詢數據和更新數據都直接訪問緩存服務,緩存服務同步方式地將數據更新到數據庫。出現臟數據的概率較低,但是就強依賴緩存,對緩存服務的穩定性有較大要求,但同步更新會導致其性能不好。

Write Behind模式

查詢數據和更新數據都直接訪問緩存服務,但緩存服務使用異步方式地將數據更新到數據庫(通過異步任務)?速度快,效率會非常高,但是數據的一致性比較差,還可能會有數據的丟失情況,實現邏輯也較為復雜。

在實際項目開發中根據實際的業務場景需求來進行選擇緩存模式。那了解上述后,我們的應用中為什么需要使用到redis緩存呢?

在應用使用Redis緩存可以提高系統性能和并發,主要體現在

  • 高性能:基于內存查詢,KV結構,簡單邏輯運算
  • 高并發: Mysql 每秒只能支持2000左右的請求,Redis輕松每秒1W以上。讓80%以上查詢走緩存,20%以下查詢走數據庫,能讓系統吞吐量有很大的提高

雖然使用Redis緩存可以大大提升系統的性能,但是使用了緩存,會出現一些問題,比如,緩存與數據庫雙向不一致、緩存雪崩等,對于出現的這些問題該怎么解決呢?

使用緩存常見的問題

使用了緩存,會出現一些問題,主要體現在:

  • 緩存與數據庫雙寫不一致
  • 緩存雪崩: Redis 緩存無法處理大量的應用請求,轉移到數據庫層導致數據庫層的壓力激增;
  • 緩存穿透:訪問數據不存在在Redis緩存中和數據庫中,導致大量訪問穿透緩存直接轉移到數據庫導致數據庫層的壓力激增;
  • 緩存擊穿:緩存無法處理高頻熱點數據,導致直接高頻訪問數據庫導致數據庫層的壓力激增;

緩存與數據庫數據不一致

只讀緩存(Cache Aside模式)

對于只讀緩存(Cache Aside模式), 讀操作都發生在緩存中,數據不一致只會發生在刪改操作上(新增操作不會,因為新增只會在數據庫處理),當發生刪改操作時,緩存將數據中標志為無效和更新數據庫 。因此在更新數據庫和刪除緩存值的過程中,無論這兩個操作的執行順序誰先誰后,只要有一個操作失敗了就會出現數據不一致的情況。

面試準備+復習資料分享:

為了應付面試也刷了很多的面試題與資料,現在就分享給有需要的讀者朋友,資料我只截取出來一部分哦,有需要的可以來找我獲取哈

獲取方式:點擊藍色字體即可免費獲取

秋招|美團java一面二面HR面面經,分享攢攢人品

出來一部分哦,有需要的可以來找我獲取哈

獲取方式:點擊藍色字體即可免費獲取

[外鏈圖片轉存中…(img-bzuPKX53-1624225454343)]

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

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

相關文章

全局變量_Python函數中的全局變量與局部變量

# a,b變量是全局變量,在整個py文件中都可以訪問a 11b 12# 定義一個函數def first():# 這個變量是函數內部定義的變量,屬于局部變量,只能在函數中使用c "Hello"# 大括號{} 是format()函數的用法,格式化print("c {}".format(c))# 如果局部變量定義的名稱…

一文詳解:字節面試官必問的Mysql鎖機制

一面 1 自我介紹和項目 2 Java的內存分區 3 Java對象的回收方式,回收算法。 4 CMS和G1了解么,CMS解決什么問題,說一下回收的過程。 5 CMS回收停頓了幾次,為什么要停頓兩次。 6 Java棧什么時候會發生內存溢出,Jav…

install npm 到某個文件下執行_你可能不知道的 npm 依賴管理那些事

點擊上方藍字關注我們npm 是 Node.js 默認的、以 JavaScript 編寫的包管理工具,如今,它已經成為世界上最大的包管理工具,是每個前端開發者必備的工具。不知你是否遇到過下面問題:哎?我本地明明是好的,線上的…

萬字總結!騰訊、字節跳動面經已發

二、常見的并發問題 1、臟讀 一個事務讀取了另一個事務未提交的數據 2、不可重復讀 一個事務對同一數據的讀取結果前后不一致。兩次讀取中間被其他事務修改了 3、幻讀 幻讀是指事務讀取某個范圍的數據時,因為其他事務的操作導致前后兩次讀取的結果不一致。幻讀…

ncbi查找目的基因序列_NCBI大搜索之目的基因尋蹤

NCBI大搜索之目的基因尋蹤最近經常碰到查找目的基因的問題,那今天就講一下如何利用NCBI數據庫查找目的基因!NCBI(National Center For Biotechnology Information),美國國家生物技術信息中心,分子生物學,生物化學及遺傳學領域常用…

萬字長文!2020-2021京東Java面試真題解析

我整理的spring學習筆記: 像spring這種知識點我們不能盲目的學習,首先我們得有一套學習路線,我總結了一套spring的學習思維導圖,今天通過我整理的Spring學習路線.xmind給大家分析spring需要掌握的一些核心知識點。 spring的特點&…

echarts label固定位置_ECharts+百度地圖網絡拓撲應用

前一篇談及到了ECharts整合HT for Web的網絡拓撲圖應用,后來在ECharts的Demo中看到了有關空氣質量的相關報表應用,就想將百度地圖、ECharts和HT for Web三者結合起來也做一個類似空氣質量報告的報表拓撲圖應用,于是有了下面的Demo&#xff1a…

三年Java開發,你連基礎的JVM運行時內存布局都忘了

面:為什么要使用雙親委派機制去加載類? 答:避免多份同樣字節碼的加載,浪費內存。 類的加載方式 隱式加載:new顯示加載:loadClass、forName等 類的裝載過程如下圖: 面:loadClass和…

vue實現可編輯的文字_蘋果還自帶文字轉語音,只要一鍵按下便可實現,今天分享給大家...

如果想將文字轉成語音,那大家平時都是怎么操作?下面小編就為大家介紹手機,電腦上都可以使用的方法,讓我們一起來看看吧!一、手機端操作1、蘋果手機其實蘋果手機就自帶了文字轉語音功能,只要打開手機&#x…

三面美團Java崗,面試竟然被這31道Java基礎題難倒了

01 分布式限流:NginxZooKeeper 1.1 分布式限流之Nginx 請解釋一下什么是 Nginx? 請列舉 x Nginx 的一些特性。 請列舉 x Nginx 和 和 Apache 之間的不同點 請解釋 x Nginx 如何處理 P HTTP 請求。 在 x Nginx 中,如何使用未定義的服務器名稱來阻止…

海龜繪圖小動物_震驚!被塑料繩勒成兩半的海龜

海洋,其實離人類很近,我們在追逐沙灘和日落,享受美味的海鮮的時候,可曾想到我們平時的一些很隨意的行為,會給一些海洋生物帶來無法恢復的傷害,甚至奪取它們的生命。或許人們的冷漠無知尚未得到懲罰&#xf…

上海大廠Java面試經歷:初步理解類加載運行機制和類加載過程

volatile相關經典面試題 談談volatile的特性volatile的內存語義說說并發編程的3大特性什么是內存可見性,什么是指令重排序?volatile是如何解決java并發中可見性的問題volatile如何防止指令重排volatile可以解決原子性嘛?為什么?v…

python生成泊松分布隨機數_泊松分布隨機數

一、功能產生泊松分布的隨機數。二、方法簡介泊松分布的概率密度函數為\[f(x)\frac{\lambda ^{x}e^{-\lambda }}{x!} \qquad x\in \left \{ 0,1,...,\lambda \right \}\]用\(P(\lambda)\)表示。泊松分布的均值為\(\lambda\),方差為\(\lambda\)。定理 若\(\lambda &g…

mysql數據庫優化面試

前言 現在Java程序員面試都是因為沒有豐富的工作經驗和自己過硬的技術,所有都不知道一般互聯網應該會問什么技術問題,加上自己可能去面試的時候沒有準備的太充分,一面試剛跟面試官扯幾個面試題就不知道自己在哪里了,被懟的體無完…

leetcode中文版python_Python版LeetCode1.兩數之和

啦啦啦,歡迎開啟LeetCode刷題的旅程,這將是一段漫長而又艱辛的旅程。這道Two Sum的題目作為LeetCode的開篇之題,乃是經典中的經典,正所謂‘平生不識TwoSum,刷盡LeetCode也枉然’,就像英語單詞書的第一個單詞…

mysql數據庫備份方式,跳槽大廠必看!

NO1:說說zookeeper是什么? ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現(Chubby是不開源的),它是集群的管理者,監視著集群中各個節點…

python淺藍色對應的代碼_淺藍色Python模塊不在m上工作

我正在嘗試通過macosx10.7.2上的Python連接到wiimote。在為此我試著用淺藍色。運行時:import lightbluePython會給我這個錯誤。在>>> import lightblueTraceback (most recent call last):File "", line 1, in File "/Library/Frameworks/P…

mysql數據庫安裝教程32位,看這一篇就夠了!

字節跳動 ?試前?????結 ?試前 頭條的?試是三家?最專業的,每次?試前有專?的HR和你約時間,確定OK后再進??試。每次都是通過視頻?試,因為都是之前都是電話?或現場?,所以視頻?試還是有點不?然。也有?覺得視頻?試…

java cron工具類_Java工具類之:包裝類

我們都知道,JDK 其實給我們提供了很多很多 Java 開發者已經寫好的現成的類,他們其實都可以理解成工具類,比如我們常見的集合類,日期相關的類,數學相關的類等等,有了這些工具類,你會發現它能很大…

mysql數據庫安裝,真香!

Spring Security觀后感——手繪思維腦(供參考) 手繪的思維導圖,是我自己根據自身的情況讀完這套阿里出品的Spring Security王者晉級文檔之后所繪的,相當于是一個知識的總結與梳理,我將其分為“核心組件”與“工作原理/認證流程”。 Spring Se…