Redis 面試

1、主從集群

1、構建主從集群

單節點Redis的并發能力是有上限的,要進一步提高Redis的并發能力,就需要搭建主從集群,實現讀寫分離。主寫從讀,主可以讀也可以寫,從只能讀

利用docker-compose文件來構建主從集群:

步驟:

  1. 首先通過docker-compose文件來構建容器,導入資料中準備的文件以及tar包。
  2. 使用docker load -i redis.tar命令將tar包加載成鏡像。
  3. 執行docker compose up -d來創建并啟動所有容器。 -d代表在后臺。此時已經建好集群但沒有關聯。
  4. 由于采用的是host模式,我們看不到端口映射。不過能直接在宿主機通過ps命令查看到Redis進程:ps -ef | grep redis。

  5. 輸入docker exec -it r1 redis-cli --port 7001進入到容器內

    docker exec -it 容器名 bash?

    進入容器? -it (添加一個可輸入終端,可以交互了)容器名? bash(表示命令行交互類型)? ? 輸入exit 退出

  6. 此時可以輸入?info replication會發現角色是master(role:master),同理進入r2,r3都是master
  7. 分別進入r2,r3輸入?SLAVEOF 192.168.100.128 7001,其就會變成“從”(7001就是r1的端口,相當于就是認r1為主)
  8. 至此主從集群搭建成功,可以使用:
    set num 123get num

    來測試r1,r2,r3是否可以讀寫。

2、主從同步原理

當主從第一次同步連接或斷開連接時,從節點都會發送psyn請求,嘗試數據同步:

replicationID:每一個master節點都有自己的唯一id,簡稱replid。當一個節點變成另一個節點的從節點時,他們的replid會改變,并且一樣,這樣就可以通過判斷replid是否相同來判斷是不是第一次來。

offset:repl_backlog中寫入過的數據長度,寫操作越多,offset值越大,主從的offset一致代表數據一致。

主從集群優化:

  • 在master中配置repl-diskless-sync yes啟用無磁盤復制,避免全量同步時的磁盤IO。
  • Redis單節點上的內存占用不要太大,減少RDB導致的過多磁盤IO。
  • 適當提高repl_backlog的大小,發現slave宕機時盡快實現故障恢復,盡可能避免全量同步。
  • 限制一個master上的slave節點數量,如果實在是太多slave,則可以采用主-從-從鏈式結構,減少master壓力。

二、哨兵集群

1、哨兵原理

Redis提供了哨兵機制來實現主從集群的自動故障恢復。哨兵的具體作用如下:

  • 狀態監控Sentinel 會不斷檢查您的masterslave是否按預期工作

  • 故障恢復(failover):如果master故障,Sentinel會將一個slave提升為master。當故障實例恢復后會成為slave

  • 狀態通知Sentinel充當Redis客戶端的服務發現來源,當集群發生failover時,會將最新集群信息推送給Redis的客戶端

服務狀態監控

Sentinel基于心跳機制監測服務狀態,每隔1秒向集群的每個節點發送ping命令,并通過實例的響應結果來做出判斷:

  • 主觀下線(sdown):如果某sentinel節點發現某Redis節點未在規定時間響應,則認為該節點主觀下線。

  • 客觀下線(odown):若超過指定數量(通過quorum設置)的sentinel都認為該節點主觀下線,則該節點客觀下線。quorum值最好超過Sentinel節點數量的一半,Sentinel節點數量至少3臺。

選舉新的master

一旦發現master故障,sentinel需要在salve中選擇一個作為新的master,選擇依據是這樣的:

  • 首先會判斷slave節點與master節點斷開時間長短,如果超過down-after-milliseconds * 10則會排除該slave節點

  • 然后判斷slave節點的slave-priority值,越小優先級越高,如果是0則永不參與選舉(默認都是1)。

  • 如果slave-prority一樣,則判斷slave節點的offset值,越大說明數據越新,優先級越高

  • 最后是判斷slave節點的run_id大小,越小優先級越高(通過info server可以查看run_id)。

實現故障轉移

假如master發生故障,slave1當選。則故障轉移的流程如下:

1)sentinel給備選的slave1節點發送slaveof no one命令,讓該節點成為master

2)sentinel給所有其它slave發送slaveof 192.168.150.101 7002 命令,讓這些節點成為新master,也就是7002slave節點,開始從新的master上同步數據。

3)最后,當故障節點恢復后會接收到哨兵信號,執行slaveof 192.168.150.101 7002命令,成為slave

2、搭建哨兵集群

參考講義

三、分片集群

