為什么redis取出來是null_[2020] Redis 最新面試題

Redis 的數據類型(數據結構)

  1. string (二進制安全,可以存儲任意類型的數據)
  2. list(鏈表)
  3. 字典(就是hashmap)
  4. set(不重復無序的hashmap)
  5. zset(按照給定的 score 排序的 set)
  6. HyperLogLog(來做基數統計的算法,簡介)
  7. Geo(支持地理位置的操作,使用簡介)
  8. Pub/Sub
  9. BloomFilter
  10. RedisSearch
  11. Redis-ML

緩存雪崩(緩存擊穿)

他們出現的原理都是訪問緩存的時候,key 剛好失效,導致直接訪問 DB,壓垮后臺。

解決辦法就是讓 key 的過期時間分散開,不要集中失效

分布式鎖

使用 setnx 命令后為了防止死鎖,需要對 key 施加 expire 命令,防止死鎖,但是存在執行 expire 命令前宕機,造成死鎖的發生。

解決辦法就是使用復雜的 setnx 命令,他可以把 setnx 和 expire 一起原子執行

如何尋找有固定前綴的 key

使用 KEYS pattern 命令,如:KEYS alib*

但是因為 Redis 是單線程的,執行該命令后會導致 Redis 阻塞住。

解決辦法就是使用 scan 命令,scan 命令可以無阻塞的提取出指定模式的 key 列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys指令長

scan 命令的特點:

Redis中的Scan命令的使用 - MSSQL123 - 博客園?www.cnblogs.com
3cf62f2cb414ef60818dcbce79464dce.png

如何用 Redis 做異步隊列

使用 list 數據結構,在一遍加入,另一邊取出,若取出來的是 null,則消費線程應該 sleep,或者消費線程不使用 lpop 或 rpop 命令,改為 blpop 或者 brpop 命令,若沒有元素可取,它會阻塞列表直到等待超時或發現可彈出元素為止。

如何生產一次,消費多次

使用發布訂閱模式

但是在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如 rabbitmq

Redis 如何實現延時隊列

使用 zset ,用時間戳作為 score,消息會按照時間順序排序

然后使用 zrangebyscore key min max [WITHSCORES] [LIMIT offset count] 來取出比當前時間小的 key 的 value

持久化

Redis 4.0 時代以 RDB 為主,AOF 只記錄上一次 RDB 到現在的更改記錄

開啟混合持久化:aof-use-rdb-preamble yes

工作原理:其實還是一種 AOF 機制,但是新增了 RDB 的特性,先看此模式下的 AOF 的數據結構圖

df21e7415d34a76bd4367d891eab1fb1.png
  • 看圖就知道混合模式指的就是重寫 AOF 的時候,將此刻內存里面的數據做成 RDB,在此過程中增量的數據寫入到緩沖區,最終形成新的 aof 文件。接著刪除舊的 AOF。
  • 重啟恢復時先恢復 RDB,再重放新增的 AOF 指令

持久化的意義在于故障恢復

  • AOF:記錄每一次的寫操作到日志上,重啟時重放日志以重建數據
    • 每隔一段時間調用系統的 fsync 函數強制將 os cache 里面的數據刷新到磁盤上
  • RDB:每隔一段時間保存一次當前時間點上的數據快照
    • 快照就是一次又一次地從頭開始創造一切,全量的

持久化如何工作的

關鍵詞:寫時復制和 fork 子進程

  • 每當 Redis 需要轉儲數據集到磁盤時,會發生:
    • Redis 調用 fork()。于是我們有了父子兩個進程。
    • 子進程開始將數據集寫入一個臨時 RDB / AOF 文件。
    • 當子進程完成了新 RDB 文件,替換掉舊文件。
    • AOF 的 fork(),與 RDB 不同的是父進程會在一個內存緩沖區中積累新的變更,同時將新的變更寫入新的 AOF 文件,所以即使重寫失敗我們也安全。當子進程完成重寫文件,父進程收到一個信號,追加內存緩沖區到子進程創建的文件末尾,接著自動重命名文件為新的,然后開始追加新數據到新文件
  • 這個方法可以讓 Redis 獲益于寫時復制(copy-on-write)機制

