秋招Java后端開發沖刺——非關系型數據庫篇(Redis)

在這里插入圖片描述

一、非關系型數據庫

1. 主要針對的是鍵值、文檔以及圖形類型數據存儲。
2. 特點

特點說明
靈活的數據模型支持多種數據模型(文檔、鍵值、列族、圖),無需預定義固定的表結構,能夠處理各種類型的數據。
高擴展性設計為水平擴展,能夠輕松地通過增加更多節點來處理大量的數據和高并發請求。
高性能通過優化特定類型的查詢和數據操作,通常比關系型數據庫在大規模數據處理時表現更好。
分布式架構天生支持分布式存儲和計算,能夠跨多個節點和數據中心實現數據的分布和冗余。
弱一致性為了提高性能和可用性,通常采用最終一致性模型,而不是關系型數據庫的強一致性模型。
靈活的事務支持事務支持通常較為靈活,有些NoSQL數據庫提供有限的事務支持,有些則支持ACID事務。
易于使用簡單的API接口和查詢語言,使開發者能夠快速上手和使用。
豐富的類型支持能夠存儲和處理多種數據類型,包括JSON、XML、二進制數據等。
高可用性通過數據復制和分區,實現高可用性和數據冗余,保證系統在部分節點失效時仍能正常運行。
適應多種應用場景特別適合于大數據分析、實時應用、社交網絡、物聯網等需要處理大量非結構化數據的場景。

3. 代表:HBase、Cassandra、MongoDB、Redis

二、Redis

Redis是一個基于 C 語言開發的開源 NoSQL 數據庫,使用key-value鍵值對存儲數據,且由于其數據存儲在內存中,速度很快,在開發中使用廣泛。

(一)數據類型

1. 五種基礎數據類型
五種基礎數據類型包括:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)

  • String:是一種二進制安全的數據類型,常用于緩存 Session、Token、圖片地址、序列化后的對象,用戶單位時間的請求數(簡單限流可以用到)、頁面單位時間的訪問數
  • List:使用一個雙向鏈表實現,常用于實現最新文章、最新動態、消息隊列
  • Hash:是一個 String 類型的 field-value(鍵值對) 的映射表,內部實現:數組 + 鏈表,常用于存儲對象
  • Set:是一種無序集合,實現了求交集、并集、差集等操作,常用于網站 UV 統計、文章點贊、動態點贊等場景;共同好友(交集)、共同粉絲(交集)、共同關注(交集)、好友推薦(差集)、音樂推薦(差集)、訂閱號推薦(差集+交集) 等場景;抽獎系統、隨機點名等場景
  • Sorted Set:增加了一個權重參數 score,底層使用跳表實現,使得集合中的元素能夠按 score 進行有序排列,常用于各種排行榜,優先級任務隊列

2. 三種特殊數據類型
包括:HyperLogLog(基數統計)、Bitmap (位圖)、Geospatial (地理位置)

  • Bitmap:存儲的是連續的二進制數字(0 和 1),常用于用戶簽到情況、活躍用戶情況、用戶行為統計(比如是否點贊過某個視頻)。
  • HyperLogLog:是一種有名的基數計數概率算法,常用于數據量巨大的統計場景:熱門網站每日/每周/每月訪問 ip 數統計、熱門帖子 uv 統計等
  • Geospatial index(地理空間索引,簡稱 GEO):基于 Sorted Set 實現,主要用于存儲地理位置信息。

3. 其他數據類型
包括: Bloom filter(布隆過濾器)、Bitfield(位域)

  • Bloom filter(布隆過濾器):由一個初始值為零的bit數組和多個哈希函數構成,用來快速判斷集合中是否存在某個元素,常用于解決緩存穿透問題
  • Bitfield(位域):是一種對Redis中的字符串類型進行擴展的數據類型,用于對字符串中任意偏移進行修改等操作。
(二)應用

在這里插入圖片描述

(三)常見面試問題

