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

 就我我的而言,我以爲Redis的基本使用是咱們每一個Java程序員都應該會的。另外,若是須要面試的話,一些關於Redis的理論知識也須要好好的學習一下。學完Redis以後,對照着下面8點看看本身還有那些不足的地方,同時,下面7點也是面試中常常會問到的。另外,《Redis實戰》、《Redis設計與實現》是我比較推薦的兩本學習Redis的書籍。html

  1. Redis的兩種持久化操做以及如何保障數據安全(快照和AOF)
  2. 如何防止數據出錯(Redis事務)
  3. 如何使用流水線來提高性能
  4. Redis主從複製
  5. Redis集羣的搭建
  6. Redis的幾種淘汰策略
  7. Redis集羣宕機,數據遷移問題
  8. Redis緩存使用有不少,怎麼解決緩存雪崩和緩存穿透?

下面就一些問題給你們詳細說一下。git

什麼是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。github

2 、Redis支持數據的備份,即master-slave模式的數據備份。面試

3 、Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用,而Memecache把數據所有存在內存之中redis

四、 redis的速度比memcached快不少算法

五、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學習資源):

微信公衆號
相關文章
相關標籤/搜索