Redis面試總結

2022-01-08 Java知音

作者:java野生程式設計師

主頁:https://www.cnblogs.com/jiahaoJAVA

公眾號註:更多Redis技術文章,點擊文末閱讀原文直達


什麼是redis?

Redis 是一個基於內存的高性能key-value資料庫。 (有空再補充,有理解錯誤或不足歡迎指正)


Reids的特點

Redis本質上是一個Key-Value類型的內存資料庫,很像memcached,整個資料庫統統加載在內存當中進行操作,定期通過異步操作把資料庫數據flush到硬碟上進行保存。


因為是純內存操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。


Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種數據結構,此外單個value的最大限制是1GB,不像 memcached只能保存1MB的數據,因此Redis可以用來實現很多有用的功能,比方說用他的List來做FIFO雙向鍊表,實現一個輕量級的高性 能消息隊列服務,用他的Set可以做高性能的tag系統等等。


另外Redis也可以對存入的Key-Value設置expire時間,因此也可以被當作一 個功能加強版的memcached來用。


Redis的主要缺點是資料庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫,因此Redis適合的場景主要局限在較小數據量的高性能操作和運算上。


Redis支持的數據類型

Redis通過Key-Value的單值不同類型來區分, 以下是支持的類型:

Strings

Lists

Sets 求交集、併集

Sorted Set 

hashes



為什麼redis需要把所有數據放到內存中?

Redis為了達到最快的讀寫速度將數據都讀到內存中,並通過異步的方式將數據寫入磁碟。所以redis具有快速和數據持久化的特徵。


如果不將數據放在內存中,磁碟I/O速度為嚴重影響redis的性能。在內存越來越便宜的今天,redis將會越來越受歡迎。


如果設置了最大使用的內存,則數據已有記錄數達到內存限值後不能繼續插入新值。



Redis是單進程單線程的

redis利用隊列技術將並發訪問變為串行訪問,消除了傳統資料庫串行控制的開銷


虛擬內存

當你的key很小而value很大時,使用VM的效果會比較好.因為這樣節約的內存比較大.


當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value.


vm-max-threads這個參數,可以設置訪問swap文件的線程數,設置最好不要超過機器的核數,如果設置為0,那麼所有對swap文件的操作都是串行的.


可能會造成比較長時間的延遲,但是對數據完整性有很好的保證.


自己測試的時候發現用虛擬內存性能也不錯。如果數據量很大,可以考慮分布式或者其他資料庫


分布式

redis支持主從的模式。原則:Master會將數據同步到slave,而slave不會將數據同步到master。Slave啟動時會連接master來同步數據。


這是一個典型的分布式讀寫分離模型。我們可以利用master來插入數據,slave提供檢索服務。這樣可以有效減少單個機器的並發訪問數量。


讀寫分離模型

通過增加Slave DB的數量,讀的性能可以線性增長。為了避免Master DB的單點故障,集群一般都會採用兩臺Master DB做雙機熱備,所以整個集群的讀和寫的可用性都非常高。


讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須保存完整的數據,如果在數據量很大的情況下,集群的擴展能力還是受限於單個節點的存儲能力,而且對於Write-intensive類型的應用,讀寫分離架構並不適合。


數據分片模型

為了解決讀寫分離模型的缺陷,可以將數據分片模型應用進來。


可以將每個節點看成都是獨立的master,然後通過業務實現數據分片。


結合上面兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。


Redis的回收策略

volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰


volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰


volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰


allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰


allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰


no-enviction(驅逐):禁止驅逐數據



1. 使用Redis有哪些好處?

速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)

支持豐富數據類型,支持string,list,set,sorted set,hash

支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除


2. redis相比memcached有哪些優勢?

memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數據類型

redis的速度比memcached快很多

redis可以持久化其數據


3. redis常見性能問題和解決方案:

Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件

如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次

為了主從複製的速度和連接的穩定性,Master和Slave最好在同一個區域網內

儘量避免在壓力很大的主庫上增加從庫

主從複製不要用圖狀結構,用單向鍊表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...


這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。



4. MySQL裡有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據


相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。


redis 提供 6種數據淘汰策略,上文已經列出。


5. Memcache與Redis的區別都有哪些?


1)、存儲方式


Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。


Redis有部份存在硬碟上,這樣能保證數據的持久性。


2)、數據支持類型


Memcache對數據類型支持相對簡單。


