好程式設計師Java培訓分享實用的Redis面試題一

好程式設計師發表於2020-08-03

  好程式設計師Java 培訓分享實用的 Redis 面試題 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 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 提供的所有特性中,我感覺這個是喜歡的人最少的一個,雖然它為使用者提供如果此多功能。

   5 redis 的一些其他特點

   1 Redis 是單程式單執行緒的 redis 利用佇列技術將併發訪問變為序列訪問,消除了傳統資料庫序列控制的開銷

   2 )讀寫分離模型 透過增加 Slave DB 的數量,讀的效能可以線性增長。為了避免 Master DB 的單點故障,叢集一般都會採用兩臺 Master DB 做雙機熱備,所以整個叢集的讀和寫的可用性都非常高。 讀寫分離架構的缺陷在於,不管是 Master 還是 Slave ,每個節點都必須儲存完整的資料,如果在資料量很大的情況下,叢集的擴充套件能力還是受限於單個節點的儲存能力,而且對於 Write-intensive 型別的應用,讀寫分離架構並不適合。

   3 )資料分片模型 為了解決讀寫分離模型的缺陷,可以將資料分片模型應用進來。 可以將每個節點看成都是獨立的 master ,然後透過業務實現資料分片。 結合上面兩種模型,可以將每個 master 設計成由一個 master 和多個 slave 組成的模型。

   4 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 (驅逐):禁止驅逐資料

   注意這裡的6 種機制, volatile allkeys 規定了是對已設定過期時間的資料集淘汰資料還是從全部資料集淘汰資料,後面的 lru ttl 以及 random 是三種不同的淘汰策略,再加上一種 no-enviction 永不回收的策略。

   使用策略規則:

   如果資料呈現冪律分佈,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用allkeys-lru

   如果資料呈現平等分佈,也就是所有的資料訪問頻率都相同,則使用allkeys-random


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2708906/,如需轉載,請註明出處,否則將追究法律責任。

相關文章