主從模式可以解決高可用、高并發讀的問題。但依然有兩個問題沒有解決:

  • 海量數據存儲

  • 高并發寫

要解決這兩個問題就需要用到分片集群了。分片的意思,就是把數據拆分存儲到不同節點,這樣整個集群的存儲數據量就更大了。

Redis分片集群的結構如圖:

分片集群特征:

  • 集群中有多個master,每個master保存不同分片數據 ,解決海量數據存儲問題

  • 每個master都可以有多個slave節點 ,確保高可用

  • master之間通過ping監測彼此健康狀態 ,類似哨兵作用

  • 客戶端請求可以訪問集群任意節點,最終都會被轉發到數據所在節點

搭建分片集群參考講義

四、Redis數據結構

1、RedisObject

Redis中的任意數據類型的鍵和值都會被封裝為一個RedisObject,也叫做Redis對象,源碼如下:

Redis中會根據存儲的數據類型不同,選擇不同的編碼方式,共包含12種不同類型:

Redis中的5種不同的數據類型采用的底層數據結構和編碼方式如下:

2、SkipList

SkipList(跳表)首先是鏈表,但與傳統鏈表相比有幾點差異:

  • 元素按照升序排列存儲

  • 節點可能包含多個指針,指針跨度不同。

傳統鏈表只有指向前后元素的指針,因此只能順序依次訪問。如果查找的元素在鏈表中間,查詢的效率會比較低。而SkipList則不同,它內部包含跨度不同的多級指針,可以讓我們跳躍查找鏈表中間的元素,效率非常高。

其結構如圖:

3、SortedSet

SorteSet數據結構的特點是:

  • 每組數據都包含score和member
  • member唯一
  • 可根據score排序

SortedSet底層既有hash又有SkipList

面試題:Redis的SortedSet底層的數據結構是怎樣的?

:SortedSet是有序集合,底層的存儲的每個數據都包含element和score兩個值。score是得分,element則是字符串值。SortedSet會根據每個element的score值排序,形成有序集合。

它支持的操作很多,比如:

  • 根據element查詢score值

  • 按照score值升序或降序查詢element

要實現根據element查詢對應的score值,就必須實現element與score之間的鍵值映射。SortedSet底層是基于HashTable來實現的。

要實現對score值排序,并且查詢效率還高,就需要有一種高效的有序數據結構,SortedSet是基于跳表實現的。

加分項:因為SortedSet底層需要用到兩種數據結構,對內存占用比較高。因此Redis底層會對SortedSet中的元素大小做判斷。如果元素大小小于128每個元素都小于64字節,SortedSet底層會采用ZipList,也就是壓縮列表來代替HashTableSkipList

不過,ZipList存在連鎖更新問題,因此而在Redis7.0版本以后,ZipList又被替換為Listpack(緊湊列表)。

五、Redis內存回收

1、過期KEY的處理

?面試題:Redis如何判斷KEY是否過期呢?

:在Redis中會有兩個Dict,也就是HashTable,其中一個記錄KEY-VALUE鍵值對,另一個記錄KEY和過期時間。要判斷一個KEY是否過期,只需要到記錄過期時間的Dict中根據KEY查詢即可。

Redis是何時刪除過期KEY的呢?

Redis并不會在KEY過期時立刻刪除KEY,因為要實現這樣的效果就必須給每一個過期的KEY設置時鐘,并監控這些KEY的過期狀態。無論對CPU還是內存都會帶來極大的負擔。

Redis的過期KEY刪除策略有兩種:

惰性刪除,顧明思議就是過期后不會立刻刪除。那在什么時候刪除呢?

Redis會在每次訪問KEY的時候判斷當前KEY有沒有設置過期時間,如果有,過期時間是否已經到期。

周期刪除:顧明思議是通過一個定時任務,周期性的抽樣部分過期的key,然后執行刪除。

執行周期有兩種:

  • SLOW模式:Redis會設置一個定時任務serverCron(),按照server.hz的頻率來執行過期key清理

  • FAST模式:Redis的每個事件循環前執行過期key清理(事件循環就是NIO事件處理的循環)。

2、內存淘汰策略

Redis支持8種不同的內存淘汰策略:

