首頁  >  文章  >  資料庫  >  總結30個Redis常見問題!

總結30個Redis常見問題!

藏色散人
藏色散人轉載
2021-09-25 16:22:353509瀏覽

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

推薦學習:《redis影片教學

以上是總結30個Redis常見問題!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:码农有道。如有侵權,請聯絡admin@php.cn刪除