Redis系列(七)Redis面試題

来源:https://www.cnblogs.com/itzhouq/archive/2020/05/16/redis7.html
-Advertisement-
Play Games

Redis 系列: 1. "Redis系列(一)Redis入門" 2. "Redis系列(二)Redis的8種數據類型" 3. "Redis系列(三)Redis的事務和Spring Boot整合" 4. "Redis系列(四)Redis配置文件和持久化" 5. "Redis系列(五)發佈訂閱模式、主 ...


Redis 系列:

  1. Redis系列(一)Redis入門
  2. Redis系列(二)Redis的8種數據類型
  3. Redis系列(三)Redis的事務和Spring Boot整合
  4. Redis系列(四)Redis配置文件和持久化
  5. Redis系列(五)發佈訂閱模式、主從複製和哨兵模式
  6. Redis系列(六)Redis 的緩存穿透、緩存擊穿和緩存雪崩
  7. Redis系列(七)Redis面試題
  8. Redis命令參考

1、什麼是 Redis?有什麼特點?

Redis 是一款開源,高性能的 key-value 的非關係型資料庫。
特點
1)支持持久化,可以將記憶體中的數據持久化到磁碟,重啟可以再次從磁碟中載入使用;
2)支持多種數據結構;
3)支持數據的備份:主從模式的備份;
4)高性能,讀速度達 11 萬次/秒,寫速度達到 8.1 萬次/秒
5)支持事務。

2、說說 Redis 的數據類型

一共 8 種
5 種基本數據類型:String、Hash、List、Set、Zset
3 種特殊類型:geospatial、hyperloglog、bitmap

3、Redis 和 Memcache 的區別?

1)Memcache 數據都存儲在記憶體中,斷電即失,數據不能超過記憶體大小;而 Redis 的數據可以持久化到硬碟。
2) Memcache 只支持簡單的字元串,Redis 有豐富的數據結構;
3)底層實現方式不一樣,Redis 自行構建了 VM 機制,速度更快。

4、Redis 是單進程單線程的?

Redis 將數據放在記憶體中,單線程執行最高,多線程執行反而需要進行 CPU 上下文切換,這是個耗時操作,單線程效率最高。

5、說說 Redis的持久化

Redis 提供了兩種持久化機制:RDB 和 AOF

RDB 持久化機制指的是,用數據集快照的方式記錄 Redis 資料庫的所有鍵值對,在某個時間點寫入一個臨時文件,持久化結束後,用這個臨時文件替換上次持久化的文件,達到數據恢復的目的。
優點
1)只有一個文件 dump.rdb 方便持久化;
2)容災性好,一個文件可以保存到安全的磁碟;
3)性能最大化,Redis 會單獨創建(fork)一個子進程進行持久化,主進程不進行任何 IO 操作,保證了性能;
4)在數據較多時,比 AOF 的啟動效率高。
缺點
最後一次持久化的數據可能會丟失。

AOF 持久化,是以獨立日誌的方式記錄每次寫命令,併在 Redis 重啟時重新執行 AOF 文件中的命令以達到恢複數據的目的。AOF 主要解決數據持久化的實時性。
優點
1)數據安全,配置 appendfsync 屬性,可以選擇不同的同步策略;
2)自動修複功能, redis-check-aof工具可以解決數據一致性問題;
缺點
1)AOF 文件比 RDB 文件大,且恢復速度慢;
2)數據多時,效率低於 RDB。

6、Redis 的主從複製

主從複製值的是將一臺 Redis 伺服器的數據複製其他 Redis 伺服器,前者稱之為主節點,後者稱之為從節點。

主從複製的作用
1)數據冗餘:主從複製實現了數據的熱備份;
2)故障修複:當主節點出現故障後,從節點還可以提供服務,實現快速的故障修複。
3)負載均衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫操作,從節點提供讀操作,實現負載均衡,提高併發量;
4)高可用的基石:主從複製是哨兵模式的基礎。

複製原理
從節點啟動成功連接到主節點後,會發送一個 sync 的同步命令。主節點接收到命令之後,啟動後臺的存檔進程,收集所有修改資料庫的命令,在後臺執行完畢後將整個數據文件傳送到從節點,完成一次完全同步。
全量複製:從節點在接收到了數據文件後,將其存檔文件載入都記憶體中;
增量複製:主節點繼續將新收集到修改命令傳遞給從節點,完成同步。

7、說說哨兵模式

哨兵模式是為瞭解決手動切換主節點的問題。Redis 提供了哨兵的命令,哨兵是一個獨立的進程。哨兵能夠後臺監控主節點是否故障,如果故障需要將從節點選舉為主節點。

其原理是哨兵通過發送命令,等待 Redis 伺服器的響應,從而監控多個 Redis 節點。

當只有一個哨兵時,還是可能會出現問題的,比如哨兵自己掛掉。為此,可以使用多哨兵模式,多個哨兵之間相互監控。當主節點宕機了,哨兵1先檢測到這個結果,系統並不會馬上進行 failover 【故障轉移】的過程。僅僅是哨兵1認為主節點不可用的現象稱之為主觀下線。當其餘的哨兵也檢測到主節點不可用之後,哨兵之間會進行一次投票選舉從節點中的一個作為新的主節點,這個過程稱之為客觀下線

哨兵模式的優點
1)基於主從複製,高可用;
2)主從可以切換,進行故障轉移,系統可用性好;
3)哨兵模式是主從模式的升級版,手動到自動,更加健壯。

哨兵模式的缺點
1)不方便線上擴容;
2)實現哨兵模式需要很多的配置。

