日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

90道Redis高性能緩存數(shù)據(jù)庫面試題,技術(shù)面試官該問的都在這

 

redis高性能緩存數(shù)據(jù)庫

1、什么是 Redis?簡述它的優(yōu)缺點?

Redis 的全稱是:Remote Dictionary.Server,本質(zhì)上是一個 Key-Value 類型的內(nèi)存數(shù)據(jù)庫,很像

memcached,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù) flush 到硬盤上進(jìn)行保存。

因為是純內(nèi)存操作,Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的Key-Value DB。

Redis 的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單個 value 的最大限制是 1GB,不像 memcached 只能保存 1MB 的數(shù)據(jù),因此 Redis 可以用來實現(xiàn)很多有用的功能。

比方說用他的 List 來做 FIFO 雙向鏈表,實現(xiàn)一個輕量級的高性 能消息隊列服務(wù),用他的 Set 可以做高性能的 tag 系統(tǒng)等等。

另外 Redis 也可以對存入的 Key-Value 設(shè)置 expire 時間,因此也可以被當(dāng)作一 個功能加強(qiáng)版的memcached 來用。 Redis 的主要缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此 Redis 適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上。

2、Redis 與 memcached 相比有哪些優(yōu)勢?

  • memcached 所有的值均是簡單的字符串,redis 作為其替代者,支持更為豐富的數(shù)據(jù)類型
  • redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
  • redis 可以持久化其數(shù)據(jù) redis 可以持久化其數(shù)據(jù)

3、Redis 支持哪幾種數(shù)據(jù)類型?

String、List、Set、Sorted Set、hashes

4、Redis 主要消耗什么物理資源?

內(nèi)存。

5、Redis 有哪幾種數(shù)據(jù)淘汰策略?

  • noeviction:返回錯誤當(dāng)內(nèi)存限制達(dá)到,并且客戶端嘗試執(zhí)行會讓更多內(nèi)存被使用的命令。
  • allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數(shù)據(jù)有空間存放。
  • volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放。
  • allkeys-random: 回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放。
  • volatile-random: 回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放,但僅限于在過期集合的鍵。
  • volatile-ttl: 回收在過期集合的鍵,并且優(yōu)先回收存活時間(TTL)較短的鍵,使得新添加的數(shù)據(jù)有空間存放。

6、Redis 官方為什么不提供 windows 版本?

因為目前 linux 版本已經(jīng)相當(dāng)穩(wěn)定,而且用戶量很大,無需開發(fā) windows 版本,反而會帶來兼容性等問題。

7、一個字符串類型的值能存儲最大容量是多少?

512M

8、為什么 Redis 需要把所有數(shù)據(jù)放到內(nèi)存中?

Redis 為了達(dá)到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。

所以 redis 具有快速和數(shù)據(jù)持久化的特征,如果不將數(shù)據(jù)放在內(nèi)存中,磁盤 I/O 速度為嚴(yán)重影響 redis 的性能。

在內(nèi)存越來越便宜的今天,redis 將會越來越受歡迎, 如果設(shè)置了最大使用的內(nèi)存,則數(shù)據(jù)已有記錄數(shù)達(dá)到內(nèi)存限值后不能繼續(xù)插入新值。

90道Redis高性能緩存數(shù)據(jù)庫面試題,技術(shù)面試官該問的都在這

 

9、Redis 集群方案應(yīng)該怎么做?都有哪些方案?

  • codis
  • 目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在節(jié)點數(shù)量改變情況下,舊節(jié)點數(shù)據(jù)可恢復(fù)到新 hash 節(jié)點。
  • redis cluster3.0 自帶的集群,特點在于他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節(jié)點設(shè)置從節(jié)點。具體看官方文檔介紹。
  • 在業(yè)務(wù)代碼層實現(xiàn),起幾個毫無關(guān)聯(lián)的 redis 實例,在代碼層,對 key 進(jìn)行 hash 計算,然后去對應(yīng)的redis 實例操作數(shù)據(jù)。這種方式對 hash 層代碼要求比較高,考慮部分包括,節(jié)點失效后的替代算法方案,數(shù)據(jù)震蕩后的自動腳本恢復(fù),實例的監(jiān)控,等等。
  • JAVA 架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm 性能調(diào)優(yōu)、Spring 源碼,MyBatis,Netty,Redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

10、Redis 集群方案什么情況下會導(dǎo)致整個集群不可用?

有 A,B,C 三個節(jié)點的集群,在沒有復(fù)制模型的情況下,如果節(jié)點 B 失敗了,那么整個集群就會以為缺少5501-11000 這個范圍的槽而不可用。

11、MySQL 里有 2000w 數(shù)據(jù),redis 中只存 20w 的數(shù)據(jù),如何保證 redis 中的數(shù)據(jù)都是熱點數(shù)據(jù)?

redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略。

其實面試除了考察 Redis,不少公司都很重視高并發(fā)高可用的技術(shù),特別是一線互聯(lián)網(wǎng)公司,分布式、

JVM、spring 源碼分析、微服務(wù)等知識點已是面試的必考題。文末分享給大家一線互聯(lián)網(wǎng)公司最新的技術(shù)知識(彩蛋)

90道Redis高性能緩存數(shù)據(jù)庫面試題,技術(shù)面試官該問的都在這

 

12、Redis 有哪些適合的場景?

(1)會話緩存(Session Cache)

最常用的一種使用 Redis 的情景是會話緩存(sessioncache),用 Redis 緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis 提供持久化。當(dāng)維護(hù)一個不是嚴(yán)格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現(xiàn)在,他們還會這樣嗎?

幸運的是,隨著 Redis 這些年的改進(jìn),很容易找到怎么恰當(dāng)?shù)氖褂?Redis 來緩存會話的文檔。甚至廣為人知的商業(yè)平臺 Magento 也提供 Redis 的插件。

(2)全頁緩存(FPC)

除基本的會話 token 之外,Redis 還提供很簡便的 FPC 平臺。回到一致性問題,即使重啟了 Redis 實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進(jìn),類似 php 本地FPC。

再次以 Magento 為例,Magento 提供一個插件來使用 Redis 作為全頁緩存后端。

此外,對 wordPress/ target=_blank class=infotextkey>WordPress 的用戶來說,Pantheon 有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

(3)隊列

Reids 在內(nèi)存存儲引擎領(lǐng)域的一大優(yōu)點是提供 list 和 set 操作,這使得 Redis 能作為一個很好的消息隊列平臺來使用。Redis 作為隊列使用的操作,就類似于本地程序語言(如 Python)對 list 的 push/pop操作。

如果你快速的在 google 中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用 Redis 創(chuàng)建非常好的后端工具,以滿足各種隊列需求。例如,Celery 有一個后臺就是使用Redis 作為 broker,你可以從這里去查看。

(4)排行榜/計數(shù)器

Redis 在內(nèi)存中對數(shù)字進(jìn)行遞增或遞減的操作實現(xiàn)的非常好。集合(Set)和有序集合(SortedSet)也使得我們在執(zhí)行這些操作的時候變的非常簡單,Redis 只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)。

所以,我們要從排序集合中獲取到排名最靠前的 10 個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:

當(dāng)然,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序。如果你想返回用戶及用戶的分?jǐn)?shù),你需要這樣執(zhí)行:

ZRANGE user_scores 0 10 WITHSCORESAgora Games 就是一個很好的例子,用 Ruby 實現(xiàn)的,它的排行榜就是使用 Redis 來存儲數(shù)據(jù)的,你可以在這里看到。

(5)發(fā)布/訂閱