1. 為什么快

  • Redis 基于內存存儲數據,內存的訪問速度比磁盤快很多
  • Redis 基于 Reactor 模式設計開發了一套高效的事件處理模型,使用IO多路復用+事件派發來處理多個socket
  • Redis是單線程的,避免線程間的切換(Redis6.0之后命令回復處理器、命令請求處理器使用了多線程,命令執行還是使用的單線程)
  • Redis 內置了多種優化過后的數據類型/結構實現,性能非常高
  • Redis 通信協議實現簡單且解析高效

2. 緩存讀寫策略
(1)Cache Aside Pattern(旁路緩存模式)

  • 讀數據:從 cache 中讀取數據,讀取到就直接返回;否則從 db 中讀取數據返回,再把數據放到 cache 中
  • 寫數據:先更新db,再刪除緩存
    (2)Read/Write Through Pattern(讀寫穿透)(以cache服務器為主)
  • 讀數據:從 cache 中讀取數據,讀取到就直接返回 ;否則先從 db 加載,寫入到 cache 后返回響應
  • 寫數據:先查 cache,cache 中不存在,直接更新 db;cache 中存在,則先更新 cache,然后 cache 服務自己更新 db
    (3)Write Behind Pattern(異步緩存寫入)
  • 只同步更新緩存,不直接更新 db,而是改為異步批量的方式來更新 db
  • db 的寫性能非常高,非常適合一些數據經常變化又對數據一致性要求沒那么高的場景,比如瀏覽量、點贊量

3. key過期刪除策略

  • 惰性刪除:使用時才檢查刪除(內存消耗大)
  • 定期刪除:周期性地隨機從設置了過期時間的 key 中抽查一批,然后逐個檢查這些 key 是否過期,過期就刪除 key(周期時間確定較難)
  • 延遲隊列:把設置過期時間的 key 放到一個延遲隊列里,到期之后就刪除 key(需要額外的資源維護隊列)
  • 定時刪除:每個設置了過期時間的 key 都會在設置的時間到達時立即被刪除(每個key都要維護一個定時器,資源消耗大)
    :Redis采用惰性+定期刪除的方式

4. Redis 的內存淘汰策略(內存不足時觸發)

  • volatile-lru(least recently used):從已設置過期時間的數據集中挑選最近最少使用的數據淘汰。
  • volatile-ttl:從已設置過期時間的數據集中挑選將要過期的數據淘汰
  • volatile-random:從已設置過期時間的數據集中任意選擇數據淘汰。
  • volatile-lfu(least frequently used):從已設置過期時間的數據集中挑選最不經常使用的數據淘汰
  • allkeys-lru(least recently used):從數據集中移除最近最少使用的數據
  • allkeys-random:從數據集中任意選擇數據淘汰。
  • allkeys-lfu(least frequently used):從數據集中移除最不經常使用的數據淘汰
  • no-eviction(默認內存淘汰策略):不淘汰數據,當內存不足以容納新寫入數據時,新寫入操作會報錯

5. 生產問題(緩存三兄弟)
(1)緩存穿透

  • 請求的 key 不存在于緩存中,會導致大量查詢請求直接到了數據庫,導致數據庫崩潰
  • 解決方式
    ① 緩存無效值(內存不友好)
    ② 布隆過濾器(使用一個較大的 bit 數組來保存所有可能請求的key的哈希值,每次請求時計算key對應的哈希值,如果哈希值對應的位置為true才去緩存中查找)
    (2)緩存擊穿
  • 請求的key對應的是熱點數據 ,但緩存中的那份數據已經過期,導致大量請求落在數據庫上
  • 解決方法:
    ① 設置熱點數據永不過期或者過期時間比較長(內存不友好)
    ② 提前預熱(推薦):針對熱點數據提前預熱,將其存入緩存中并設置合理的過期時間比如秒殺場景下的數據在秒殺結束之前不過期
    ③ 加鎖:在緩存失效后,通過設置互斥鎖確保只有一個請求去查詢數據庫并更新緩存
    (3)緩存雪崩
  • 緩存中的key在同一時間大量失效,導致大量的請求都直接落到了數據庫上,對數據庫造成了巨大的壓力/Redis服務器宕機
  • 解決方式:
    ① key設置隨機失效時間
    ② 提前預熱
    ③ 多級緩存:設置多級緩存,例如本地緩存+Redis 緩存的二級緩存組合
    ④ Redis 集群:采用 Redis 集群,避免單機出現問題整個緩存服務都沒辦法使用

