1.說一說 Redis 是什么
Redis 是一種「Key-Value」的內(nèi)存型、非關(guān)系型數(shù)據(jù)庫,屬于 NoSQL 的一種。
Redis 的讀寫速度特別快,特別適合讀寫頻繁的場景。
Redis 支持主從復(fù)制,支持?jǐn)?shù)據(jù)持久化。
2.知道 Redis 有哪些常用數(shù)據(jù)類型嗎
- String
- List
- Hash
- Set
- Zset
3.說一下 Redis 用來做什么
- 利用 String,可以很容易實(shí)現(xiàn)「計(jì)數(shù)器」功能。
- 利用 List ,可以實(shí)現(xiàn)「粉絲列表」功能。
- 利用 Hash,可以實(shí)現(xiàn)「瀏覽記錄」功能。
- 利用 Set 的并集、合集特性,可以實(shí)現(xiàn)「共同好友」功能。
- 利用 Zset 的排序特性,可以實(shí)現(xiàn)「排行榜」功能。
- 由于 Redis 的高速讀寫特性,可以充當(dāng)「緩存」。
- 充當(dāng)「消息隊(duì)列」,如 Celery 中就是用 Redis 充當(dāng)中間人,生產(chǎn)者和消費(fèi)者都是向 Redis 中發(fā)布任務(wù)和接受任務(wù)。
4.說一下 Redis 是怎樣將數(shù)據(jù)持久化的
-
RDB
為某一時(shí)刻下的 Redis 數(shù)據(jù)庫里的內(nèi)容拍一張照片(快照),并將該照片寫進(jìn)磁盤中,實(shí)現(xiàn)數(shù)據(jù)持久化。
當(dāng)數(shù)據(jù)庫崩潰時(shí),會(huì)丟失最后一次快照的內(nèi)容。
如果數(shù)據(jù)庫內(nèi)容過大,那么生成快照時(shí)間會(huì)很長。
-
AOF
通過寫命令,將數(shù)據(jù)追加到(Append Only File)文件末尾,實(shí)現(xiàn)數(shù)據(jù)持久化。
但是使用 AOF,需要解決同步問題。
因?yàn)槲募膶懭氩粫?huì)立馬執(zhí)行,而是先將寫入的內(nèi)容放置「緩存區(qū)」,等待操作系統(tǒng)決定何時(shí)將緩存區(qū)的內(nèi)容寫入磁盤。
Redis 擁有三種同步策略:Always、Everysec、No。
絕大多數(shù)情況下都是使用第二種策略,每隔一秒鐘同步一次,這樣就算數(shù)據(jù)庫崩潰也只會(huì)損失一秒鐘的數(shù)據(jù)。
而其他兩種策略,要么對(duì)數(shù)據(jù)庫的壓力過大,過多降低數(shù)據(jù)庫的性能,要么具有丟失數(shù)據(jù)量過大的風(fēng)險(xiǎn)。
5.了解 Redis 主從復(fù)制嗎
使用
slaveof host port
設(shè)置主從服務(wù)器。
Redis 的主從服務(wù)器有點(diǎn)像樹結(jié)構(gòu),從服務(wù)器只能有一個(gè)主服務(wù)器。
Redis 不支持「主-主復(fù)制」。
Redis 主從復(fù)制通過利用 RDB 快照持久化的特性,將某一時(shí)刻下主服務(wù)器的內(nèi)容生成快照,然后發(fā)送給從服務(wù)器,并利用緩存區(qū)保存在這期間里進(jìn)行的「寫命令」,等待快照發(fā)送完畢之后,再將寫命令發(fā)送給從服務(wù)器。
從服務(wù)器在接收到快照之后,會(huì)將自身的數(shù)據(jù)全部丟棄,載入快照里的數(shù)據(jù),載入完畢之后,再執(zhí)行主服務(wù)器的寫命令。
6. 說一下 Redis 和 Memcache 的區(qū)別
Redis | Memcache |
---|---|
支持 String、List、Hash、Set、Zset | 只支持 String |
支持?jǐn)?shù)據(jù)持久化 | 不支持 |
支持事務(wù) | 不支持 |
支持主從復(fù)制 | 不支持 |
支持分布式 | 不支持 |
支持將數(shù)據(jù)交換到磁盤中 | 不支持 |
單進(jìn)程、單線程 IO 多路復(fù)用 | 多線程、非阻塞 IO |
總結(jié)為一點(diǎn),只用得到 Redis 里的 String 類型存儲(chǔ)數(shù)據(jù)時(shí),使用 Memcache。
除此之外,使用 Redis。
7. 了解 Redis 是怎樣保證熱數(shù)據(jù)的嗎
Redis 是內(nèi)存型的數(shù)據(jù)庫,可以設(shè)置最大內(nèi)存,當(dāng)內(nèi)存不夠時(shí),會(huì)使用「數(shù)據(jù)淘汰策略」,刪除部分?jǐn)?shù)據(jù)。
但是并不是針對(duì) Redis 里所有的數(shù)據(jù),而是抽樣選取小部分「數(shù)據(jù)集」。
策略 | 描述 |
---|---|
Volatile-LRU | 從設(shè)置了過期時(shí)間的「數(shù)據(jù)集」中,刪除最近、最少使用的數(shù)據(jù)集 |
Volatile-TTL | 從設(shè)置了過期時(shí)間的「數(shù)據(jù)集」中,刪除即將要過期的數(shù)據(jù)。 |
Volatile-Random | 從設(shè)置了過期時(shí)間的「數(shù)據(jù)集」中,隨機(jī)刪除數(shù)據(jù)。 |
Always-LRU | 從「數(shù)據(jù)集」中刪除最近、最少使用的數(shù)據(jù)。 |
AllKeys-Random | 從「數(shù)據(jù)集」中隨機(jī)刪除數(shù)據(jù)。 |
Noeviction | 禁止刪除數(shù)據(jù)。 |
當(dāng) Redis 作為緩存使用時(shí),為了保證緩存數(shù)據(jù)都是「熱數(shù)據(jù)」,可以將 Redis 的最大內(nèi)存設(shè)置為緩存的大小,并使用 Always-LRU 策略。將最近最少使用的數(shù)據(jù)舍棄,保證緩存里熱數(shù)據(jù)的「高命中率」。
至此,有關(guān)「數(shù)據(jù)庫」知識(shí)點(diǎn)的面試題就已告一段落,下次更新「網(wǎng)絡(luò)通信方面」面試題。
所有內(nèi)容均已上傳至「GitHub」倉庫,歡迎大家點(diǎn)擊原文查閱。
歡迎大家關(guān)注個(gè)人微信公眾號(hào)「 PythonDeveloper 」,所有內(nèi)容 第一時(shí)間更新于公眾號(hào) 。
所有內(nèi)容均為本人一點(diǎn)一點(diǎn)敲出來的,難免會(huì)有錯(cuò)字、語句不通順的地方,歡迎大家指正。
因本人水平有限,文章內(nèi)容難免會(huì)有出錯(cuò)、遺漏,歡迎大家評(píng)論指出,一起進(jìn)步。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
