前言:我國(guó)Java開(kāi)發(fā)已進(jìn)入極度內(nèi)卷病游,Redis成為國(guó)服卷法大師
1.redis為什么快?
數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單高效
純內(nèi)存操作
非阻塞I/O多路復(fù)用(*關(guān)鍵點(diǎn))
單線程操作(避免了頻繁的上下文切換)
2.數(shù)據(jù)結(jié)構(gòu)
1)String: 字符串
2)Hash: 類(lèi)似于map稠通、可以放對(duì)象
3)List:linkedlist格式 支持重復(fù)的元素
4)Set:不允許重復(fù)且無(wú)序
5)Sortedset:不允許重復(fù)衬衬,且元素有順序
簡(jiǎn)單動(dòng)態(tài)字符串
Redis實(shí)現(xiàn)了簡(jiǎn)單動(dòng)態(tài)字符串(simple dynamic string,SDS)采记,string類(lèi)型是由SDS實(shí)現(xiàn)的
優(yōu)點(diǎn):
1佣耐、因?yàn)榇鎯?chǔ)了len政勃,使得len()的速度提升O(n) -> O(1)
2唧龄、因?yàn)榇鎯?chǔ)了len,可以動(dòng)態(tài)分配不同的內(nèi)存空間大小奸远,節(jié)省資源
跳躍表
暫未了解
3.內(nèi)存設(shè)計(jì)
過(guò)期清除策略
-
定期刪除:redis默認(rèn)每隔100ms既棺,隨機(jī)抽取檢查key是否過(guò)期,過(guò)期則刪除懒叛。
(如果只采用定期刪除策略丸冕,會(huì)導(dǎo)致很多key到時(shí)間沒(méi)有刪除)
惰性刪除:get某個(gè)key時(shí)會(huì)檢查一下是否過(guò)期,過(guò)期則刪除薛窥。
采用 “定期刪除+惰性刪除” 有缺陷胖烛,定期刪除沒(méi)刪除key + 沒(méi)有請(qǐng)求key(惰性刪除不生效),會(huì)導(dǎo)致redis的內(nèi)存會(huì)越來(lái)越高诅迷,那么就應(yīng)該采用內(nèi)存淘汰機(jī)制
內(nèi)存淘汰機(jī)制
在redis.conf中有一行配置:maxmemory-policy volatile-lru佩番,代表使用volatile-lru算法
1)noeviction:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),新寫(xiě)入操作會(huì)報(bào)錯(cuò)罢杉。應(yīng)該沒(méi)人用吧趟畏。
2)allkeys-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中滩租,移除最近最少使用的key赋秀。推薦使用,大部分情況適用律想。
3)allkeys-random:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí)猎莲,在鍵空間中,隨機(jī)移除某個(gè)key技即。
4)volatile-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí)益眉,在設(shè)置了過(guò)期時(shí)間的鍵空間中,移除最近最少使用的key。一般是把redis當(dāng)永久存儲(chǔ)的時(shí)候才用郭脂,因?yàn)椴粫?huì)刪除永久存儲(chǔ)的key年碘。不推薦
5)volatile-random:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中展鸡,隨機(jī)移除某個(gè)key屿衅。依然不推薦
6)volatile-ttl:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中莹弊,快過(guò)期的key優(yōu)先移除涤久。不推薦
常用算法:
allkeys-lru:對(duì)緩存的訪問(wèn)符合正態(tài)分布(存在相對(duì)熱點(diǎn)數(shù)據(jù)),或不清楚應(yīng)用的緩存訪問(wèn)分布忍弛,可以使用
allkeys-random:如果對(duì)于緩存key的訪問(wèn)概率相等响迂,可以使用
volatile-ttl:這種策略使得我們可以向Redis提示哪些key更適合被移除
內(nèi)存碎片
4.架構(gòu)設(shè)計(jì)
集群模式
redis單點(diǎn)、redis主從细疚、redis哨兵sentinel蔗彤,redis集群cluster