面試中關於Redis的問題看這篇就夠了

SnailClimb發表於2019-01-19

 就我個人而言,我覺得Redis的基本使用是我們每個Java程式設計師都應該會的。另外,如果需要面試的話,一些關於Redis的理論知識也需要好好的學習一下。學完Redis之後,對照著下面8點看看自己還有那些不足的地方,同時,下面7點也是面試中經常會問到的。另外,《Redis實戰》、《Redis設計與實現》是我比較推薦的兩本學習Redis的書籍。

  1. Redis的兩種持久化操作以及如何保障資料安全(快照和AOF)
  2. 如何防止資料出錯(Redis事務)
  3. 如何使用流水線來提升效能
  4. Redis主從複製
  5. Redis叢集的搭建
  6. Redis的幾種淘汰策略
  7. Redis叢集當機,資料遷移問題
  8. Redis快取使用有很多,怎麼解決快取雪崩和快取穿透?

下面就一些問題給大家詳細說一下。

什麼是Redis?

Redis 是一個使用 C 語言寫成的,開源的 key-value 資料庫。。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。目前,Vmware在資助著redis專案的開發和維護。

Redis與Memcached的區別與比較

1 、Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。memcache支援簡單的資料型別,String。

2 、Redis支援資料的備份,即master-slave模式的資料備份。

3 、Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用,而Memecache把資料全部存在記憶體之中

4、 redis的速度比memcached快很多

5、Memcached是多執行緒,非阻塞IO複用的網路模型;Redis使用單執行緒的IO複用模型。

Redis與Memcached的區別與比較

如果想要更詳細瞭解的話,可以檢視慕課網上的這篇手記(非常推薦) :《腳踏兩隻船的困惑 - Memcached與Redis》www.imooc.com/article/235…

Redis與Memcached的選擇

終極策略: 使用Redis的String型別做的事,都可以用Memcached替換,以此換取更好的效能提升; 除此以外,優先考慮Redis;

使用redis有哪些好處?

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

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

(3) 支援事務 :redis對事務是部分支援的,如果是在入隊時報錯,那麼都不會執行;在非入隊時報錯,那麼成功的就會成功執行。詳細瞭解請參考:《Redis事務介紹(四)》:blog.csdn.net/cuipeng0916…

redis監控:鎖的介紹

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

Redis常見資料結構使用場景

1. String

常用命令: set,get,decr,incr,mget 等。

String資料結構是簡單的key-value型別,value其實不僅可以是String,也可以是數字。 常規key-value快取應用; 常規計數:微博數,粉絲數等。

2.Hash

常用命令: hget,hset,hgetall 等。

Hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。 比如我們可以Hash資料結構來儲存使用者資訊,商品資訊等等。

舉個例子: 最近做的一個電商網站專案的首頁就使用了redis的hash資料結構進行快取,因為一個網站的首頁訪問量是最大的,所以通常網站的首頁可以通過redis快取來提高效能和併發量。我用jedis客戶端來連線和操作我搭建的redis叢集或者單機redis,利用jedis可以很容易的對redis進行相關操作,總的來說從搭一個簡單的叢集到實現redis作為快取的整個步驟不難。感興趣的可以看我昨天寫的這篇文章:

《一文輕鬆搞懂redis叢集原理及搭建與使用》: juejin.im/post/5ad54d…

3.List

常用命令: lpush,rpush,lpop,rpop,lrange等

list就是連結串列,Redis list的應用場景非常多,也是Redis最重要的資料結構之一,比如微博的關注列表,粉絲列表,最新訊息排行等功能都可以用Redis的list結構來實現。

Redis list的實現為一個雙向連結串列,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷。

4.Set

常用命令: sadd,spop,smembers,sunion 等

set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的。 當你需要儲存一個列表資料,又不希望出現重複資料時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。

在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis可以非常方便的實現如共同關注、共同喜好、二度好友等功能。

5.Sorted Set

常用命令: zadd,zrange,zrem,zcard等

和set相比,sorted set增加了一個權重引數score,使得集合中的元素能夠按score進行有序排列。