最后(但肯定不是最不重要的)是 Redis 的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實非常多。我已看見人們在社交網(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用 Redis 的發(fā)布/訂閱功能來建立聊天系統(tǒng)!

90道Redis高性能緩存數(shù)據(jù)庫面試題,技術(shù)面試官該問的都在這

 

13、Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?

Redisson、Jedis、lettuce 等等,官方推薦使用 Redisson。

14、Redis 和 Redisson 有什么關(guān)系?

15、Jedis 與 Redisson 對比有什么優(yōu)缺點?

Jedis 是 Redis 的 Java 實現(xiàn)的客戶端,其 API 提供了比較全面的 Redis 命令的支持;

Redisson 實現(xiàn)了分布式和可擴(kuò)展的 Java 數(shù)據(jù)結(jié)構(gòu),和 Jedis 相比,功能較為簡單,不支持字符串操作,不支持排序、事務(wù)、管道、分區(qū)等 Redis 特性。Redisson 的宗旨是促進(jìn)使用者對 Redis 的關(guān)注分離,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上。

16、說說 Redis 哈希槽的概念?

Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 個哈希槽,每個 key 通過 CRC16 校驗后對 16384 取模來決定放置哪個槽,集群的每個節(jié)點負(fù)責(zé)一部分 hash 槽。

90道Redis高性能緩存數(shù)據(jù)庫面試題,技術(shù)面試官該問的都在這

 

17、Redis 集群的主從復(fù)制模型是怎樣的?

為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,每個節(jié)點都會有 N-1 個復(fù)制品.

18、Redis 集群會有寫操作丟失嗎?為什么?

Redis 并不能保證數(shù)據(jù)的強(qiáng)一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作。

19、Redis 集群之間是如何復(fù)制的?

異步復(fù)制

20、Redis 集群最大節(jié)點個數(shù)是多少?

16384 個

21、Redis 集群如何選擇數(shù)據(jù)庫?

Redis 集群目前無法做數(shù)據(jù)庫選擇,默認(rèn)在 0 數(shù)據(jù)庫。

22、Redis 中的管道有什么用?

一次請求/響應(yīng)服務(wù)器能實現(xiàn)處理新的請求即使舊的請求還未被響應(yīng),這樣就可以將多個命令發(fā)送到服務(wù)器,而不用等待回復(fù),最后在一個步驟中讀取該答復(fù)。

這就是管道(pipelining),是一種幾十年來廣泛使用的技術(shù)。例如許多 POP3 協(xié)議已經(jīng)實現(xiàn)支持這個功能,大大加快了從服務(wù)器下載新郵件的過程。

23、怎么理解 Redis 事務(wù)?

事務(wù)是一個單獨的隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行,事務(wù)在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。事務(wù)是一個原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。

24、Redis 事務(wù)相關(guān)的命令有哪幾個?

MULTI、EXEC、DISCARD、WATCH

25、Redis key 的過期時間和永久有效分別怎么設(shè)置?

EXPIRE 和 PERSIST 命令

26、Redis 如何做內(nèi)存優(yōu)化?

盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小,所以你應(yīng)該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面。

比如你的 web 系統(tǒng)中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設(shè)置單獨的 key,而是應(yīng)該把這個用戶的所有信息存儲到一張散列表里面。

27、Redis 回收進(jìn)程如何工作的?

一個客戶端運行了新的命令,添加了新的數(shù)據(jù)。Redi 檢查內(nèi)存使用情況,如果大于 maxmemory 的限制, 則根據(jù)設(shè)定好的策略進(jìn)行回收。一個新的命令被執(zhí)行,等等。

所以我們不斷地穿越內(nèi)存限制的邊界,通過不斷達(dá)到邊界然后不斷地回收回到邊界以下。

如果一個命令的結(jié)果導(dǎo)致大量內(nèi)存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內(nèi)存限制就會被這個內(nèi)存使用量超越

90道Redis高性能緩存數(shù)據(jù)庫面試題,技術(shù)面試官該問的都在這

 

28.加鎖機(jī)制

29.鎖互斥機(jī)制

30.watch dog 自動延期機(jī)制

31.可重入加鎖機(jī)制

32.釋放鎖機(jī)制

33.上述 Redis 分布式鎖的缺點

34.使用過 Redis 分布式鎖么,它是怎么實現(xiàn)的?

先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。

如果在 setnx 之后執(zhí)行 expire 之前進(jìn)程意外 crash 或者要重啟維護(hù)了,那會怎么樣?

set 指令有非常復(fù)雜的參數(shù),這個應(yīng)該是可以同時把 setnx 和 expire 合成一條指令來用的!

35.使用過 Redis 做異步隊列么,你是怎么用的?有什么缺點?

般使用 list 結(jié)構(gòu)作為隊列,rpush 生產(chǎn)消息,lpop 消費消息。當(dāng) lpop 沒有消息的時候,要適當(dāng) sleep一會再重試。

缺點:

  • 在消費者下線的情況下,生產(chǎn)的消息會丟失,得使用專業(yè)的消息隊列如 rabbitmq 等。
  • 能不能生產(chǎn)一次消費多次呢?
  • 使用 pub/sub 主題訂閱者模式,可以實現(xiàn) 1:N 的消息隊列。

36.什么是緩存穿透?如何避免?什么是緩存雪崩?何如避免?

緩存穿透

一般的緩存系統(tǒng),都是按照 key 去緩存查詢,如果不存在對應(yīng)的 value,就應(yīng)該去后端系統(tǒng)查找(比如DB)。一些惡意的請求會故意查詢不存在的 key,請求量很大,就會對后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透。

如何避免?

1:對查詢結(jié)果為空的情況也進(jìn)行緩存,緩存時間設(shè)置短一點,或者該 key 對應(yīng)的數(shù)據(jù) insert 了之后清理緩存。

2:對一定不存在的 key 進(jìn)行過濾。可以把所有的可能存在的 key 放到一個大的 Bitmap 中,查詢時通過該 bitmap 過濾。

緩存雪崩

當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給后端系統(tǒng)帶來很大壓力。導(dǎo)致系統(tǒng)崩潰。

如何避免?

1:在緩存失效后,通過加鎖或者隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。比如對某個 key 只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程等待。

2:做二級緩存,A1 為原始緩存,A2 為拷貝緩存,A1 失效時,可以訪問 A2,A1 緩存失效時間設(shè)置為短期,A2 設(shè)置為長期

3:不同的 key,設(shè)置不同的過期時間,讓緩存失效的時間點盡量均勻

分享到:
標(biāo)簽:緩存 Redis
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定