彙總30個Redis常見問題!

2021-09-25 19:00:18
1.Redis如何做記憶體優化?

儘可能使用雜湊表(hashes),雜湊表(是說雜湊表裡面儲存的數少)使用的記憶體非常小,所 以你應該儘可能的將你的資料模型抽象到一個雜湊表裡面。

比如你的web系統中有一個使用者物件,不要為這個使用者的名稱,姓氏,郵箱,密碼設定單獨的 key,而是應該把這個使用者的所有資訊儲存到一張雜湊表裡面。

2.Redis中的管道有什麼用?

一次請求/響應伺服器能實現處理新的請求即使舊的請求還未被響應。這樣就可以將多個命令發 送到伺服器,而不用等待回覆,最後在一個步驟中讀取該答覆。

這就是管道(pipelining),是一種幾十年來廣泛使用的技術。例如許多POP3協定已經實現 支援這個功能,大大加快了從伺服器下載新郵件的過程。

3.Redis和Redisson有什麼關係?

Redisson是一個高階的分散式協調Redis客服端,能幫助使用者在分散式環境中輕鬆實現一些 Java的物件 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

4.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的釋出/訂閱功能來建立聊天系統!

5.MySQL 裡有 2000w 資料,redis 中只存 20w 的資料,如何保證 redis 中的資料都 是熱點資料?

redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。

其實面試除了考察 Redis,不少公司都很重視高並行高可用的技術,特別是一線網際網路公司, 分散式、

JVM、spring 原始碼分析、微服務等知識點已是面試的必考題。

6.Redis 叢集方案什麼情況下會導致整個叢集不可用?

有 A,B,C 三個節點的叢集,在沒有複製模型的情況下,如果節點 B 失敗了,那麼整個叢集就會 以為缺少5501-11000 這個範圍的槽而不可用。

7.Redis 叢集方案應該怎麼做?都有哪些方案?

codis

目前用的最多的叢集方案,基本和 twemproxy 一致的效果,但它支援在節點數量改變情況下,舊節點資料可恢復到新 hash 節點。

redis cluster

3.0 自帶的叢集,特點在於他的分散式演演算法不是一致性 hash,而是 hash 槽的概念,以及自身支援節點設定從節點。具體看官方檔案介紹。在業務程式碼層實現,起幾個毫無關聯的 redis 範例,在程式碼層,對 key 進行 hash 計算, 然後去對應的redis 範例運算元據。這種方式對 hash 層程式碼要求比較高,考慮部分包 括,節點失效後的替代演演算法方案,資料震盪後的自動指令碼恢復,範例的監控,等等。

8.Redis String的內部編碼有哪些?

int、embstr、raw

10000以下的整數會使用快取裡的int常數。

長度小於等於44位元組:embstr編碼

長度大於44位元組:raw編碼

9.用Redis做延時佇列,具體應該怎麼實現?

可以使用Zset實現。member是任務描述,score是執行時間,然後用定時器定時去掃描,一 旦有執行時間小於或等於當前時間的任務,就立即執行。

10.Redis在叢集種查詢key的時候,是怎麼定位到具體節點的?

使用crc16演演算法對key進行hash 將hash值對16384取模,得到具體的槽位根據節點和槽位的對映資訊(與叢集建立連線後,使用者端可以取得槽位對映資訊),找到具體的節點地址 去具體的節點找key如果key不在這個節點上,則redis叢集會返回moved指令,加上新的節點地址給使用者端,同時,使用者端會重新整理原生的節點槽位對映關係如果槽位正在遷移中,那麼redis叢集會返回asking指令給使用者端,這是臨時糾正,使用者端不會重新整理原生的節點槽位對映關係

11.Redis的持久化了解過嗎?

Redis持久化有RDB和AOF這2種方式。

RDB:將資料庫快照以二進位制的方式儲存到磁碟中。

AOF:以協定文字方式,將所有對資料庫進行過寫入的命令和引數記錄到AOF檔案,從而記錄 資料庫狀態。

12.Redis在什麼情況下會觸發key的回收?

2種情況:1、定時(抽樣)清理;2、執行命令時,判斷記憶體是否超過maxmemory。

13.Redis key的淘汰策略有哪些?

8種:noeviction,volatile-lru,volatile-lfu,volatile-ttl,volatile-random,allkeylru,allkeys-lfu,allkeys-random

14.Redis事務機制瞭解過嗎?

Redis事務的概念:

Redis 事務的本質是一組命令的集合。事務支援一次執行多個命令,一個事務中所有命令都會 被序列化。在事務執行過程,會按照順序序列化執行佇列中的命令,其他使用者端提交的命令請 求不會插入到事務執行命令序列中。

Redis事務就是一次性、順序性、排他性的執行一個佇列中的一系列命令。

Redis事務沒有隔離級別的概念:

批次操作在傳送 EXEC 命令前被放入佇列快取,並不會被實際執行,也就不存在事務內的查詢 要看到事務裡的更新,事務外查詢不能看到。

Redis不保證原子性:

Redis中,單條命令是原子性執行的,但事務不保證原子性,且沒有回滾。事務中任意命令執 行失敗,其餘的命令仍會被執行。

Redis事務的三個階段:

開始事務

命令入隊

執行事務

