1. 程式人生 > >Redis 學習筆記(四):redis 面試題總結

Redis 學習筆記(四):redis 面試題總結

目錄:

Redis 的好處

相比 memcached 的優勢

常見效能問題

記憶體淘汰策略

使用的場景

1. 使用Redis有哪些好處?

(1) 速度快,因為資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1)

(2) 支援豐富資料型別,支援string,list,set,sorted set,hash

(3) 支援事務,操作都是原子性,所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除

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

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

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

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

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

1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案。

寫記憶體快照時,save命令排程rdbSave函式,會阻塞主執行緒的工作;
AOF在重寫的時候會佔大量的CPU和記憶體資源。如果不重寫AOF檔案,這個持久化方式對效能的影響是最小的,但是AOF檔案會不斷增大,AOF檔案過大會影響Master重啟的恢復速度。

2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

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

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

5) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...

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

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

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

redis 提供 6種資料淘汰策略:

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

maxmemory-policy 引數設定淘汰策略:

CONFIG SET maxmemory-policy volatile-lru      #淘汰有過時期的最近最好使用資料

5. redis 適合的場景

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

1) 會話快取(Session Cache)

用Redis快取會話比其他儲存(如Memcached)的優勢在於:Redis提供持久化。

2) 佇列

Reids在記憶體儲存引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用。

3) 排行榜

集合(Set)和有序集合(Sorted Set)也使得這些操作變的非常簡單。當要從排序集合中獲取到排名最靠前的10個使用者–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:
當然,這是假定你是根據你使用者的分數做遞增的排序。如果你想返回使用者及使用者的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

排行榜(leader board)按照得分進行排序。ZADD命令可以直接實現這個功能,而ZREVRANGE命令可以用來按照得分來獲取前100名的使用者,ZRANK可以用來獲取使用者排名,非常直接而且操作容易。

這就像Reddit的排行榜,得分會隨著時間變化。LPUSH和LTRIM命令結合運用,把文章新增到一個列表中。一項後臺任務用來獲取列表,並重新計算列表的排序,ZADD命令用來按照新的順序填充生成列表。列表可以實現非常快速的檢索,即使是負載很重的站點。

4)計數器

Redis在記憶體中對數字進行遞增或遞減的操作實現的非常好。Redis的命令都是原子性的,你可以輕鬆地利用INCR,DECR命令來構建計數器系統。

進行各種資料統計的用途是非常廣泛的,比如想知道什麼時候封鎖一個IP地址。INCRBY命令讓這些變得很容易,通過原子遞增保持計數;GETSET用來重置計數器;過期屬性用來確認一個關鍵字什麼時候應該刪除。

5) 釋出/訂閱

釋出/訂閱的使用場景確實非常多。我已看見人們在社交網路連線中使用,還可作為基於釋出/訂閱的指令碼觸發器,甚至用Redis的釋出/訂閱功能來建立聊天系統!。

6) 需要精準設定過期時間
可以把有序集合(sorted set)的score值設定成過期時間的時間戳,那麼就可以簡單地通過過期時間排序,定時清除過期資料了,不僅是清除Redis中的過期資料,你完全可以把Redis裡這個過期時間當成是對資料庫中資料的索引,用Redis來找出哪些資料需要過期刪除,然後再精準地從資料庫中刪除相應的記錄。

參考文獻: