緣由
Redis 是互聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)中不可缺少的常備武器,它性能高、數(shù)據(jù)結(jié)構(gòu)豐富、簡(jiǎn)單易用,但同時(shí)也是因?yàn)樘菀子昧耍_(kāi)發(fā)同學(xué)不管什么數(shù)據(jù)、不管這數(shù)據(jù)有多大、不管數(shù)據(jù)有多少,通通塞進(jìn)去,最后導(dǎo)致的問(wèn)題就是 Redis 內(nèi)存使用持續(xù)上升,但是又不知道里面的數(shù)據(jù)是不是有用,是否可以拆分和清理。
為了更好地使用 Redis,除了對(duì) Redis 做一些使用規(guī)范,還需要對(duì)線上使用的 Redis 有充分的了解。
那么問(wèn)題來(lái)了:
- 一個(gè) Redis 的實(shí)例用了那么大的內(nèi)存,里邊到底存了啥?
- 都有哪些 key?
- 每個(gè) key 占用了多少空間?
思路
一、 先通過(guò) keys * 命令,拿到所有的 key,然后根據(jù) key 再獲取所有的內(nèi)容。
- 優(yōu)點(diǎn):可以不使用 Redis 機(jī)器的硬盤(pán),直接網(wǎng)絡(luò)傳輸。
- 缺點(diǎn):如果 key 數(shù)量特別多,keys 命令可能會(huì)導(dǎo)致 Redis 卡住影響業(yè)務(wù);需要對(duì) Redis 請(qǐng)求非常多次,資源消耗多;遍歷數(shù)據(jù)太慢。
二、開(kāi)啟 aof,通過(guò) aof 文件獲取到所有數(shù)據(jù)。
- 優(yōu)點(diǎn):無(wú)需影響 Redis 服務(wù),完全離線操作,足夠安全。
- 缺點(diǎn):有一些 Redis 實(shí)例寫(xiě)入頻繁,不適合開(kāi)啟 aof,普適性不強(qiáng);aof 文件有可能特別大,傳輸、解析起來(lái)太慢,效率低。
三、使用 bgsave,獲取 rdb 文件,解析后獲取數(shù)據(jù)。
- 優(yōu)點(diǎn):機(jī)制成熟,可靠性好;文件相對(duì)小,傳輸、解析效率高。
- 缺點(diǎn):bgsave 雖然會(huì) fork 子進(jìn)程,但還是有可能導(dǎo)致主進(jìn)程卡住一段時(shí)間,對(duì)業(yè)務(wù)有產(chǎn)生影響的風(fēng)險(xiǎn)。
評(píng)估后,決定采用低峰期在從節(jié)點(diǎn)做 bgsave 獲取 rdb 文件,相對(duì)安全可靠,也可以覆蓋所有業(yè)務(wù)的 Redis 集群。也就是說(shuō)每個(gè)實(shí)例每天在低峰期自動(dòng)生成一個(gè) rdb 文件,即使報(bào)表數(shù)據(jù)有一天的延遲也是可以接受的。
拿到了 rdb 文件就相當(dāng)于拿到了 Redis 實(shí)例的所有數(shù)據(jù),接下來(lái)就是生成報(bào)表的過(guò)程了:
- 解析 rdb 文件,獲取到 Key 和 Value 的內(nèi)容;
- 根據(jù)相對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)及內(nèi)容,估算內(nèi)存消耗等;
- 統(tǒng)計(jì)并生成報(bào)表;
Redis 實(shí)例 -> rdb 文件 -> 解析 rdb -> 估算內(nèi)存消耗 -> 統(tǒng)計(jì)計(jì)數(shù) -> 報(bào)表數(shù)據(jù)
參考地址
聯(lián)想
1、制定開(kāi)發(fā)團(tuán)隊(duì)的Redis Key使用規(guī)范,通過(guò)Key可以獲得到:
- 屬于什么域名(加域名標(biāo)示);
- 屬于什么數(shù)據(jù)類型(加數(shù)據(jù)類型標(biāo)識(shí));
- 是否設(shè)置過(guò)期時(shí)間;
- ...
2、統(tǒng)一平臺(tái)進(jìn)行redis key的申請(qǐng),只有申請(qǐng)了才能進(jìn)行使用。
- 申請(qǐng)人;
- 申請(qǐng)時(shí)間;
- ...