對于某些特別依賴于Redis的項目而言,僅僅依靠過期KEY清理是不夠的,內存可能很快就達到上限。因此Redis允許設置內存告警閾值,當內存使用達到閾值時就會主動挑選部分KEY刪除以釋放更多內存。這叫做內存淘汰機制。

  • noeviction: 不淘汰任何key,但是內存滿時不允許寫入新數據,默認就是這種策略。

  • volatile-ttl: 對設置了TTL的key,比較key的剩余TTL值,TTL越小越先被淘汰

  • allkeys-random:對全體key ,隨機進行淘汰。也就是直接從db->dict中隨機挑選

  • volatile-random:對設置了TTL的key ,隨機進行淘汰。也就是從db->expires中隨機挑選。

  • allkeys-lru: 對全體key,基于LRU算法進行淘汰

  • volatile-lru: 對設置了TTL的key,基于LRU算法進行淘汰

  • allkeys-lfu: 對全體key,基于LFU算法進行淘汰

  • volatile-lfu: 對設置了TTL的key,基于LFI算法進行淘汰

比較容易混淆的有兩個算法:

  • LRULeast Recently Used),最近最久未使用。用當前時間減去最后一次訪問時間,這個值越大則淘汰優先級越高。

  • LFULeast Frequently Used),最少頻率使用。會統計每個key的訪問頻率,值越小淘汰優先級越高。? ? ??

六、緩存問題

參考另一個redis面試

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

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

相關文章

如何使用PostgreSQL數據庫進行數據挖掘與預測分析

如何使用PostgreSQL數據庫進行數據挖掘與預測分析 關鍵詞:PostgreSQL,數據挖掘,預測分析,數據庫,機器學習 摘要:本文旨在深入探討如何利用PostgreSQL數據庫進行數據挖掘與預測分析。首先介紹了使用PostgreSQL進行此類操作的背景信息,包括目的、預期讀者、文檔結構等。接…

ZooKeeper vs Redis:分布式鎖的實現與選型指南

一、Redis 分布式鎖:追求極致的性能 Redis 分布式鎖基于內存操作,其核心思想是在內存中設置一個唯一的鍵值對來表示鎖的持有。 1. 基礎實現(SETNX Lua) 最簡單的實現是使用 SETNX(SET if Not eXists)命令&…

vue基于Springboot框架的考研咨詢平臺系統實現

目錄前言-本系統介紹已開發項目效果實現截圖開發技術詳細介紹核心代碼參考示例1.建立用戶稀疏矩陣,用于用戶相似度計算【相似度矩陣】2.計算目標用戶與其他用戶的相似度系統測試總結源碼獲取詳細視頻演示或者查看其他版本:文章底部獲取博主聯系方式&…

蘋果用戶速更新!macOS存嚴重漏洞,用戶隱私數據面臨泄露風險

漏洞概況近日,macOS系統發現一個CVSS評分高達 9.8 的高危漏洞,該漏洞可能允許應用程序繞過系統保護機制,非法訪問受保護的用戶數據。該漏洞編號為 CVE-2025-24204,目前已有概念驗證(PoC)代碼公開。漏洞影響…

海盜王64位dx9客戶端修改篇之五

在海盜王3.0客戶都升級64位dx9版本的過程中,因為特效的問題,被卡殼了很久。 開始是精靈草的粒子效果、白銀城的煙囪煙霧效果、篝火的效果、陽光透射效果、海浪效果等,修了很長的時間,才找到竅門弄好。 然后是精靈效果、角色陰影。…

Linux學習——管理網絡安全(二十一)

一、管理服務器防火墻(firewalld)RHEL 默認使用 firewalld 作為防火墻管理工具,它通過 “區域(zone)” 和 “服務(service)” 的概念簡化規則配置,支持動態更新規則而無需重啟服務。…

leetcode-python-1941檢查是否所有字符出現次數相同

題目: 給你一個字符串 s ,如果 s 是一個 好 字符串,請你返回 true ,否則請返回 false 。 如果 s 中出現過的 所有 字符的出現次數 相同 ,那么我們稱字符串 s 是 好 字符串。 示例 1: 輸入:s “…

Snort的介紹

當然可以。以下是對 Snort 的全面介紹,涵蓋其定義、核心功能、三種運行模式、工作原理、規則系統以及應用場景等內容。 Snort 網絡入侵檢測系統(NIDS)詳解 一、Snort 簡介 Snort 是一款開源的、輕量級但功能強大的 網絡入侵檢測與防御系統&…

滴滴二面準備(一)

結合你的簡歷內容和技術面試問題,以下是一個結構化的回答建議,突出你的技術深度和項目經驗:2. 項目與實習經歷 得物低代碼落地頁編輯器(核心項目) 背景:解決軟廣落地頁開發周期長、迭代慢問題。技術方案&am…

socket通信在Windows和Linux上的區別