Redis有複雜的數據類型。


3)、使用底層模型不同


它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。


Redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。


4)、value大小


redis最大可以達到1GB,而memcache只有1MB


6. Redis 常見的性能問題都有哪些?如何解決?


1).Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。



2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復速度。


Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啟用內存快照做持久化,如果數據比較關鍵,某個Slave開啟AOF備份數據,策略為每秒同步一次。



3).Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。


4). Redis主從複製的性能問題,為了主從複製的速度和連接的穩定性,Slave和Master最好在同一個區域網內


7,redis 最適合的場景

Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別。


那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?


如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

Redis支持數據的備份,即master-slave模式的數據備份。

Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次加載進行使用。


(1)、會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?


幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平臺Magento也提供Redis的插件。


(2)、全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis實例,因為有磁碟的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。


再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。


此外,對WordPress的用戶來說,Pantheon有一個非常好的插件  wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。


(3)、隊列

Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。


如果你快速的在Google中搜索「Redis queues」,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後臺就是使用Redis作為broker,你可以從這裡去查看。


(4),排行榜/計數器

Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為「user_scores」,我們只需要像下面一樣執行即可:


當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:


ZRANGE user_scores 0 10 WITHSCORES


Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這裡看到。


(5)、發布/訂閱

最後(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基於發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。


Redis提供的所有特性中,我感覺這個是喜歡的人最少的一個,雖然它為用戶提供如果此多功能。


推薦大而全的【後端技術精選】

相關焦點

  • 總結一波 Redis 面試題
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?
  • 程式設計師必備|面試中常被問到的redis持久化的問題
    一個剛剛在面試中被懟的體無完膚的少年,在街上漫無目的遊蕩,突然看到一個禿頂的老人在賣書,少年好奇也就走了過去,翻來翻去都是一些頸椎病治療指南和防脫髮的書籍。「年輕人,看你愁眉苦臉,一定是剛面試被懟了吧?」老人笑著說道「老頭,你以為你是算命的嗎?」
  • 總結一波 Redis 面試題,收藏起來.
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?
  • 總結一波 Redis 面試題,收藏起來.
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?
  • 去pdd面試,redis把我面哭了【附面試答案】
    但是想進大廠,就得經過很複雜的面試,才有資格去大廠扭螺絲。今天看下某網友去pdd面試,都問了哪些技術。面試都附了答案,如果不會的,我們可以繼續充電哦。祝你早日挺近大廠,奧利給……下面看面試情況1、簡單做一下自我介紹吧,為什麼這麼快就想換工作。簡單說下你簡歷中的項目。
  • Redis面試突擊專用
    點擊「程式設計師面試吧」,選擇「星標🔝」點擊文末「閱讀原文」解鎖往期資料合集!本文的面試題如下:Redis 持久化機制 緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題 熱點數據和冷數據是什麼 Memcache與Redis的區別都有哪些?
  • 46道Redis面試題,含參考答案!
    1.memcached 所有的值均是簡單的字符串,redis 作為其替代者,支持更為豐富的數據類型2.redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多3.redis 可以持久化其數據 redis 可以持久化其數據3、Redis 支持哪幾種數據類型?
  • 什麼是 Redis的VM機制?
    它的優秀還導致了不少人都喜歡研究它,面試官也喜歡提問面試者,也使整個行業進入了更深的內卷。我相信多數人還是拒絕選擇躺平的,今天我們一起來了解一下,Redis 的 VM 機制。Redis 之 VM 機制Redis 的 VM (虛擬內存)機制就是暫時把不經常訪問的數據(冷數據)從內存交換到磁碟中,從而騰出寶貴的內存空間用於其它需要訪問的數據(熱數據)。
  • 面試必問的 Redis:RDB、AOF、混合持久化
    慢工出細活吧,本文還是有很多非常細節的內容的,如果能掌握,讓大廠面試官眼前一亮還是問題不大的。默認是 everysec,在這種配置下,redis 仍然可以保持良好的性能,並且就算發生故障停機,也最多只會丟失一秒鐘的數據。2)AOF文件是一個純追加的日誌文件。即使日誌因為某些原因而包含了未寫入完整的命令(比如寫入時磁碟已滿,寫入中途停機等等), 我們也可以使用 redis-check-aof 工具也可以輕易地修復這種問題。
  • 搞懂這些Redis知識點,吊打面試官!
    五種數據類型面試官:總結的不錯,看來是早有準備啊。剛來聽你提到 Redis 支持五種數據類型,那你能簡單說下這五種數據類型嗎?我:當然可以,但是在說之前,我覺得有必要先來了解下 Redis 內部內存管理是如何描述這 5 種數據類型的。
  • Redis 面試題,面試官能問的都被我找到了!
    (1) memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數據類型(2) redis的速度比memcached快很多(3) redis可以持久化其數據3、Redis支持哪幾種數據類型?
  • 【110期】面試官:Redis分布式鎖如何解決鎖超時問題?
    , 但是, 並沒有解決當鎖已超時而業務邏輯還未執行完的問題, 這樣會導致: A線程超時時間設為10s(為了解決死鎖問題), 但代碼執行時間可能需要30s, 然後redis服務端10s後將鎖刪除, 此時, B線程恰好申請鎖, redis服務端不存在該鎖, 可以申請, 也執行了代碼, 那麼問題來了, A、B線程都同時獲取到鎖並執行業務邏輯, 這與分布式鎖最基本的性質相違背: 在任意一個時刻, 只有一個客戶端持有鎖
  • 【187期】出現機率比較大的Redis面試題(含答案)
    本文的面試題如下:緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構有沒有嘗試進行多機redis 的部署?如何保證數據一致的?為什麼Redis的操作是原子性的,怎麼保證原子性的?
  • 知乎面試官:講講 Redis 都有哪些監控指標?沒經驗的我只能走人~
    收錄於話題 #Java面試那些事兒>NameDescriptionrdb_last_save_time最後一次持久化保存磁碟的時間戳rdb_changes_sice_last_save自最後一次持久化以來資料庫的更改數# 錯誤指標:ErrorNameDescriptionrejected_connections由於達到maxclient限制而被拒絕的連接數keyspace_misseskey
  • 一不小心肝出了4W字的Redis面試教程
    到這裡我們已經精通Redis的五種基本數據類型了,又可以去和面試官扯皮了,扯不過就跑路吧,或者這篇文章多看幾遍,相信對你總是有好處的。Redis內存分配策略概述今天就帶來了一個面試常問的一個問題:假如你的Redis內存滿了怎麼辦?
  • 2019年面試總結
    心裡默念:你是最佳人選,你是最棒的面試前準備:1.面試前多準備,隔幾天看一遍,容易忘2.面試心儀公司前,找兩家公司練手3.儘量約在上午(不吃早飯,保持頭腦清醒),或下午飯後兩小時(中午休息好)4.關注後臺代碼邏輯5.實際自動化項目練習6.資料庫設計是整個項目靈魂,從設計可以看出業務及業務關聯關係
  • 面試被問 Go 的map[int64]int64 在 redis 會佔多少空間...
    我們在系統設計面試或者在實際工作中,免不了要進行一些估算。之前的文章裡講過一些技巧,今天來個實戰。
  • 三歪推薦:Redis常見的面試題
    redis通過encoding屬性設置對象的編碼形式來提升靈活性和效率,基於不同的場景redis會自動做出優化。redis的速度非常的快,單機的redis就可以支撐每秒10幾萬的並發,相對於mysql來說,性能是mysql的幾十倍。速度快的原因主要有幾點:C語言實現,優化過的數據結構,基於幾種基礎的數據結構,redis做了大量的優化,性能極高那為什麼Redis6.0之後又改用多線程呢?
  • 經典面試題:Redis的熱key問題如何發現和解決?
    可以在Proxy層做收集上報,但是缺點很明顯,並非所有的redis集群架構都有proxy。方法四:用redis自帶命令(1)monitor命令,該命令可以實時抓取出redis伺服器接收到的命令,然後寫代碼統計出熱key是啥。當然,也有現成的分析工具可以給你使用,比如redis-faina。
  • 網友面試N多家公司,孟哥幫你總結面試題,再也不怕面試了
    實現方式死鎖怎麼解決我:資料庫實現,redis實現,zookeeper實現。怎麼設計一個安全的對外接口單線程的redis為什麼這麼快redis持久化方式什麼是聚簇索引,什麼是非聚簇索引mysql事務隔離級別你覺得你能承擔獨立開發的任務嗎其他問題回答得挺好的,自我感覺不錯,本來以為能收到offer的,但是朋友說那個面試官覺得我不行,不能承擔獨立開發系統的任務,估計是第8個問題回答失誤了吧