6. Redis集群
(1)主從復制

  • 主節點寫,多個從節點讀
  • 主從數據同步原理
    ① 全量同步:初始同步都采用全量同步
    ② 增量同步:一般是slave重啟或者后期數據變化
  • 實現高并發
    (2)哨兵模式
  • 使用哨兵檢測集群中各個服務器的狀態(心跳機制),并在主節點宕機后重新選擇主節點
  • 哨兵選主規則:優先級、與主節點斷開時間(小)、offset值(大)、id(小)
  • 可能會出現腦裂問題(網絡問題導致),解決方法是:設置最少的從節點數量/縮短主從數據同步的延遲時間/達不到要求就拒絕請求
  • 實現高可用
    (3)分片集群
  • 多個master、多個slave,多個master之間通過ping檢測彼此健康狀態;客戶端請求可以訪問任意節點,最終會根據Redis中的路由轉發到正確節點
  • 實現海量數據存儲,以及高并發寫

7. 持久化機制
(1)快照RDB

  • 通過創建快照來獲得存儲在內存里面的數據在某個時間點上的副本
  • 優點:
    ① RDB 文件存儲的內容是經過壓縮的二進制數據,文件很小,適合做數據的備份,災難恢復
    ② 使用 RDB 文件恢復數據,直接解析還原數據即可,不需要一條一條地執行命令,速度非常快
  • 實現原理:bgsave命令開始時主進程會fork一個子進程,子進程復制主進程的頁表,將對應的內存數據寫入磁盤
  • 對數據丟失容忍度更高,追求啟動速度
    (2)只追加文件AOF
  • 將每一條Redis執行命令寫入到 AOF 緩沖區中,然后再寫入到 AOF 文件中,最后根據持久化方式( fsync策略)的將系統內核緩存區的數據同步到硬盤中
  • 優點
    ① 實時性更好
    ② AOF 以一種易于理解和解析的格式包含所有操作的日志,可以直接進行操作和分析
  • 對數據的安全性、完整性要求更高
  • 持久化策略
    ① appendfsync always:主線程調用 write 執行寫操作后,后臺線程( aof_fsync 線程)立即會調用 fsync 函數同步 AOF 文件(刷盤),fsync 完成后線程返回
    ② appendfsync everysec:主線程調用 write 執行寫操作后立即返回,由后臺線程( aof_fsync 線程)每秒鐘調用 fsync 函數(系統調用)同步一次 AOF 文件
    ③ appendfsync no:主線程調用 write 執行寫操作后立即返回,讓操作系統決定何時進行同步刷盤
  • AOF文件重寫(當文件較大時):由一個子進程將數據庫狀態寫入新的AOF文件中,重寫期間,Redis 還會維護一個 AOF 重寫緩沖區,該緩沖區會在子進程創建新 AOF 文件期間,記錄服務器執行的所有寫命令。當子進程完成創建新 AOF 文件的工作之后,服務器會將重寫緩沖區中的所有內容追加到新 AOF 文件的末尾。
    :該操作不不需要對原有AOF文件進行任何的讀取,寫入,分析
    (3)混合方式
  • AOF 重寫的時候就直接把 RDB 的內容寫到 AOF 文件開頭
  • 優點:可以結合 RDB 和 AOF 的優點, 快速加載同時避免丟失過多的數據
  • 缺點:AOF 里面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差

8. Redis實現延時
(1)Redis 過期事件監聽

  • 原理:在pub/sub 模式下,監聽 key 的過期事件 channel,就可以拿到過期的 key 的消息,進而實現了延時任務功能
  • 存在問題
    ① 時效性差,key過期后的刪除是惰性刪除+定期刪除結合,而這個發布者是要在key刪除時才發布消息到channel
    ② 丟消息:當沒有訂閱者時,消息會被直接丟棄,在 Redis 中不會存儲該消息
    ③ 多服務實例下消息重復消費
    (2)Redisson 內置的延時隊列
  • 原理:基于 Redis 的 SortedSet 來實現,將需要延遲執行的任務插入到 SortedSet 中,并給它們設置相應的過期時間作為分數,Redisson 使用 zrangebyscore 命令掃描 SortedSet 中過期的元素,然后將這些過期元素從 SortedSet 中移除,并將它們加入到就緒消息列表中

