開篇介紹
大家好腊状,我是Java最全面試題庫
的提褲姐,今天這篇是分布式技術(shù)的第二篇胰苏,主要介紹分布式redis醇疼;在后續(xù),會沿著第一篇開篇的知識線路一直總結(jié)下去秧荆,做到日更乙濒!如果我能做到百日百更,希望你也可以跟著百日百刷颁股,一百天養(yǎng)成一個好習(xí)慣。
Redis集群最大節(jié)點個數(shù)是多少?
16384個
Redis集群的主從復(fù)制模型是怎樣的?
為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用诉儒,所以集群使用了主從復(fù)制模型亏掀,每個點都會有N-1
個復(fù)制品
Redis和 Redisson有什么關(guān)系?
Redisson是一個高級的分布式協(xié)調(diào)redis客服端,能幫助用戶在分布式環(huán)境中輕松實現(xiàn)一些java的對象(Bloom filter
温算,BitSet
间影,set
, SetMultimap
蔓搞, ScoredSortedSet
随橘,SortedSet
, Map
机蔗,ConcurrentMap
, List
梆掸, List Multimap
, Queue
怪得, BlockingQueue
卑硫, Deque
, Blocking Deque
欢伏, Semaphore
硝拧, Lock
, ReadWriteLock
障陶, Atomi cLong
抱究, CountDownLa
, Publish/ Subscribe
媳维, HyperLogLog
)
MySQL里有2000w數(shù)據(jù)侄刽, redis中只存20w的數(shù)據(jù)朋凉,如何保證 redis中的數(shù)據(jù)都是熱點數(shù)據(jù)?
redis內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候杂彭,就會實行數(shù)據(jù)淘汰策略。
Redis集群方案應(yīng)該怎么做?都有哪些方案?
1.codis.
目前用的最多的集群方案亲怠,基本和 twemproxy
一致的效果团秽,但它支持在節(jié)點數(shù)量改變情況下叭首,舊節(jié)點數(shù)據(jù)可恢復(fù)到新hash節(jié)點踪栋。
2.redis cluster3.0
自帶的集群,特點在于他的分布式算法不是一致性hash眷唉,而是hash槽的概念囤官,以及自身支持節(jié)點設(shè)置從節(jié)點。
3.在業(yè)務(wù)代碼層實現(xiàn)
起幾個毫無關(guān)聯(lián)的 redis實例治拿,在代碼層對key進行hash計算,然后去對應(yīng)的 redis實例操作數(shù)據(jù)见坑。這種方式對hash層代碼要求比較高捏检,考慮部分包括,節(jié)點失效后的替代算法方案熊楼,數(shù)據(jù)震蕩后的自動腳本恢復(fù)能犯,實例的監(jiān)控等等。
Redis集群方案什么情況下會導(dǎo)致整個集群不可用?
有A执泰,B渡蜻,C三個節(jié)點的集群,在沒有復(fù)制模型的情況下排苍,如果節(jié)點B失敗了学密,那么整個集群就會因為缺少5501-11000
這個范圍的槽而不可用淘衙。
假如 Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的腻暮,如果將它們?nèi)空页鰜?
使用keys指令可以掃出指定模式的key列表幔翰。
對方接著追問如果這個 redis正在給線上的業(yè)務(wù)提供服務(wù)漩氨,那使用keys指令會有什么問題?這個時候你要回答 redis關(guān)鍵的一個特性redis的單線程的。keys指令會導(dǎo)致線程阻塞一段時間遗增,線上服務(wù)會停頓叫惊,直到指令執(zhí)行完畢,服務(wù)才能恢復(fù)做修。這個時候可以使用scan指令霍狰,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重復(fù)概率饰及,在客戶端做一次去重就可以了蔗坯,但是整體所花費的時間會比直接用keys指令長。
主從數(shù)據(jù)庫不一致如何解決場景描述宾濒?
對于主從庫,讀寫分離屏箍,如果主從庫更新同步有時差绘梦,就會導(dǎo)致主從庫數(shù)據(jù)的不一致
1、忽略這個數(shù)據(jù)不一致赴魁,在數(shù)據(jù)一致性要求不高的業(yè)務(wù)下卸奉,未必需要時時一致性
2、強制讀主庫颖御,使用一個高可用的主庫榄棵,數(shù)據(jù)庫讀寫都在主庫,添加一個緩存潘拱,提升數(shù)據(jù)讀取的性能疹鳄。
3、選擇性讀主庫芦岂,添加一個緩存瘪弓,用來記錄必須讀主庫的數(shù)據(jù),將哪個庫盔腔,哪個表杠茬,哪個主鍵月褥,作為緩存的key弛随,設(shè)置緩存失效的時間為主從庫同步的時間,如果緩存當(dāng)中有這個數(shù)據(jù)宁赤,直接讀取主庫舀透;如果緩存當(dāng)中沒有這個主鍵,就到對應(yīng)的從庫中讀取决左。
緩存與數(shù)據(jù)庫不一致怎么辦愕够?
假設(shè)采用的主存分離走贪,讀寫分離的數(shù)據(jù)庫,如果一個線程A先刪除緩存數(shù)據(jù)惑芭,然后將數(shù)據(jù)寫入到主庫當(dāng)中坠狡,這個時候,主庫和從庫同步?jīng)]有完成遂跟,線程B從緩存當(dāng)中讀取數(shù)據(jù)失敗逃沿,從從庫當(dāng)中讀取到舊數(shù)據(jù),然后更新至緩存幻锁,這個時候凯亮,緩存當(dāng)中的就是舊的數(shù)據(jù)。
發(fā)生上述不一致的原因在于哄尔,主從庫數(shù)據(jù)不一致問題假消,加入了緩存之后,主從不一致的時間被拉長了岭接;
處理:在從庫有數(shù)據(jù)更新之后富拗,將緩存當(dāng)中的數(shù)據(jù)也同時進行更新,即當(dāng)從庫發(fā)生了數(shù)據(jù)更新之后亿傅,向緩存發(fā)出刪除媒峡,淘汰這段時間寫入的舊數(shù)據(jù)。