AOF 為什么要重寫

AOF 記錄的是 Redis 的每一次變更,這個變更包含了大量的冗余操作,導致 AOF 體積變大,恢復緩慢。

通過重寫這個體積大的 AOF 文件,可以實現新的 AOF 文件不會包含任何浪費空間的冗余命令,通常體積會較舊 AOF 文件小很多。

Pipeline

將多個指令一起發送,減少 IO,提高吞吐量

Redis 的同步機制

Redis 可以使用主從同步,從從同步。

第一次同步時,主節點做一次 bgsave,并同時將后續修改操作記錄到內存 buffer,待完成后將 RDB 文件全量同步到復制節點,復制節點接受完成后將 RDB 鏡像加載到內存。

加載完成后,再通知主節點將期間修改的操作記錄同步到復制節點進行重放就完成了同步過程。后續的增量數據通過 AOF 日志同步即可,有點類似數據庫的 binlog

Redis 集群

Redis Sentinal 著眼于高可用,在 master 宕機時會自動將 slave 提升為 master,繼續提供服務。

Redis Cluster 著眼于擴展性,在單個 redis 內存不足時,使用 Cluster 進行分片存儲。

Redis 的通訊協議是什么

答案是文本協議

雖然文本協議耗費流量,但是解析性能很好

Redis 的事務

首先 Redis 支持事務,但是它的事務與MySQL這類傳統的數據庫的事務不同,不同點為:

  1. 通過 MULTI 開啟事務(類似于MySQL的 STARTtransaction; 命令)
  2. 通過 EXEC 命令觸發事務(類似于MySQL的 COMMIT; 命令)
  3. 執行事務的時候放入事務隊列里面的命令都會被執行,不管是否有命令執行時出錯
  4. Redis 的事務可以理解為打包的批量執行腳本,所以不支持原子性,失敗了可以繼續執行完,也不會回滾
  5. 但是單個的Redis命令是原子的

具備隔離性:Redis 因為是單線程操作,所以在隔離性上有天生的隔離機制,當 Redis 執行事務時,Redis 的服務端保證在執行事務期間不會對事務進行中斷,所以,Redis 事務總是以串行的方式運行,事務也具備隔離性。

不具備一致性:雖然開啟持久化之后可以在數據出現問題是恢復到之前的狀態,但是因為Redis的事務不是原子性的,不會回滾數據,Redis設計時也沒有考慮ACID特性,所以認為Redis不具備一致性

持久性:開啟持久化就支持,不開啟就不支持

Redis 的樂觀鎖 Watch 是怎么實現的

Watch 會在事務開始之前盯住 1 個或多個關鍵變量,如下圖:

當事務執行時,也就是服務器收到了 exec 指令要順序執行緩存的事務隊列時, Redis 會檢查關鍵變量自 Watch 之后,是否被修改了。

6985f121bdade4718492a3d146797f00.png

上圖顯示,watch abc 之后執行事務之前,執行了一次 incr 操作,所以在 exec 的時候失敗,watch 的實現原理不是 CAS 中的 Cmpxchg 指令,而是借助 Redis 的單線程執行機制,采用了 watched_keys 的數據結構和串行流程實現了樂觀鎖,具體解釋就是:

每一個被 watch 的 key 都會被構造成一個 watched_keys 數據類型,多個被 watch 的 key 構造成鏈表存儲著假設客戶端 A 和 B 都 watch abc
但是并發時 Redis Server 中只會有一個線程在執行,
當 A 修改了 watch 命令監視的 key 后,會改變 abc 的 watched_keys 的狀態為 dirty,
客戶端 B 會檢查這個被 watch 的 abc,發現他的狀態是 dirty 的時候就會終止事務