9. Redis實現分布式鎖
(1)SETNX(SET if Not eXists)命令實現分布式鎖
(2)使用Redisson實現的分布式鎖

  • 基于lua腳本完成加鎖、設置過期時間等操作,使用watch-dog給鎖續期
  • 不能實現主從一致性,使用紅鎖可以,但性能極差

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

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

相關文章

安全技術和防火墻(一)

安全技術和防火墻 安全技術 入侵檢測系統:特點是不阻斷網絡訪問,主要提供報警和事后監督 不主動介入 (監控) 入侵防御系統:透明模式工作 ,數據包,網絡監控,服務攻擊,木馬,蠕蟲,系統漏洞 等 進行準確的分析判斷 判斷為攻擊行為后會…

高校心理咨詢管理系統

摘 要 隨著高校學生心理問題的增多,心理咨詢服務在高校中的重要性日益凸顯。然而,傳統的心理咨詢管理方式存在著諸多問題,如信息不透明、咨詢師資源不足等。為了解決這些問題,本文設計并實現了一種基于Java Web的高校心理咨詢管理…

model_json_schema

model_json_schema示列 from pydantic import BaseModel, Field, ValidationError, field_validatorclass User(BaseModel):id: int Field(default0, lt100, gt0)username: stremail: strfield_validator(username)def name_must_alpha(cls, v):assert v.isalpha(), name mus…

浸式冷卻設計參數

每天一篇行業發展資訊,讓大家更及時了解外面的世界。 更多資訊,請關注B站/公眾號【萊歌數字】,有視頻教程~~ 兩相被動浸入冷卻是指使用改變相的沸騰液體來去除一個或多個表面的熱量的冷卻系統。 然后蒸汽被移動到冷凝器,然后被…

LaTeX中添加矩陣分塊虛線并設置虛線疏密

