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