以下案例摘自2018年下半年軟件職業(yè)考試,并由此展開redis相關(guān)知識,持續(xù)更新中
【背景說明】
某企業(yè)是為城市高端用戶提供高品質(zhì)蔬菜生鮮服務(wù)的初創(chuàng)企業(yè)怜械,創(chuàng)業(yè)初期為快速開展業(yè)務(wù)缕允,該企業(yè)采用輕量型的開發(fā)架構(gòu)(腳本語言+關(guān)系型數(shù)據(jù)庫)研制了一套業(yè)務(wù)系統(tǒng)障本。業(yè)務(wù)開展后受到用戶普遍歡迎响鹃,用戶數(shù)和業(yè)務(wù)數(shù)量迅速增長买置,原有的數(shù)據(jù)庫服務(wù)器已不能滿足高度并發(fā)的業(yè)務(wù)要求。為此蓉冈,該企業(yè)成立了專門的研發(fā)團(tuán)隊(duì)來解決該問題寞酿。
張工建議重新開發(fā)整個(gè)系統(tǒng)怕膛, 采用新的服務(wù)器和數(shù)據(jù)架構(gòu)褐捻,解決當(dāng)前問題的同時(shí)為日后的擴(kuò)展提供支持柠逞。但是,李工認(rèn)為張工的方案開發(fā)周期過長逗鸣,投入過大撒璧,當(dāng)前應(yīng)該在改動(dòng)盡量小的前提下解決該問題卿樱。李工認(rèn)為訪問量很大的只是部分?jǐn)?shù)據(jù),建議采用緩存工具M(jìn)emCache來減輕數(shù)據(jù)庫服務(wù)器的壓力萨蚕,這樣開發(fā)量小岳遥,開發(fā)周期短浩蓉,比較適合初創(chuàng)公司帮坚,同時(shí)將來也可以通過集群進(jìn)行擴(kuò)展试和。然而阅悍,劉工又認(rèn)為李工的方案中存在數(shù)據(jù)可靠性和一致性問題节视,在宕機(jī)時(shí)容易丟失交易數(shù)據(jù),建議采用Redis來解決問題霍掺。在經(jīng)過充分討論杆烁,該公司最終決定采用劉工的方案兔魂。
1.分布式數(shù)據(jù)庫緩存的基本概念
在李工和劉工的方案中举娩,均采用分布式數(shù)據(jù)庫緩存技術(shù)來解決問題。請說明分布式數(shù)據(jù)庫緩存的基本概念遂唧。
答:所謂的分布式數(shù)據(jù)庫緩存就是將不同的數(shù)據(jù)放在不同的緩存服務(wù)器上蠢箩,獲取數(shù)據(jù)時(shí)需要根據(jù)路由從不同的服務(wù)器上獲取。
2.表 MemCache與Redis能力比較
Memcache | Redis | |
---|---|---|
網(wǎng)絡(luò)IO模型 | 多線程逻谦,非阻塞IO復(fù)用的網(wǎng)絡(luò)模型 | redis使用單線程的IO復(fù)用模型 |
數(shù)據(jù)類型 | 簡單key/value | Redis 有 5 種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) |
持久性 | 不支持 | 支持 |
分布式存儲(chǔ) | 支持 | 多種方式邦马,主從滋将,Sentinel随闽、Cluster等 |
多線程支持 | 支持 | 不支持 |
內(nèi)存管理 | Memcached默認(rèn)使用Slab Allocation機(jī)制管理內(nèi)存 | Redis通過定義一個(gè)數(shù)組來記錄所有的內(nèi)存分配情況 |
事務(wù)支持 | 無 | 有限支持 |
3.說明數(shù)據(jù)可靠性和不一致問題產(chǎn)生等原因
劉工認(rèn)為李工的方案存在數(shù)據(jù)可靠性和一致性的問題掘宪,請說明原因魏滚。
4.簡述數(shù)據(jù)同步方案
為避免數(shù)據(jù)可靠性和一致性的問題鼠次,劉工的方案采用Redis作為數(shù)據(jù)庫緩存芋齿,請說明基本的Redis與原有關(guān)系數(shù)據(jù)庫的數(shù)據(jù)同步方案沟突。
5.簡述Redis分布式存儲(chǔ)的2種常見方案
- codis
6.簡述Redis集群切片的幾種常見方式惠拭。
Redis Sentinal著眼于高可用,在master宕機(jī)時(shí)會(huì)自動(dòng)將slave提升為master聂示,繼續(xù)提供服務(wù)鱼喉。
Redis Cluster著眼于擴(kuò)展性趋观,在單個(gè)redis內(nèi)存不足時(shí)编曼,使用Cluster進(jìn)行分片存儲(chǔ)剩辟。
Codis 將所有的 key 默認(rèn)劃分為 1024 個(gè)槽位(slot)熊户,它首先對客戶端傳過來的 key 進(jìn)行 crc32 運(yùn)算計(jì)算哈希值嚷堡,再將 hash 后的整數(shù)值對 1024 這個(gè)整數(shù)進(jìn)行取模得到一個(gè)余數(shù)麦到,這個(gè)余數(shù)就是對應(yīng) key 的槽位瓶颠。
每個(gè)槽位都會(huì)唯一映射到后面的多個(gè) Redis 實(shí)例之一粹淋,Codis 會(huì)在內(nèi)存維護(hù)槽位和 Redis 實(shí)例的映射關(guān)系桃移。這樣有了上面 key 對應(yīng)的槽位借杰,那么它應(yīng)該轉(zhuǎn)發(fā)到哪個(gè) Redis 實(shí)例就很明確了蔗衡。
hash = crc32(command.key)
slot_index = hash % 1024
redis = slots[slot_index].redis
redis.do(command)
槽位數(shù)量默認(rèn)是1024逼纸,它是可以配置的杰刽,如果集群節(jié)點(diǎn)比較多贺嫂,建議將這個(gè)數(shù)值配置大一些,比如2048、4096寞射。
附加 1.redis 有哪些數(shù)據(jù)淘汰機(jī)制桥温?
Redis提供了下面幾種淘汰策略供用戶選擇,其中默認(rèn)的策略為noeviction策略:
noeviction:禁止驅(qū)逐數(shù)據(jù)掏觉。當(dāng)內(nèi)存使用達(dá)到閾值的時(shí)候澳腹,所有引起申請內(nèi)存的命令會(huì)報(bào)錯(cuò)。(注意是寫請求返回錯(cuò)誤羊娃,讀請求可以正常執(zhí)行)
allkeys-lru:在主鍵空間中邮利,優(yōu)先移除最近未使用的key。
volatile-lru:在設(shè)置了過期時(shí)間的鍵空間中祷愉,優(yōu)先移除最近未使用的key。
allkeys-random:在主鍵空間中订讼,隨機(jī)移除某個(gè)key。
volatile-random:在設(shè)置了過期時(shí)間的鍵空間中脖苏,隨機(jī)移除某個(gè)key。
volatile-ttl:在設(shè)置了過期時(shí)間的鍵空間中亦歉,具有更早過期時(shí)間的key優(yōu)先移除。