前言 筆者在將socket通信的自定義類從Linux移植到Windows時遇到一些問題&#xff0c;整理下來希望幫助到需要的人&#xff0c;同時也加深自己的理解。 差異 頭文件 #ifdef _WIN32 #include <ws2tcpip.h> #define inet_pton InetPton #define SHUT_RDWR SD_BOTH #define M…

一款將PDF轉化為機器可讀格式的工具介紹

ps:以下內容來自MinerU項目 MinerU 項目簡介 MinerU是一款將PDF轉化為機器可讀格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取為任意格式。 MinerU誕生于書生-浦語的預訓練過程中&#xff0c;我們將會集中精力解決科技文獻中的符號轉化問…

代碼隨想錄算法訓練營第三十九天|62.不同路徑 63.不同路徑ll

62.不同路徑&#xff1a; 文檔講解&#xff1a;代碼隨想錄|62.不同路徑 視頻講解&#xff1a;https://www.bilibili.com/video/BV1ve4y1x7Eu 狀態&#xff1a;已做出 一、題目要求&#xff1a; 一個二維數組里&#xff0c;將(0&#xff0c;0)位置下標作為起點&#xff0c;計算…

openEuler2403安裝部署Prometheus和Grafana

文章目錄openEuler2403安裝部署Prometheus和Grafana一、前言1.簡介2.環境二、正文1.環境準備1&#xff09;JDK 安裝部署&#xff08;可選&#xff09;2&#xff09;關閉防火墻2.安裝 Prometheus1&#xff09;下載和安裝2&#xff09;啟動3&#xff09;systemd服務管理3.安裝 Gr…

樂吾樂大屏可視化組態軟件【SQL數據源】

樂吾樂大屏可視化組態軟件&#xff08;大屏可視化設計器 - 樂吾樂Le5le&#xff09;支持直接對接SQL數據源功能&#xff0c;目前僅對企業源碼客戶開放。 配置SQL數據源 管理員進入可視化管理中心&#xff0c;點擊SQL數據源&#xff0c;配置添加SQL數據源。 創建SQL數據源連接 …

Django高效查詢:values_list實戰詳解

Django 實戰案例 講解 values_list 的用法。 values_list("field", flatTrue) → 獲取單字段的一維列表。values_list("f1", "f2") → 獲取多個字段&#xff0c;返回元組。搭配 filter / distinct / in / 外鍵查詢 非常高效。適合用于 導出數據 …

Java數據結構——樹

一、樹型結構1.1 概念我們之前提到的數組&#xff0c;單鏈表&#xff0c;棧和隊列都是一種線性結構&#xff0c;每個元素都有最多一個后繼節點。而樹型結構是一種非線性結構&#xff0c;它是由n&#xff08;n>0&#xff09;節點組成的一個具有層次關系的集合。它之所以叫做樹…

基于LLM的月全食時空建模與智能預測:從天文現象到深度學習融合

當古老的天文學遇上現代人工智能,會碰撞出怎樣的火花? 一、當月球遇見AI 月全食,這一令人驚嘆的天文現象,自古以來就吸引著無數天文學家和愛好者的目光。當地球恰好運行到太陽和月球之間,完全遮擋太陽光時,我們就能目睹月球逐漸被"吞噬"然后又重煥光彩的奇妙…

LeetCode熱題 42.接雨水

題目 思路&#xff1a; 通過畫圖觀察我們其實可以很容易發現&#xff0c;每個柱子接多少水由這個地方左邊最高的柱子和右邊最高的柱子確定&#xff0c;因為總要形成一個坑嘛&#xff0c;然后就能接著確定&#xff1a; 當前柱子接水量 min(左邊最高柱子的高度, 右邊最高柱子的…

PostgreSQL與Greenplum數據庫的編程語言連接

編程語言連接數據庫 目前數據庫一般支持HA的連接&#xff0c;即一個Coordinator內的一個節點異常后會鏈接到另外的一個節點&#xff0c;不會影響業務的正常運行。在JDBC配置時需要采用 高可用鏈接字符串(Connection URL/DSN) 的方式連接。適用于不同的編程語言中使用&#xff…

后端(JDBC)學習筆記(CLASS 1):基礎篇(一)

一、引言1、數據的存儲開發java程序的時候&#xff0c;數據都是存儲在內存中&#xff0c;屬于臨時存儲&#xff0c;當程序停止或重啟時&#xff0c;內存中的數據就丟失了。為了解決數據的長期存儲問題&#xff0c;有如下解決方案&#xff1a;1、數據通過I/O流技術&#xff0c;存…