redis集群key分類
redis集群中的key統(tǒng)分為兩類,分別是設(shè)置了過期時(shí)間的key和未設(shè)置過期時(shí)間的key剥险。其中過期策略只涉及設(shè)置了過期時(shí)間的key谷徙,淘汰策略涉及了兩者撼班。
1. 過期策略
過期策略只對(duì)設(shè)置了過期時(shí)間的key生效灵汪。
過期策略可以分為兩種蔗候,主動(dòng)過期和被動(dòng)過期怒允。
1.1 主動(dòng)過期
redis追求的是高效率,所以不能做到精準(zhǔn)過期锈遥,因?yàn)榫珳?zhǔn)過期涉及到大量狀態(tài)的存儲(chǔ)和監(jiān)聽纫事,勢(shì)必會(huì)帶來性能損耗,所以redis提出了一種近似過期策略:
redis將所有設(shè)置了過期時(shí)間的key放入一個(gè)字典中所灸,然后隔段時(shí)間(1秒10次)去字典中隨機(jī)挑選20個(gè)key丽惶,查看是否過期,如果過期的比例超過了25%爬立,那么就認(rèn)為當(dāng)前字典中需要被過期key十分稠密钾唬,就會(huì)循環(huán)以上操作,直到降到25%以下侠驯。每一次循環(huán)操作有耗時(shí)上限抡秆,25ms,避免一次循環(huán)阻塞redis過長(zhǎng)時(shí)間陵霉。
如果某一時(shí)刻出現(xiàn)了大量的key過期琅轧,就會(huì)導(dǎo)致redis出現(xiàn)明顯的卡頓,并且在slow log中無法發(fā)現(xiàn)慢查詢踊挠,因?yàn)槁樵冎傅氖遣樵冞^程乍桂,并不包含等待過程。
為了避免以上問題,應(yīng)該對(duì)同一批key的過期時(shí)間在一定的基礎(chǔ)上進(jìn)行隨機(jī)化,比如
redis.setExpireTime(key, baseExpireTime+randomTime)
1.2 被動(dòng)過期
以上的近似過期策略無法做到精準(zhǔn)過期畔况,所以redis還增加了被動(dòng)過期,當(dāng)redis client訪問key時(shí)憋沿,redis server會(huì)檢查此key是否過期,如果過期了刪除該key并返回nil沪猴,反之返回對(duì)應(yīng)的key辐啄。
2. 淘汰策略
當(dāng)內(nèi)存超過了maxmemory時(shí),會(huì)對(duì)key進(jìn)行淘汰运嗜。
淘汰的對(duì)象分為兩類壶辜,分別是allkeys(設(shè)置了過期時(shí)間+未設(shè)置過期時(shí)間的key,也就是全部key)和volatile(設(shè)置了過期時(shí)間的key)担租。
每類都有幾種不同的策略(maxmemory-policy),LRU岭参、random和TTL演侯。因?yàn)閞edis的性能要求姿染,也不會(huì)實(shí)現(xiàn)嚴(yán)格的淘汰策略隘梨,而是實(shí)現(xiàn)了近似的淘汰策略轴猎。
近似的淘汰策略依賴于redis對(duì)每個(gè)key增加的一個(gè)時(shí)間戳域锐峭,這個(gè)域記錄了key被訪問過的最新時(shí)期。
根據(jù)maxmemory-policy確定要被淘汰key的總集合椎扬,在總集合中隨機(jī)選出大小為5的子集,根據(jù)時(shí)間戳域揖铜,對(duì)子集中最晚被訪問過的key進(jìn)行淘汰,直至內(nèi)存容量小于maxmemory為止龄寞。