Redis事務相關命令:

watch key1 key2 ... : 監視一或多個key,如果在事務執行之前,被監視的key被其他命令改動, 則事務被打斷 ( 類似樂觀鎖 )

multi : 標記一個事務塊的開始( queued )

exec : 執行所有事務塊的命令 ( 一旦執行exec後,之前加的監控鎖都會被取消掉 )

discard : 取消事務,放棄事務塊中的所有命令

unwatch : 取消watch對所有key的監控

15.使用Redis統計網站的UV,應該怎麼做?

UV與PV不同,UV需要去重。一般有2種方案:

1、用BitMap。存的是使用者的uid,計算UV的時候,做下bitcount就行了。

2、用布隆過濾器。將每次存取的使用者uid都放到布隆過濾器中。優點是省記憶體,缺點是無法得 到精確的UV。但是對於不需要精確知道具體UV,只需要大概的數量級的場景,是個不錯的選 擇。

16.Redis中的大key怎麼處理?

大key指的是value特別大的key。比如很長的字串,或者很大的set等等。大key會造成2個問題:

1、資料傾斜,比如某些節點記憶體佔用過高。

2、當刪除大key或者大 key自動過期的時候,會造成QPS突降,因為Redis是單執行緒的緣故。

處理方案:可以將一個大key進行分片處理,比如:將一個大set分成多個小的set。

17.Redis中的熱key怎麼處理?

1、對熱key進行分散處理。比如:在key上加上不同的前字尾,快取多個key,使得各個key分 散到不同的節點上。

2、採用多級快取。

18.快取失效?快取穿透?快取雪崩?快取並行?

快取失效 快取失效指的是大量的快取在同一時間失效,到時DB的瞬間壓力飆升。造成這種現象的 原因是,key的過期時間都設定成一樣了。解決方案是,key的過期時間引入隨機因素, 比如5分鐘+隨機秒這種方式。

快取穿透 快取穿透是指查詢一條資料庫和快取都沒有的一條資料,就會一直查詢資料庫,對資料 庫的存取壓力就會增大,快取穿透的解決方案,有以下2種:快取空物件:程式碼維護較簡單,但是效果不好。布隆過濾器:程式碼維護複雜,效果很好。

快取雪崩 快取雪崩 是指在某一個時間段,快取集中過期失效。此刻無數的請求直接繞開快取,直 接請求資料庫。造成快取雪崩的原因,有以下2種:reids宕機。大部分資料失效。

對於快取雪崩的解決方案有以下2種:

搭建高可用的叢集,防止單機的redis宕機。

設定不同的過期時間,防止同意之間內大量的key失效。

快取並行 有時候如果網站並行存取高,一個快取如果失效,可能出現多個程序同時查詢DB,同時 設定快取的情況,如果並行確實很大,這也可能造成DB壓力過大,還有快取頻繁更新的 問題。一般處理方案是在查DB的時候進行加鎖,如果KEY不存在,就加鎖,然後查DB入快取, 然後解鎖;其他程序如果發現有鎖就等待,然後等解鎖後再查快取或者進入DB查詢。

19.Redis叢集如何選擇資料庫?

Redis叢集目前無法做資料庫選擇,預設在0資料庫。

20.Redis如何設定密碼及驗證密碼?

設定密碼:config set requirepass 123456

授權密碼:auth 123456

21.為什麼 Redis 需要把所有資料放到記憶體中?

Redis 為了達到最快的讀寫速度將資料都讀到記憶體中,並通過非同步的方式將資料寫入磁碟。

所以 redis 具有快速和資料持久化的特徵,如果不將資料放在記憶體中,磁碟 I/O 速度為嚴重影 響 redis 的效能。

在記憶體越來越便宜的今天,redis 將會越來越受歡迎, 如果設定了最大使用的記憶體,則資料已 有記錄數達到記憶體限值後不能繼續插入新值。

22.Redis 官方為什麼不提供 Windows 版本?

因為目前 Linux 版本已經相當穩定,而且使用者量很大,無需開發 windows 版本,反而會帶來 相容性等問題。

23.Redis是單執行緒還是多執行緒?

Redis6.0採用多執行緒IO,不過命令的執行還是單執行緒的。

Redis6.0之前,IO執行緒和執行執行緒都是單執行緒的。

24.Redis為什麼那麼快?

1、記憶體操作;

2、單執行緒,省去執行緒切換、鎖競爭的開銷;

3、非阻塞IO模型,epoll。

25.一個字串型別的值能儲存最大容量是多少?

512M

26.Redis的全稱是什麼?

Remote Dictionary Server。

27.Redis主要消耗什麼物理資源?

記憶體。

28.Redis有哪些資料結構?

Redis 有 5 種基礎資料結構,它們分別是:string(字串)、list(列表)、hash(字典)、set(集 合) 和 zset(有序集合)。

這 5 種是 Redis 相關知識中最基礎、最重要的部分。

29.Redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別

(2) redis的速度比memcached快很多

(3) redis可以持久化其資料

30.什麼是Redis?簡述它的優缺點?

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適合的場景主要侷限在較小資料量的高效能操作和運算上。

推薦學習:《》

以上就是彙總30個Redis常見問題!的詳細內容,更多請關注TW511.COM其它相關文章!