舉例: 在直播系統中,實時排行資訊包含直播間線上使用者列表,各種禮物排行榜,彈幕訊息(可以理解為按訊息維度的訊息排行榜)等資訊,適合使用Redis中的SortedSet結構進行儲存。

MySQL裡有2000w資料,Redis中只存20w的資料,如何保證Redis中的資料都是熱點資料(redis有哪些資料淘汰策略???)

   相關知識:redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略(回收策略)。redis 提供 6種資料淘汰策略:

  1. volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
  2. volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰
  3. volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
  4. allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
  5. allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
  6. no-enviction(驅逐):禁止驅逐資料

Redis的併發競爭問題如何解決?

Redis為單程式單執行緒模式,採用佇列模式將併發訪問變為序列訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連線並不存在競爭,但是在Jedis客戶端對Redis進行併發訪問時會發生連線超時、資料轉換錯誤、阻塞、客戶端關閉連線等問題,這些問題均是由於客戶端連線混亂造成。對此有2種解決方法:

 1.客戶端角度,為保證每個客戶端間正常有序與Redis進行通訊,對連線進行池化,同時對客戶端讀寫Redis操作採用內部鎖synchronized。   2.伺服器角度,利用setnx實現鎖。

 注:對於第一種,需要應用程式自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。

Redis回收程式如何工作的? Redis回收使用的是什麼演算法?

Redis記憶體回收:LRU演算法(寫的很不錯,推薦)www.cnblogs.com/WJ5888/p/43…

Redis 大量資料插入

官方文件給的解釋:www.redis.cn/topics/mass…

Redis 分割槽的優勢、不足以及分割槽型別

官方文件提供的講解:www.redis.net.cn/tutorial/35…

Redis持久化資料和快取怎麼做擴容?

《redis的持久化和快取機制》github.com/Snailclimb/…

擴容的話可以通過redis叢集實現,之前做專案的時候用過自己搭的redis叢集 然後寫了一篇關於redis叢集的文章:《一文輕鬆搞懂redis叢集原理及搭建與使用》juejin.im/post/5ad54d…

Redis常見效能問題和解決方案:

  1. Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案
  2. 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次
  3. 為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內
  4. 儘量避免在壓力很大的主庫上增加從庫

Redis與訊息佇列

作者:翁偉 連結:https://www.zhihu.com/question/20795043/answer/345073457

不要使用redis去做訊息佇列,這不是redis的設計目標。但實在太多人使用redis去做去訊息佇列,redis的作者看不下去,另外基於redis的核心程式碼,另外實現了一個訊息佇列disque: antirez/disque:github.com/antirez/dis…部署、協議等方面都跟redis非常類似,並且支援叢集,延遲訊息等等。

我在做網站過程接觸比較多的還是使用redis做快取,比如秒殺系統,首頁快取等等。

好文Mark

非常非常推薦下面幾篇文章。。。

《Redis深入之道:原理解析、場景使用以及視訊解讀》zhuanlan.zhihu.com/p/28073983: 主要介紹了:Redis叢集開源的方案、Redis協議簡介及持久化Aof檔案解析、Redis短連線效能優化等等內容,文章乾貨太大,容量很大,建議時間充裕可以看看。另外文章裡面還提供了視訊講解,可以說是非常非常用心了。

《阿里雲Redis混合儲存典型場景:如何輕鬆搭建視訊直播間系統》:yq.aliyun.com/articles/58…: 主要介紹視訊直播間系統,以及如何使用阿里雲Redis混合儲存例項方便快捷的構建大資料量,低延遲的視訊直播間服務。還介紹到了我們之前提高過的redis的資料結構的使用場景

《美團在Redis上踩過的一些坑-5.redis cluster遇到的一些問》carlosfu.iteye.com/blog/225457…:主要介紹了redis叢集的兩個常見問題,然後分享了 一些關於redis叢集不錯的文章。

參考:

https://www.cnblogs.com/Survivalist/p/8119891.html

http://www.redis.net.cn/tutorial/3524.html

https://redis.io/

歡迎關注我的微信公眾號:"Java面試通關手冊"(一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源):

微信公眾號

相關文章