前言
準(zhǔn)備開(kāi)一個(gè)新的系列,總結(jié)一些面試?yán)锎蹬Fさ牡胤奖惺簧婕疤嗉?xì)節(jié)廉沮,但是方方面面的都吹會(huì)起來(lái)。
這篇文章主要寫Redis的方方面面徐矩。
基礎(chǔ)結(jié)構(gòu)
1.String會(huì)預(yù)分配空間滞时,就像java的ArrayList,1MB以下每次擴(kuò)容空間翻倍滤灯,1MB以上每次加1MB坪稽,最大512MB
2.List在列表元素少時(shí),使用ZipList(雙向指針鳞骤,空間連續(xù)性窒百,掃描磁盤更快)
3.Hash對(duì)象在擴(kuò)容的時(shí)候,會(huì)創(chuàng)建一個(gè)新Hash對(duì)象豫尽,使用漸進(jìn)式復(fù)制篙梢,用到哪個(gè)字段了再把這個(gè)字段的值賦值到新對(duì)象
4.Zset使用跳表來(lái)做排序
復(fù)合結(jié)構(gòu)
1.位圖結(jié)構(gòu),位圖最小的單位是bit拂募,每個(gè)bit是由0或1構(gòu)成
2.GeoHash結(jié)構(gòu)(坐標(biāo))庭猩,用Zset實(shí)現(xiàn),Score用經(jīng)緯度+base32
3.HyperLogLog去重記數(shù)陈症,有誤差1%蔼水,12KB的大小,例如:記錄某個(gè)頁(yè)面有多少人訪問(wèn)過(guò)(會(huì)重復(fù)訪問(wèn))
4.BloomFilter(布隆過(guò)濾器)录肯,用位數(shù)組(二進(jìn)制)實(shí)現(xiàn)趴腋,判斷某個(gè)值一定存在或一定不存在,一個(gè)key對(duì)應(yīng)幾位论咏,只要幾位都是1就是存在
Redis附加功能
1.Pipeline优炬,把多條消息捏在一起發(fā)送給Redis服務(wù)器,客戶端提供的功能
2.scan厅贪、hscan蠢护、sscan可以對(duì)String、Hash养涮、Set進(jìn)行分頁(yè)模糊匹配
3.Redis漏油桶機(jī)制葵硕,Redis Cell
4.分布式鎖,setnx(存在就設(shè)置返回1贯吓,否則返回0)懈凹,返回1代表坑位被占領(lǐng)了,拿到鎖
5.消息隊(duì)列
- 用List結(jié)構(gòu)悄谐,實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)消費(fèi)者
- 發(fā)布訂閱模式subscribe訂閱介评,publish推送,psubscribe模糊訂閱
沒(méi)有Ack確認(rèn)機(jī)制
消息沒(méi)辦法持久化爬舰,如果Redis宕機(jī)了们陆,消息就找不回來(lái)了
Redis吹牛PLUS
1.Redis緩存穿透寒瓦、雪崩棒掠、擊穿(這個(gè)自己百度啦,都說(shuō)爛了)
2.Redis有自己的通訊協(xié)議颈墅,RESP(Redis Serialization Protocol)
3.Redisserver默認(rèn)有16個(gè)數(shù)據(jù)庫(kù)雾袱,每一個(gè)數(shù)據(jù)庫(kù)下有兩個(gè)數(shù)組,dict數(shù)組保存鍵的值毒坛,expires數(shù)組保存鍵的過(guò)期時(shí)間
4.Redis多線程林说,Redis6.0之后支持多線程,Redis主線程是單線程的豪直,但是IO是多線程的,會(huì)維護(hù)一個(gè)指令隊(duì)列弓乙,先到先服務(wù)
5.過(guò)期鍵
- 清理過(guò)期鍵的方式:定時(shí)清理暇韧,惰性清理(用的時(shí)候才會(huì)判斷是否過(guò)期)浓瞪,定期清理(結(jié)合前兩種,一次清理一定量的key)
- 過(guò)期鍵不會(huì)寫入RDB文件和AOF文件涂乌。過(guò)期鍵被刪除時(shí)钮孵,會(huì)追加一條DEL命令到AOF文件
- 主服務(wù)器里刪除過(guò)期鍵眼滤,會(huì)給每個(gè)節(jié)點(diǎn)發(fā)送一個(gè)DEL指令。從服務(wù)器刪除過(guò)期鍵漾唉,等主服務(wù)器發(fā)DEL指令。