8、緩存穿透、緩存擊穿和緩存雪崩

緩存穿透:

概念:用戶需要查詢一個數據,緩存中沒有,也就是沒有命中,於是向資料庫中發起請求,發現也沒有。當用戶很多的時候,緩存都沒有命中,於是都去請求資料庫,這給資料庫造成很大的壓力。

解決方案

  • 布隆過濾器:是一種數據結構,對所有可能查詢的參數以 hash 方式存儲,先在控制層進行校驗,不符合則丟棄,避免了過多訪問資料庫。
  • 緩存空對象:當存儲層沒有命中時,即使返回空對象也將其緩存起來。(意味著更多的空間存儲,即使設置了過期時間,緩存和資料庫還是有段時間數據不一致。)

緩存擊穿:

概念:當一個 key 非常熱點時,在不斷扛高併發,集中對這個熱點數據進行訪問,當這個 key 失效的瞬間,請求直接到達資料庫,給資料庫瞬間的高壓力。

解決方案

  • 設置熱點數據永不過期
  • 加分散式鎖:保證每個 key 同時只有一個線程去查詢後端服務。

緩存雪崩:

概念:某個時間段,緩存集中失效

解決方案

  • 增加 Redis 集群的數量
  • 限流降級:在緩存失效後,通過加鎖和隊列來控制資料庫寫緩存的線程數量
  • 數據預熱:正式部署之前,將數據預先訪問一遍,讓緩存失效的時間儘量均勻

9、Redis 的使用場景

1)會話緩存:如 單點登錄,使用 Redis 模擬 session,SSO 系統生成一個 token,將用戶信息存到 Redis 中,並設置過期時間;
2)全頁緩存
3)作為消息隊列平臺
4)排行榜和計數器
5)發佈/訂閱:比如聊天系統
6)熱點數據:比如ES中搜索的熱詞

10、Redis 緩存如何保持一致性

讀數據的時候首先去 Redis 中讀取,沒有讀到再去 MySQL 中讀取,讀取都數據更新到 Redis 中作為下一次的緩存。

寫數據的時候會產生數據不一致的問題。無論是先寫入 Redis 再寫入 MySQL 中,還是先寫入 MySQL 再寫入 Redis 中,這兩步操作都不能保證原子性,所以會出現 Redis 和 MySQL 中數據不一致的問題。

無論採取何種方式都不能保證強一致性,如果對 Redis 中的數據設置了過期時間,能夠保證最終一致性,對架構的優化只能降低發生的概率,不能從根本上避免不一致性。

更新緩存的兩種方式:刪除失效緩存、更新緩存
更新緩存和資料庫有兩種順序:先資料庫後緩存、先緩存後資料庫
兩兩組合,分為四種更新策略。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近研究CentOS8 發現右鍵打開後沒有終端這一項: 1.經過查詢發現是沒有安裝一個包 2.使用命令進行安裝並重啟: [root@base ~]# yum -y install nautilus-open-terminal CentOS-BaseOS-8 - Media 3.8 MB/s | 3. ...
  • 最近老闆沉迷於抖音,時不時在那邊呵呵傻笑,於是我偷偷湊過去一看,好家伙,他正在看朱一旦~ 這天,老闆幽幽地走到我身邊,淡淡地跟我說,良許,你要是能找到公司里混水摸魚的人,我就給你漲薪!我回過頭,望著他朱一旦似的枯燥笑臉,自信說道,放心,有我在,公司里就沒有摸魚的人! 作為一名資深摸魚專家,熟知 10 ...
  • 內核編譯步驟及模塊管理 設定內核參數的方法: echo VALUE > /proc/sys/TO/SOMEFILE sysctl -w kernel.hostname= 能立即生效,但無法永安有效。 永久有效需要修改配置文件/etc/syctl.conf 修改完配置文件不會理解生效,需要執行以下命令 ...
  • 內核中常用的分配物理記憶體頁面的介面函數是alloc_pages(),用於分配一個或者多個連續的物理頁面,分配頁面個數只能是2個整數次冪。相比於多次分配離散的物理頁面,分配連續的物理頁面有利於提高系統記憶體的碎片化,記憶體碎片化是一個很讓人頭疼的問題。alloc_pages()函數有兩個,一個是分配gfp ...
  • (1)先來先服務調度演算法(FCFS)(作業、進程調度):演算法簡單,但效率較低;有利於長作業,但對短作業不利,有利於CPU繁忙型作業,不利於I/O繁忙型作業。(2)短作業優先調度演算法(SJF)(作業):運行時間短的作業優先執行,該演算法對長作業不利,易造成“饑餓”問題,即長作業由於優先順序低可能長期得不到 ...
  • 好久沒更新博客了,今年整體行業不太樂觀,在朋友的引薦下進了新的東家討口飯吃,難得清靜下來一個周末,好吧,廢話不多說了, 今天更新了windows 的docker客戶端docker-toolbox, 發現原來的docker login -u 用戶名 -p 密碼 使用不了。這次更新的應該是最新版:htt ...
  • 一.安裝部署 "1.Zabbix部署" "2.Nessus簡介與安裝" "3.Ceph安裝" "4.Graylog 安裝" "5.Centos6.10 安裝Python 2.7.16" 更新中... 二.Linux運維 更新中... ...
  • BIOS 中英文對照表 轉載於https://www.dell.com/support/article/zh-cn/sln262122/bios-%E4%B8%AD%E8%8B%B1%E6%96%87%E5%AF%B9%E7%85%A7%E8%A1%A8?lang=zh 註意:機型不同 BIOS 版 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...