Redis 如何節省內存

關鍵詞:ziplist、quicklist、對象共享

Ziplist 是一個緊湊的數據結構,每一個元素之間都是連續的內存,如果在 Redis 中,Redis 啟用的數據結構數據量很小時,Redis 就會切換到使用緊湊存儲的形式來進行壓縮存儲

Quicklist 是 ziplist 的雙向鏈表版本,可以在兩端執行 push 和 pop 操作

對象共享:指的就是多個key的value是一樣的話,就把多個key指向同一個value即可,如下圖:

6902e5d945eb8e63ad208e42ebe37167.png

A和B都指向值100,則A、B 共用同一個100對象

Redis 的過期策略

  1. 定時刪除:創建一個定時器,讓定時器在鍵過期時來執行刪除
    1. 對CPU不友好
    2. 影響性能
  2. 定期刪除:每隔一段時間,程序都要對數據庫進行一次檢查,刪除里面的過期鍵,至于要刪除多少過期鍵,由算法而定。
    1. 要么對 CPU 不友好
    2. 要么對內存不友好
  3. 惰性刪除:get Key 的時候才檢查是否過期,過期了就刪除返回 null
    1. 對內存不友好
    2. 可能導致內存溢出

Redis 同步策略

最簡單的架構模式就是:一臺 master 和多個 slave

僅 master 開啟持久化策略,負責寫入操作,slave 只負責讀取操作

同步的目的就是為了【讀寫分離】和【容災備份】

同步的過程:

  1. slave 發送 SYNC 給 master
  2. master 接收到命令后一邊緩存繼續寫入的命令,一邊 fork 子進程生成 RDB 文件
  3. 子進程寫完 RDB 之后,父進程把 RDB 發送給 slave,slave 接收 RDB 并重現數據
  4. 父進程增量地將緩存的寫命令發送給 slave

Redis 為什么是單進程單線程的

注意:這里的單線程指的是處理 I/O 事件是單線程的,并發的請求進入 Redis 后會排隊,只有上一個處理完了,才會繼續處理下一個。

注意:Redis 可不完全是單進程的,開啟持久化的時候,會 fork 子進程完成 RDB/AOF 的創建

6c7ec51c905f02a8320cf6be68c48db0.png
Redis 的線程模型

d6b368865e21af74c7565f99418118f4.png
命令處理過程

我們所謂的多線程操作是為了加快計算,所以開啟多個線程同步操作,而這會耗費大量的 CPU 資源。

Redis 設計之初就是純內存運行,計算速度夠快了,若再使用多線程操作的話會因為線程管理問題以及上下文切換耗時,反而會降低性能。Redis 官方測試中一臺普通的筆記本電腦沒鳥的QPS可達十幾萬,所以目前來看沒有必要使用多線程。

客戶端獲取 value 阻塞時,卻不會影響后面的命令的執行

Redis 為什么這么快

  1. 純內存運行
  2. 單線程(這個單線程指的是處理命令的時候只有一個線程執行,其他的命令加入隊列阻塞)
  3. 數據結構簡單,使用專門的數據結構存儲數據
    1. 例如:ZSet 使用跳表存儲
    2. 字符串使用 SDS(Simple Dynamic String)的結構體保存(該結構體可以存儲字符串的長度,還能防止字符串溢出,實現二進制存儲安全等特性)
    3. 哈希表用的是字典,且通過兩個 ht 實現漸進式 rehash(有利于加快Redis響應效率)
    4. 還有通過 ZipList、QuickList 來壓縮內存
  4. 非阻塞的 I/O 多路復用模型:用一個線程管理多個網絡連接
    1. epoll
    2. React 線程模型

談一下 Redis 的哈希槽

Redis 集群使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現分區(因為一致性哈希開銷很大)

數據分片就是用到了16384個槽,槽里面可存多個key

集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽

