柚子快報(bào)激活碼778899分享:緩存 Redis個(gè)人總結(jié)
柚子快報(bào)激活碼778899分享:緩存 Redis個(gè)人總結(jié)
一、概述
1.什么是Redis
Redis是一個(gè)非關(guān)系型數(shù)據(jù)庫(kù),數(shù)據(jù)存儲(chǔ)在內(nèi)存中,因此操作速度非???,通常用來(lái)存儲(chǔ)服務(wù)器的緩存數(shù)據(jù)。
2.為什么要用Redis
傳統(tǒng)數(shù)據(jù)庫(kù)查詢速度因?yàn)橛凶x取磁盤(pán)的瓶頸,因此無(wú)法支持過(guò)大流量的查詢,將數(shù)據(jù)放在內(nèi)存中,就可以避免磁盤(pán)的讀寫(xiě),以支持超大流量的查詢。而Redis就是這么一個(gè)緩存數(shù)據(jù)庫(kù)。
3.Redis怎么樣
Redis是目前最主流的緩存數(shù)據(jù)庫(kù),除了提供緩存數(shù)據(jù)的支持外,還因?yàn)槠鋯尉€程、全局唯一、高速讀寫(xiě)等特性,可以實(shí)現(xiàn)如分布式鎖、布隆過(guò)濾器、計(jì)數(shù)器、消息隊(duì)列等更多實(shí)用功能。
二、Redis的數(shù)據(jù)類(lèi)型
1.Redis支持的數(shù)據(jù)類(lèi)型
1.String
字符串類(lèi)型, 是平常使用最多的類(lèi)型,用來(lái)存儲(chǔ)各種字符串,也可以將整形、浮點(diǎn)型數(shù)據(jù)作為字符串存儲(chǔ),如果是整形或浮點(diǎn)型,還可以在Redis中做簡(jiǎn)單的加減運(yùn)算。
2.Hash
散列類(lèi)型,用來(lái)存儲(chǔ)field-value(鍵值對(duì)) 形式的映射表,相當(dāng)于一次存儲(chǔ)了一個(gè)Map。
3.List
列表類(lèi)型,相當(dāng)于一個(gè)雙向鏈表,可以往兩頭插入數(shù)據(jù)和獲取數(shù)據(jù),可以用來(lái)實(shí)現(xiàn)Redis版的消息隊(duì)列。
4.Set
無(wú)序集合,類(lèi)似于Java中的HashSet,可以往集合中插入數(shù)據(jù),但沒(méi)有順序,同時(shí)具有唯一性。
5.Zset
有序集合,在無(wú)序集合的基礎(chǔ)上增加了一個(gè)下標(biāo),插入數(shù)據(jù)時(shí)同時(shí)插入下標(biāo),使用下標(biāo)進(jìn)行排序。
6.Bitmap
位圖 Bitmap 存儲(chǔ)的是連續(xù)的二進(jìn)制數(shù)字(0 和 1),通過(guò) Bitmap, 只需要一個(gè) bit 位來(lái)表示某個(gè)元素對(duì)應(yīng)的值或者狀態(tài),key 就是對(duì)應(yīng)元素本身 。我們知道 8 個(gè) bit 可以組成一個(gè) byte,所以 Bitmap 本身會(huì)極大的節(jié)省儲(chǔ)存空間。
7.Geospatial
地理位置,主要用于存儲(chǔ)地理位置信息,基于 Sorted Set 實(shí)現(xiàn)。
通過(guò) GEO 我們可以輕松實(shí)現(xiàn)兩個(gè)位置距離的計(jì)算、獲取指定位置附近的元素等功能。
8.HyperLogLog
HyperLogLog 是一種有名的基數(shù)計(jì)數(shù)概率算法 ,基于 LogLog Counting(LLC)優(yōu)化改進(jìn)得來(lái),并不是 Redis 特有的,Redis 只是實(shí)現(xiàn)了這個(gè)算法并提供了一些開(kāi)箱即用的 API。主要用于大數(shù)量的計(jì)數(shù)統(tǒng)計(jì)。
三、持久化方法
1.RDB持久化
RDB持久化是Redis的默認(rèn)持久化功能 SAVE命令 阻塞服務(wù)器,創(chuàng)建RDB文件 BGSAVE命令 啟動(dòng)子進(jìn)程創(chuàng)建RDB文件 RDB持久化是通過(guò)時(shí)間點(diǎn)快照的方式持久化數(shù)據(jù),簡(jiǎn)而言之就是只會(huì)保存執(zhí)行持久化命令時(shí)間點(diǎn)的所有數(shù)據(jù),執(zhí)行命令后創(chuàng)建的數(shù)據(jù)不會(huì)保存到RDB文件中。
2.AOF持久化
與全量式RDB持久化不同,AOF提供的是增量式的持久化功能,這種持久化原理在于,服務(wù)器每次執(zhí)行完寫(xiě)命令后,都會(huì)將以協(xié)議文本的方式將命令記錄到AOF文件的末尾,服務(wù)器停機(jī)后,通過(guò)重新執(zhí)行AOF文件中的命令,恢復(fù)之前的數(shù)據(jù)。 AOF的優(yōu)缺點(diǎn) 1.AOF文件的體積比RDB文件大得多 2.AOF文件做數(shù)據(jù)恢復(fù)比RDB文件慢得多 3.進(jìn)行AOF文件重寫(xiě)會(huì)占用大量資源,導(dǎo)致服務(wù)器短暫阻塞
3.RDB-AOF混合持久化
Redis4.0之后引入RDB-AOF混合持久化, 將aof-use-rdb-preamble選項(xiàng)設(shè)置成yes后 Redis執(zhí)行AOF重寫(xiě)操作時(shí),首先會(huì)將當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)按RDB持久化方式將數(shù)據(jù)寫(xiě)入AOF文件中,至于持久化開(kāi)始后的數(shù)據(jù),則以AOF持久化的方式,將命令追加到AOF文件末尾。 換句話說(shuō),服務(wù)器生成的AOF文件將由兩部分組成,開(kāi)頭是RDB文件格式,結(jié)尾是AOF格式的數(shù)據(jù)。
四、緩存擊穿、雪崩等場(chǎng)景分析
1.緩存穿透
當(dāng)大量并發(fā)請(qǐng)求去查詢一個(gè)Redis不存在,且數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù)時(shí),大量請(qǐng)求透過(guò)了Redis直接訪問(wèn)數(shù)據(jù)庫(kù),導(dǎo)致服務(wù)器宕機(jī)。
解決方案: 查詢到空數(shù)據(jù)時(shí),依然將空數(shù)據(jù)保存到Redis中,保證請(qǐng)求不會(huì)直接到達(dá)數(shù)據(jù)庫(kù)。當(dāng)該數(shù)據(jù)新增時(shí),刪除Redis空數(shù)據(jù)。保證讀取Redis不發(fā)生臟讀現(xiàn)象。
2.緩存擊穿
當(dāng)緩存數(shù)據(jù)有過(guò)期時(shí)間時(shí),如果過(guò)期時(shí)間剛過(guò),此時(shí)有大量并發(fā)請(qǐng)求進(jìn)來(lái)查詢這個(gè)數(shù)據(jù)時(shí),雖然查完數(shù)據(jù)庫(kù)后會(huì)更新緩存,但依舊會(huì)有大量請(qǐng)求去查詢數(shù)據(jù)庫(kù)。此時(shí)可能因并發(fā)過(guò)高導(dǎo)致服務(wù)器宕機(jī)
解決方案: 可以通過(guò)分布式鎖,發(fā)現(xiàn)數(shù)據(jù)不在Redis,去查詢數(shù)據(jù)庫(kù)時(shí)加上分布式鎖,保證只有一個(gè)請(qǐng)求去查詢數(shù)據(jù)庫(kù)。未獲取到鎖則重試Redis獲取數(shù)據(jù)。大幅降低了數(shù)據(jù)庫(kù)層的壓力。
3.緩存雪崩
大量緩存數(shù)據(jù)設(shè)置了相同的過(guò)期時(shí)間,導(dǎo)致數(shù)據(jù)同時(shí)過(guò)期時(shí),數(shù)據(jù)庫(kù)請(qǐng)求激增,導(dǎo)致服務(wù)器宕機(jī)。
解決方案: 避免大量緩存數(shù)據(jù)使用相同的過(guò)期時(shí)間,通過(guò)使用隨機(jī)數(shù)的方式,保證數(shù)據(jù)不在同一時(shí)間點(diǎn)失效。
4.緩存預(yù)熱
提前將熱點(diǎn)數(shù)據(jù)加載到Redis,降低數(shù)據(jù)庫(kù)的壓力,注意不要使用相同的過(guò)期時(shí)間,防止緩存雪崩。
五、Redis 內(nèi)存淘汰策略
Redis內(nèi)存淘汰策略是在Redis內(nèi)存使用達(dá)到限制時(shí),為了釋放內(nèi)存空間而采取的一系列策略。 Redis 提供 8 種數(shù)據(jù)淘汰策略
1.noeviction(默認(rèn)策略)
Redis默認(rèn)不會(huì)淘汰數(shù)據(jù),當(dāng)內(nèi)存使用達(dá)到限制時(shí),新的寫(xiě)入操作會(huì)報(bào)錯(cuò)。
2.volatile-lru(最近最少使用)
從設(shè)置了過(guò)期時(shí)間的鍵中,使用 LRU(Least Recently Used,最近最少使用)算法淘汰數(shù)據(jù)。
3.volatile-ttl
從設(shè)置了過(guò)期時(shí)間的鍵中,優(yōu)先淘汰剩余生存時(shí)間(TTL,Time To Live)較短的鍵。
4.volatile-random:
從設(shè)置了過(guò)期時(shí)間的鍵中,隨機(jī)淘汰數(shù)據(jù)。
5.volatile-lfu:
從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中挑選最不經(jīng)常使用的數(shù)據(jù)淘汰。
6.allkeys-lru:
從所有鍵中,使用 LRU(Least Recently Used,最近最少使用)算法淘汰數(shù)據(jù)。
7.allkeys-random:
從所有鍵中,隨機(jī)淘汰數(shù)據(jù)
8.allkeys-lfu:
從所有鍵中,移除最不經(jīng)常使用的 key。
柚子快報(bào)激活碼778899分享:緩存 Redis個(gè)人總結(jié)
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。