1. 程式人生 > >Redis和Memcached 面試題

Redis和Memcached 面試題

Redis相比memcached有哪些優勢?
(1) memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別

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

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

Redis支援哪幾種資料型別?
String、List、Set、Sorted Set、hashes

Redis叢集方案應該怎麼做?都有哪些方案?
1.twemproxy,大概概念是,它類似於一個代理方式,使用方法和普通redis無任何區別,設定好它下屬的多個redis例項後,使用時在本需要連線redis的地方改為連線twemproxy,它會以一個代理的身份接收請求並使用一致性hash演算法,將請求轉接到具體redis,將結果再返回twemproxy。使用方式簡便(相對redis只需修改連線埠),對舊專案擴充套件的首選。 問題:twemproxy自身單埠例項的壓力,使用一致性hash後,對redis節點數量改變時候的計算值的改變,資料無法自動移動到新的節點。

Redis回收使用的是什麼演算法?
LRU演算法

為什麼要做Redis分割槽?
分割槽可以讓Redis管理更大的記憶體,Redis將可以使用所有機器的記憶體。如果沒有分割槽,你最多隻能使用一臺機器的記憶體。分割槽使Redis的計算能力通過簡單地增加計算機得到成倍提升,Redis的網路頻寬也會隨著計算機和網絡卡的增加而成倍增長。

Redis的記憶體佔用情況怎麼樣?
給你舉個例子: 100萬個鍵值對(鍵是0到999999值是字串“hello
world”)在我的32位的Mac筆記本上 用了100MB。同樣的資料放到一個key裡只需要16MB, 這是因為鍵值有一個很大的開銷。 在Memcached上執行也是類似的結果,但是相對Redis的開銷要小一點點,因為Redis會記錄型別資訊引用計數等等。

Memcached服務特點及工作原理是什麼?
a、完全基於記憶體快取的

b、節點之間相互獨立

c、C/S模式架構,C語言編寫,總共2000行程式碼。

d、非同步I/O 模型,使用libevent作為事件通知機制。

e、被快取的資料以key/value鍵值對形式存在的。

f、全部資料存放於記憶體中,無永續性儲存的設計,重啟伺服器,記憶體裡的資料會丟失。

g、當記憶體中快取的資料容量達到啟動時設定的記憶體值時,就自動使用LRU演算法刪除過期的快取資料。

h、可以對儲存的資料設定過期時間,這樣過期後的資料自動被清除,服務本身不會監控過期,而是在訪問的時候檢視key的時間戳,判斷是否過期。

j、memcache會對設定的記憶體進行分塊,再把塊分組,然後再提供服務。

如何實現叢集中的session共享儲存?
Session是執行在一臺伺服器上的,所有的訪問都會到達我們的唯一伺服器上,這樣我們可以根據客戶端傳來的sessionID,來獲取session,或在對應Session不存在的情況下(session 生命週期到了/使用者第一次登入),建立一個新的Session;但是,如果我們在叢集環境下,假設我們有兩臺伺服器A,B,使用者的請求會由Nginx伺服器進行轉發(別的方案也是同理),使用者登入時,Nginx將請求轉發至伺服器A上,A建立了新的session,並將SessionID返回給客戶端,使用者在瀏覽其他頁面時,客戶端驗證登入狀態,Nginx將請求轉發至伺服器B,由於B上並沒有對應客戶端發來sessionId的session,所以會重新建立一個新的session,並且再將這個新的sessionID返回給客戶端,這樣,我們可以想象一下,使用者每一次操作都有1/2的概率進行再次的登入,這樣不僅對使用者體驗特別差,還會讓伺服器上的session激增,加大伺服器的執行壓力。

為了解決叢集環境下的seesion共享問題,共有4種解決方案:

1.粘性session
粘性session是指Ngnix每次都將同一使用者的所有請求轉發至同一臺伺服器上,即將使用者與伺服器繫結。
2.伺服器session複製
即每次session發生變化時,建立或者修改,就廣播給所有叢集中的伺服器,使所有的伺服器上的session相同。
3.session共享
快取session,使用redis, memcached。
4.session持久化

將session儲存至資料庫中,像操作資料一樣才做session。

memcached與redis的區別?
1、Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。而memcache只支援簡單資料型別,需要客戶端自己處理複雜物件

2、Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用(PS:持久化在rdb、aof)。

3、由於Memcache沒有持久化機制,因此宕機所有快取資料失效。Redis配置為持久化,宕機重啟後,將自動載入宕機時刻的資料到快取系統中。具有更好的災備機制。

4、Memcache可以使用Magent在客戶端進行一致性hash做分散式。Redis支援在伺服器端做分散式(PS:Twemproxy/Codis/Redis-cluster多種分散式實現方式)

5、Memcached的簡單限制就是鍵(key)和Value的限制。最大鍵長為250個字元。可以接受的儲存資料不能超過1MB(可修改配置檔案變大),因為這是典型slab 的最大值,不適合虛擬機器使用。而Redis的Key長度支援到512k。

6、Redis使用的是單執行緒模型,保證了資料按順序提交。Memcache需要使用cas保證資料一致性。CAS(Check and Set)是一個確保併發一致性的機制,屬於“樂觀鎖”範疇;原理很簡單:拿版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作

cpu利用。由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在儲存小資料時比Memcached效能更 高。而在100k以上的資料中,Memcached效能要高於Redis 。

7、memcache記憶體管理:使用Slab Allocation。原理相當簡單,預先分配一系列大小固定的組,然後根據資料大小選擇最合適的塊儲存。避免了記憶體碎片。(缺點:不能變長,浪費了一定空間)memcached預設情況下下一個slab的最大值為前一個的1.25倍。

8、redis記憶體管理: Redis通過定義一個數組來記錄所有的記憶體分配情況, Redis採用的是包裝的malloc/free,相較於Memcached的記憶體 管理方法來說,要簡單很多。由於malloc 首先以連結串列的方式搜尋已管理的記憶體中可用的空間分配,導致記憶體碎片比較多

本文轉載自:http://youzhixueyuan.com/redis-memcached-interview-questions-and-answers.html