也就是說整個集群里面不管有幾臺機器,只有 16384 個槽,集群把槽分配給全部的實例,每個實例管理一部分的槽,如圖:

51cf09e905cbc9d6c1d42bd1129a78ef.png

擴容、縮容都要涉及槽的遷移;擴容后要給新機器分配槽、縮容后要分配被釋放的槽給其他節點。

傳統的一致性哈希

后知后覺:面試必備:什么是一致性Hash算法??zhuanlan.zhihu.com
677e2758b427707bdbe6f99141e92707.png

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

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

相關文章

的優先級大小_如何評估需求的優先級?

一、 需求的優先級怎么定義? 很多產品經理,包括我,一定都會遇到這樣的場景:“ 需求堆如山,什么都想做 ”。面對各種各樣、來自各個渠道的需求,產品經理的工作職責之一,就是梳理需求的優先級。我…

html5 drawimage 不顯示,canvas的drawImage無法顯示圖像

window.οnlοadfunction(){var Canvasdocument.getElementById("canvas");var cxtCanvas.getContext("2d");var bgnew Image();//你指定了圖片的地址,但是圖片的加載是需要時間的bg.src"../img/2-14020314314A26.jpg";//執行完上面一…

html自動給圖片加上水印 代碼_如何給一千張圖片去水印?還好我會python,100行代碼輕松搞定...

寫在前面近期好多網友私信我,問我編程該怎么學習、怎么入門。我覺得編程學習,就像寫文章一樣,需要積累。如果把代碼每個字符拆開,大伙都認識,但是組合在一起,就是另外一回事了。所以我的建議是,…

html中兩個圖片疊放,CSS實現圖片疊放(勾選圖標)

場景我們經常會遇到這種場景,有一個待選圖片列表,在圖片上(可能是右上角也有可能時右下角)疊放一個勾選狀態圖標,這篇文章就記錄實現這個功能的過程。原理利用flex布局space-around顯示圖片列表在圖片的外層加一個div,同時把勾選狀…

pyspark sparksession_PySpark 處理數據和數據建模

安裝相關包from pyspark.sql import SparkSession from pyspark.sql.functions import udf, when, count, countDistinct from pyspark.sql.types import IntegerType,StringType from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler from…

html loader使用方法,webpack中loader的使用方法,以及幾個常用loader的應用小實例

loader:是webpack用來預處理模塊的,在一個模塊被引入之前,會預先使用loader處理模塊的內容。可能,你會遇到當你用webpack打包的時候,提示你需要一個loader來處理文件,那webpack中的loader就是幫助預處理下模…

linq查詢不包含某個值的記錄_MySQL行(記錄)的詳細操作

閱讀目錄一 介紹二 插入數據INSERT三 更新數據UPDATE四 刪除數據DELETE五 查詢數據SELECT六 權限管理一 介紹MySQL數據操作: DML在MySQL管理軟件中,可以通過SQL語句中的DML語言來實現數據的操作,包括使用INSERT實現數據的插入UPDATE實現數據的…

聽課評課記錄計算機應用,教師聽課的評語(精選10篇)

教師聽課的評語(精選10篇)通過引導學生提煉信息提出問題解決問題,使學生再次感受了數學與現實生活的密切聯系,經歷了運用乘法口訣求商的計算方法的形成過程,培養了學生對知識的遷移能力。下面是小編整理的教師聽課的評語(精選10篇)&#xff0…

java音頻實時傳輸_會議室智能系統建設方案,實時遠程視頻協作

2019年,預計會議協作需求將持續增長,創建多功能會議室促進本地、異地協作仍然是一個強大的趨勢。無論空間大小或距離遠近,政府部門、企業單位以及團體組織為了實現決策指令暢通、管理層次分明,需要通過對會議室環境、多功能會議系…

依賴 netty spring_十分鐘帶你了解Spring的七大知識點,程序員必了解

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。很多研發人員把spring看作心目中最好的java項目,沒有之一。所以這是重點也是難點&…

南通大學計算機組成原理期末考試題,南通大學計算機組成原理期末考試范圍.docx...

南通大學計算機組成原理期末考試范圍計算機組成原理選擇填空題 15分填空題 20 分計算題 50分設計題 15分第一章計算機的主要性能指標馮諾依曼型計算機的體系結構、組成部分控制器的基本任務計算機系統的層次結構第二章數據與文字的表示方法定點數的表示方法數的機器碼表示校驗碼…

android實現手機拍照以及圖片預覽功能_手機系統將有A/B分區?Android 11這些變化你關注過嗎...

跳票讓Android 11沉淀下來并吸引了更多的消費者,在iPhone SE大規模進軍主流消費市場的今天,Android這邊難道不想依靠新系統扳回一局嗎?在人們感嘆iOS一些功能似曾相似的時候,Android 11新的突破與創新格外讓人振奮。01Android 11欲…

小程序的點贊功能能和瀏覽次數功能_掃碼點餐小程序好用嗎?小程序還能實現哪些功能?...

有不少的餐廳現在都可以用小程序掃碼點餐了,為什么現在很少用公眾號點餐了?原因其實很簡單,用公眾號點餐用戶還要關注公眾號,第二個就是在于公眾號每天發消息很煩,而小程序則沒有這樣的煩惱,只在使用的時候…

word計算機課教學反思,《WORD》初中信息技術的教學反思

《WORD》初中信息技術的教學反思本節課在建構主義學習理論指導下,采用“任務驅動”教學策略,借助多媒體課件,對學生實施研究式自主學習教學模式,教學中注重培養學生分析問題、解決問題的能力。通過學習和實際操作,培養…

simulink中mask設置_(實現BPSK學習Verilog)1. Simulink仿真實現

歡迎關注BUG記錄知乎專欄和BUG記錄公眾號,關注BUG記錄公眾號回復101獲取本文使用的Simulink仿真文件微信號:BugRec由于最近研究某個高速接口沒什么實質性的突破,實在寫不出太好的東西,所以就寫點更為基礎的東西分享給大家&#xf…

arima模型_[不說人話系列]-ARIMA模型

看文獻的時候看到幾個統計推理的模型,想要大概了解,想做個系列,記錄自己胡說八道的數理筆記過程。如有錯誤,感謝您指正。文前感謝馮小姐詳細認真的技術援助!1- 名稱簡稱:ARIMA模型英文名:Auto r…

認識計算機網絡試講稿,操作系統簡介試講教案.pdf

學習必備 歡迎下載課題 操作系統簡介內容章節:第二章第一節 課型:新授課教學時間: 本節內容共授課2課時 授課班級:學習者分析:學生通過第一章的學習,對計算機的軟、硬件知識有了初步的了解,。但由于學生普遍對計算機理…

pcb天線和純銅天線_如何簡化天線設計?相控陣波束成形IC來助您

為提高性能,無線通信和雷達系統對天線架構的需求不斷增長。只有那些功耗低于傳統機械操縱碟形天線的天線才能實現許多新的應用。除了這些要求以外,還需要針對新的威脅或新的用戶快速重新定位,傳輸多個數據流,并以超低的成本……正…

c語言貪吃蛇_C語言貪吃蛇完整代碼

#include #include #include //windows編程頭文件#include #include //控制臺輸入輸出頭文件#ifndef __cplusplustypedef char bool;#define false 0#define true 1#endif//將光標移動到控制臺的(x,y)坐標點處void gotoxy(int x, int y){COORD coord;coord.X x;coord.Y y;Se…

上海市計算機一級客觀題,2012年上海市高校計算機等級考試(一級)模擬卷客觀題...

2012年上海市高校計算機等級考試(一級)模擬卷客觀題 (5頁)本資源提供全文預覽,點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧,查找使用更方便哦!11.9 積分關于防火墻,以下說法不正確的是____A____。下列屬于視頻制作的常用軟件的…