對于大型矩陣,有時需要添加分塊虛線。 方法為使用arydshln宏包,然后在array環境中設置虛線。需要注意的是,使用矩陣環境需要搭配amsmath宏包使用,且需放在amsmath宏包之后。即導言區設置為 \usepackage{amsmath} \usepackage{ary…

日語培訓日語等級考試柯橋小語種學習語言學校

什么是外來語 外來語是指在日本的國語中使用的來源于外國語言的詞匯。但狹義上的外來語則是指來源于歐美國家語言的詞匯,其中大部分是來源于英美語系的詞匯。日語中的漢語詞匯很多,大多是自古以來從中國引進的,從外來語的定義看,漢…

NLP邏輯層次模型|跳出局限,站在更高維度認識自己

什么是NLP邏輯層次模型 N-Neuro:指神經系統,包括生理基礎(大腦)和思維運作過程 L-Linguistic:指語言,感覺信號輸出——構成意思的過程 P-Programming:指程序,大腦產生某結論后要具體…

【干貨】Vue3 組件通信方式詳解

前言 毫無疑問,組件通信是Vue中非常重要的技術之一,它的出現能夠使我們非常方便的在不同組件之間進行數據的傳遞,以達到數據交互的效果。所以,學習組件通信技術是非常有必要的,本文將總結Vue中關于組件通信的八種方式…

代碼隨想錄算法訓練營DAY49|300.最長遞增子序列、 674. 最長連續遞增序列、718. 最長重復子數組

300.最長遞增子序列 題目鏈接:300.最長遞增子序列dp初始化為1(最小子序列長度為1) class Solution(object):def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""dp [1]*len(nums)result …

leetcode-18- [669]修剪二叉搜索樹[108]將有序數組轉換為二叉搜索樹[538]把二叉搜索樹轉換為累加樹

重點:一般二叉樹多考慮遍歷順序, 二叉搜索樹多考慮特性,不用考慮遍歷順序。 一、[108]將有序數組轉換為二叉搜索樹 左閉右開 偶數取左邊 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums,0, nums…

ArcGIS定義1.5度帶坐標系與投影轉換

? 點擊下方全系列課程學習 點擊學習—>ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放 點擊學習——>遙感影像綜合處理4大遙感軟件ArcGISENVIErdaseCognition 對于ArcGIS如何定義高斯克呂格3度帶、6度帶,我相信大部分人都是比較清楚的&#xff0…

OAuth 2.0資源授權機制與安全風險分析

文章目錄 前言OAuth2.01.1 OAuth應用1.2 OAuth基礎1.3 授權碼模式1.4 其它類模式1.5 openid連接 安全風險2.1 隱式授權劫持2.2 CSRF攻擊風險2.3 Url重定向漏洞2.4 scope校驗缺陷 總結 前言 OAuth 全稱為Open Authorization(開放授權),OAuth …

為什么不推薦使用 UUID 作為主鍵

UUID 作為主鍵的討論背景 面試官提出問題時,應提供具體場景,例如 UUID 是由日志服務器還是客戶端生成。 UUID 的優點 獨立生成:可以在任何地方生成,無需與數據庫服務器往返。簡化邏輯:預先生成父表主鍵值&#xff0…

使用API有效率地管理Dynadot域名,為文件夾中的域名進行域名停放

關于Dynadot Dynadot是通過ICANN認證的域名注冊商,自2002年成立以來,服務于全球108個國家和地區的客戶,為數以萬計的客戶提供簡潔,優惠,安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引(包括域名郵…

“RLC串聯正弦穩態電路的仿真研究”課程設計,高分資源,匠心制作,下載可用。強烈推薦!!!

1.設計目的 用 Multisim 電路仿真軟件,對一個 RLC 串聯電路進行正弦穩態電路分析。 2任務分析 2.1任務要求1 在 Multisim 中搭建一個 RLC 串聯電路,其中 R、 L、 C、正弦激勵源的振幅Vp和頻率 f 等所有參數均可自己任意設置(不建議都采用…

RT-Thread Studio實現靜態線程

1創建項目 (STM32F03ZET6) RT-Thread項目與RT-Thread Nano 項目區別 RT-Thread: 完整版:這是RT-Thread的完整形態,適用于資源較豐富的物聯網設備。功能:它提供了全面的中間件組件,如文件系統、網絡協議棧、…

[創業之路-130] :制造業企業的必備管理神器-ERP-基礎數據庫-物料類型與物料編碼

目錄 前言: 一、什么是物料 1、物料的定義 2、物料的分類 3、物料的性質 4. 輔助物料要放到產品的BOM中嗎? 二、ERP物料類型 三、ERP物料編碼 3.1 概述 3.2 示例 示例一:某企業冰箱材料分類與編碼 示例二:某機械加工廠…

行業案例 | 智能終端設備的數據基礎從哪兒來?

智能終端的快速發展讓我們在許多科幻電影中看到的“未來場景”正在一步步變為現實:智能家居正在解放我們的雙手,工業機器人讓生產效率倍增,智能穿戴設備讓我們便利地感知自身與外部的連結……然而,要想讓萬物“智聯”,…

主流數據同步工具對比詳解

文章目錄 概述1. Flink CDC (Apache Flink Change Data Capture)2. Debezium3. DataX4. Canal5. Sqoop6. Kettle (Pentaho Data Integration)7. Oracle GoldenGate概述 數據同步工具是企業數據開發常用的中間件,如何從眾多工具中正確選型是個問題,本文詳細介紹了主流工具的優…

從環型到樹型:多種網絡拓撲結構的優缺點及應用

網絡拓撲作為網絡設計的基礎,對于網絡的性能、可靠性和擴展性起著重要作用。作為網絡通信工程師,我們不僅需要了解網絡拓撲的基本概念,還需深入掌握其在實際網絡設計中的應用。本文將詳細介紹網絡拓撲,包括物理拓撲、邏輯拓撲&…