Python面試官問Redis的相關問題,看完這篇文章就夠了

最近寫了一篇自己搭建redis集羣並在自己項目中使用的文章,今天早上看別人寫的面經發現redis在面試中還是比較常問的(我是python方向)。所以查閱官方文檔以及他人造好的輪子,總結了一些redis面試和學習中你必須掌握的問題。事無鉅細,不可能囊括到所有內容,儘量把比較常見的寫出來

什麼是Redis?

安裝Redis Redis的代碼遵循ANSI-C編寫,可以在所有POSIX系統(如Linux, *BSD, Mac OS X, Solaris等)上安裝運行。而且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。

Python面試官問Redis的相關問題,看完這篇文章就夠了

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

3 、Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用,而Memecache把數據全部存在內存之中

4、 redis的速度比memcached快很多

5、Memcached是多線程,非阻塞IO複用的網絡模型;Redis使用單線程的IO複用模型。

Python面試官問Redis的相關問題,看完這篇文章就夠了

如果想要更詳細瞭解的話,可以查看慕課網上的這篇手記(非常推薦) :《腳踏兩隻船的困惑 - 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) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

Redis常見數據結構使用場景

  1. String

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

String數據結構是簡單的key-value類型,value其實不僅可以是String,也可以是數字。常規key-value緩存應用;常規計數:微博數,粉絲數等。

Python面試官問Redis的相關問題,看完這篇文章就夠了

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種數據淘汰策略:

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(驅逐):禁止驅逐數據

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

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

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

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

4.redis數據結構

redis 的作者antirez曾稱其爲一個數據結構服務器(data structures server),這是一個非常準確的表述,redis的所有功能就是將數據以其固有的幾種結構保存,並提供給用戶操作這幾種結構的接口。我們可以想象我們在各種語言中的那些固有數據類型及其操作。

Python面試官問Redis的相關問題,看完這篇文章就夠了

redis目前提供四種數據類型:string,list,set及zset(sorted set)和Hash。

string是最簡單的類型,你可以理解成與Memcached一模一個的類型,一個key對應一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。

list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等。操作中key理解爲鏈表的名字。

set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交併差等操作。操作中key理解爲集合的名字。

zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key理解爲zset的名字。

Hash數據類型允許用戶用Redis存儲對象類型,Hash數據類型的一個重要優點是,當你存儲的數據對象只有很少幾個key值時,數據存儲的內存消耗會很小.更多關於Hash數據類型的說明請見:http://code.google.com/p/redis/wiki/Hashes

Python面試官問Redis的相關問題,看完這篇文章就夠了

5.redis數據存儲

redis的存儲分爲內存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數對其進行配置。

save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將數據同步到數據文件。這個可以多個條件配合,比如默認配置文件中的設置,就設置了三個條件。

appendonly yes/no ,appendonly配置,指出是否在每次更新操作後進行日誌記錄,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。因爲redis本身同步數據文件是按上面的save條件來同步的,所以有的數據會在一段時間內只存在於內存中。

appendfsync no/always/everysec ,appendfsync配置,no表示等操作系統進行數據緩存同步到磁盤,always表示每次更新操作後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次。

好了,今天的知識就分享到這裏,歡迎關注頭條愛編程的南風,私信關鍵詞:學習資料,獲取更多學習資源,如果文章對你有有幫助,請收藏關注,在今後與你分享更多學習python的文章。同時歡迎在下面評論區留言如何學習python。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章