一、什么是Redis
Redis 本質(zhì)上是一個(gè) Key-Value 類型的內(nèi)存數(shù)據(jù)庫(kù),很像 memcached,整個(gè) 數(shù)據(jù)庫(kù)統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作,定期通過(guò)異步操作把數(shù)據(jù)庫(kù)數(shù)據(jù) flush 到硬盤 上進(jìn)行保存。因?yàn)槭羌儍?nèi)存操作,Redis 的性能非常出色,每秒可以處理超過(guò) 10 萬(wàn)次讀寫(xiě)操作,是已知性能最快的 Key-Value DB。
Redis 的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單 個(gè) value 的最大限制是1GB,不像 memcached 只能保存 1MB 的數(shù)據(jù),另外 Redis 也可以對(duì)存入的 Key-Value 設(shè)置 expire 時(shí)間。
Redis 的主要缺點(diǎn)是數(shù)據(jù)庫(kù)容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫(xiě),因此 Redis 適合的場(chǎng)景主要
局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上。
二、Redis的數(shù)據(jù)類型
Redis 的數(shù)據(jù)結(jié)構(gòu)有五種,分別是:
String——字符串
String 數(shù)據(jù)結(jié)構(gòu)是簡(jiǎn)單的 key-value 類型,value 不僅可以是 String,也可以是數(shù)字(當(dāng)數(shù)字類型用 Long 可以表示的時(shí)候 encoding 就是整型,其他都存儲(chǔ)在 sdshdr 當(dāng)做字符串)。
Hash——字典
在 Memcached 中,我們經(jīng)常將一些結(jié)構(gòu)化的信息打包成 hashmap,在客戶端序列化后存儲(chǔ)為一個(gè)字符串的值(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等。
List——列表
List 說(shuō)白了就是鏈表(redis 使用雙端鏈表實(shí)現(xiàn)的 List),相信學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)知識(shí)的人都應(yīng)該能理解其結(jié)構(gòu)。
Set——集合
Set 就是一個(gè)集合,集合的概念就是一堆不重復(fù)值的組合。利用 Redis 提供的 Set 數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)一些集合性的數(shù)據(jù)。
Sorted Set——有序集合
和 Sets 相比,Sorted Sets 是將 Set 中的元素增加了一個(gè)權(quán)重參數(shù) score,使得集合中的元素能夠按 score 進(jìn)行有序排列,比如一個(gè)游戲的用戶得分排行榜。
注意: 這里的Sorted Set有爭(zhēng)議,也有人說(shuō)是zset,但總的來(lái)說(shuō)原理是一樣的只是在叫法上有些不一樣,也有可能是隨著redis的更新所導(dǎo)致的名稱的變換,有懂的人可以評(píng)論區(qū)留言交流一下。
2.1 Redis的使用場(chǎng)景
Redis(REmote DIctionary Server)是一個(gè)基于內(nèi)存的高性能鍵值存儲(chǔ)系統(tǒng)。由于其快速、可靠和靈活的特性,Redis 在各種場(chǎng)景下被廣泛應(yīng)用,包括以下幾個(gè)常見(jiàn)的使用場(chǎng)景:
-
緩存(Caching):Redis 作為內(nèi)存數(shù)據(jù)庫(kù),對(duì)于經(jīng)常訪問(wèn)的數(shù)據(jù)進(jìn)行緩存是它最常見(jiàn)的用途之一。通過(guò)將計(jì)算結(jié)果、數(shù)據(jù)庫(kù)查詢結(jié)果或經(jīng)常使用的數(shù)據(jù)存儲(chǔ)在 Redis 中,可以大大提高系統(tǒng)響應(yīng)速度和吞吐量。Redis 提供了靈活的緩存策略和過(guò)期時(shí)間設(shè)置,以滿足不同緩存需求。
-
分布式鎖(Distributed Locking):Redis 提供了一種簡(jiǎn)單高效的方法來(lái)實(shí)現(xiàn)分布式鎖。通過(guò)使用 Redis 的原子操作,比如 SETNX(set if not exist)命令,可以實(shí)現(xiàn)多個(gè)分布式節(jié)點(diǎn)之間的互斥訪問(wèn),確保某個(gè)任務(wù)只能由一個(gè)節(jié)點(diǎn)處理。
-
會(huì)話存儲(chǔ)(Session Storage):在分布式環(huán)境中,使用 Redis 儲(chǔ)存和管理用戶會(huì)話數(shù)據(jù)可以實(shí)現(xiàn)無(wú)狀態(tài)應(yīng)用。將用戶的登錄狀態(tài)或其他會(huì)話數(shù)據(jù)存儲(chǔ)在 Redis 中,使得不同節(jié)點(diǎn)之間可以共享會(huì)話狀態(tài),提高了系統(tǒng)的可伸縮性和容錯(cuò)性。
-
消息隊(duì)列(Message Queue):Redis 的 Pub/Sub(發(fā)布/訂閱)功能可以用作輕量級(jí)的消息隊(duì)列系統(tǒng)。通過(guò)發(fā)布者將消息發(fā)送到指定的頻道,訂閱者可以實(shí)時(shí)獲取到消息并進(jìn)行處理。這種方式可用于實(shí)現(xiàn)異步消息傳遞、任務(wù)分發(fā)和事件驅(qū)動(dòng)等應(yīng)用。
-
計(jì)數(shù)器和統(tǒng)計(jì)信息(Counters & Statistics):Redis 提供了一些特殊的數(shù)據(jù)類型(如計(jì)數(shù)器和有序集合),可用于存儲(chǔ)和操作計(jì)數(shù)器、計(jì)量數(shù)據(jù)和統(tǒng)計(jì)信息。它支持原子操作,可以快速地對(duì)計(jì)數(shù)器進(jìn)行增減操作,并提供了方便的集合操作(如按范圍獲取數(shù)據(jù)、按權(quán)重排序)。
-
實(shí)時(shí)排行榜(Leaderboard):Redis 的有序集合數(shù)據(jù)類型可以用于創(chuàng)建實(shí)時(shí)排行榜。通過(guò)將用戶的分?jǐn)?shù)和標(biāo)識(shí)存儲(chǔ)在有序集合中,可以方便地進(jìn)行排名、范圍查詢和 Top N 查詢等操作,用于實(shí)現(xiàn)游戲排行榜、熱門內(nèi)容排名等功能。
除了以上場(chǎng)景,Redis 還可以用于實(shí)現(xiàn)分布式緩存、實(shí)時(shí)數(shù)據(jù)分析、時(shí)間序列數(shù)據(jù)存儲(chǔ)等各種應(yīng)用。由于 Redis 的高性能和豐富的功能,可以根據(jù)具體需求靈活地在各種場(chǎng)景下使用。
2.2 Redis的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
a) 性能極高 – Redis 能支持超過(guò) 100K+ 每秒的讀寫(xiě)頻率。
b) 豐富的數(shù)據(jù)類型 – Redis 支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
c) 原子 – Redis 的所有操作都是原子性的,同時(shí) Redis 還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行。
attention 原子性定義:例如,A 想要從自己的帳戶中轉(zhuǎn) 1000 塊錢到 B 的帳戶里。那個(gè)從 A 開(kāi)始轉(zhuǎn)帳,到轉(zhuǎn)帳結(jié)束的這一個(gè)過(guò)程,稱之為一個(gè)事務(wù)。如果在 A 的帳戶已經(jīng)減去了 1000 塊錢的時(shí)候,忽然發(fā)生了意外,比如停電什么的,導(dǎo)致轉(zhuǎn)帳事務(wù)意外終止了,而此時(shí) B 的帳戶里還沒(méi)有增加 1000 塊錢。那么,我們稱這個(gè)操作失敗了,要進(jìn)行回滾。回滾就是回到事務(wù)開(kāi)始之前的狀態(tài),也就是回到 A 的帳戶還沒(méi)減 1000 塊的狀態(tài),B 的帳戶的原來(lái)的狀態(tài)。此時(shí)A 的帳戶仍然有 3000 塊,B 的帳戶仍然有 2000 塊。我們把這種要么一起成功(A 帳戶成功減少 1000,同時(shí) B 帳戶成功增加 1000),要么一起失?。ˋ 帳戶回到原來(lái)狀態(tài),B 帳戶也回到原來(lái)狀態(tài))的操作叫原子性操作。如果把一個(gè)事務(wù)可看作是一個(gè)程序,它要么完整的被執(zhí)行,要么完全不執(zhí)行,這種特性就叫原子性。
d)豐富的特性 – Redis 還支持 publish/subscribe, 通知, key 過(guò)期等等特性。
缺點(diǎn):
a)由于是內(nèi)存數(shù)據(jù)庫(kù),所以,單臺(tái)機(jī)器,存儲(chǔ)的數(shù)據(jù)量,跟機(jī)器本身的內(nèi)存大小。雖然 redis 本身有 key 過(guò)期策略,但是還是需要提前預(yù)估和節(jié)約內(nèi)存。如果內(nèi)存增長(zhǎng)過(guò)快,需要定期刪除數(shù)據(jù)。
b) 如果進(jìn)行完整重同步,由于需要生成 rdb 文件,并進(jìn)行傳輸,會(huì)占用主機(jī)的 CPU,并會(huì)消耗現(xiàn)網(wǎng)的帶寬。不過(guò) redis2.8 版本,已經(jīng)有部分重同步的功能,但是還是有可能有完整重同步的。比如,新上線的備機(jī)。
c) 修改配置文件,進(jìn)行重啟,將硬盤中的數(shù)據(jù)加載進(jìn)內(nèi)存,時(shí)間比較久。在這個(gè)過(guò)程中,redis 不能
提供服務(wù)。
三、Redis常見(jiàn)的問(wèn)題有哪些如何解決?
3.1 Redis 常見(jiàn)的性能問(wèn)題都有哪些?如何解決?
(1)、Master 寫(xiě)內(nèi)存快照,save 命令調(diào)度 rdbSave 函數(shù),會(huì)阻塞主線程的工作,當(dāng)快照比較大時(shí)對(duì)性能影響是非常大的,會(huì)間斷性暫停服務(wù),所以 Master 最好不要寫(xiě)內(nèi)存快照。
(2)、Master AOF 持久化,如果不重寫(xiě) AOF 文件,這個(gè)持久化方式對(duì)性能的影響是最小的,但是 AOF 文件會(huì)不斷增大,AOF 文件過(guò)大會(huì)影響 Master 重啟的恢復(fù)速度。Master 最好不要做任何持久化工作,包括內(nèi)存快照和 AOF日志文件,特別是不要啟用內(nèi)存快照做持久化,如果數(shù)據(jù)比較關(guān)鍵,某個(gè) Slave 開(kāi)啟 AOF 備份數(shù)據(jù),策略為每秒同步一次。
(3)、Master 調(diào)用 BGREWRITEAOF 重寫(xiě) AOF 文件,AOF 在重寫(xiě)的時(shí)候會(huì)占大量的 CPU 和內(nèi)存資源,導(dǎo)致服務(wù) load 過(guò)高,出現(xiàn)短暫服務(wù)暫?,F(xiàn)象。
(4)、Redis 主從復(fù)制的性能問(wèn)題,為了主從復(fù)制的速度和連接的穩(wěn)定性,Slave 和 Master 最好在同一個(gè)局域網(wǎng)內(nèi)。
3.2 Redis常見(jiàn)三大問(wèn)題
在大多數(shù)互聯(lián)網(wǎng)應(yīng)用中,緩存的使用方式如下:
我們的查詢操作在緩存上完成,而對(duì)數(shù)據(jù)的增刪改則在數(shù)據(jù)庫(kù)完成。
3.2.1 緩存穿透
業(yè)務(wù)系統(tǒng)要查詢的數(shù)據(jù)根本就存在!當(dāng)業(yè)務(wù)系統(tǒng)發(fā)起查詢時(shí),按照上述流程,首先會(huì)前往緩存中查詢,由于緩存中不存在,然后再前往數(shù)據(jù)庫(kù)中查詢。由于該數(shù)據(jù)壓根就不存在,因此數(shù)據(jù)庫(kù)也返回空。這就是緩存穿透。
綜上所述:業(yè)務(wù)系統(tǒng)訪問(wèn)壓根就不存在的數(shù)據(jù),就稱為緩存穿透。
但是在如果大量查詢數(shù)據(jù)庫(kù)當(dāng)中不存在的數(shù)據(jù)會(huì)怎么樣呢?當(dāng)然會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的崩潰。
解決方法:
它需要在緩存之前再加一道屏障,里面存儲(chǔ)目前數(shù)據(jù)庫(kù)中存在的所有key,如下圖所示:
當(dāng)業(yè)務(wù)系統(tǒng)有查詢請(qǐng)求的時(shí)候,首先去BloomFilter中查詢?cè)搆ey是否存在。若不存在,則說(shuō)明數(shù)據(jù)庫(kù)中也不存在該數(shù)據(jù),因此緩存都不要查了,直接返回null。若存在,則繼續(xù)執(zhí)行后續(xù)的流程,先前往緩存中查詢,緩存中沒(méi)有的話再前往數(shù)據(jù)庫(kù)中的查詢。
這種方法適用于數(shù)據(jù)命中不高,數(shù)據(jù)相對(duì)固定實(shí)時(shí)性低(通常是數(shù)據(jù)集較大)的應(yīng)用場(chǎng)景,代碼維護(hù)較為復(fù)雜,但是緩存空間占用少。
3.2.2 緩存雪崩
緩存其實(shí)扮演了一個(gè)保護(hù)數(shù)據(jù)庫(kù)的角色。它幫數(shù)據(jù)庫(kù)抵擋大量的查詢請(qǐng)求,從而避免脆弱的數(shù)據(jù)庫(kù)受到傷害。
如果緩存因某種原因發(fā)生了宕機(jī),那么原本被緩存抵擋的海量查詢請(qǐng)求就會(huì)像瘋狗一樣涌向數(shù)據(jù)庫(kù)。此時(shí)數(shù)據(jù)庫(kù)如果抵擋不了這巨大的壓力,它就會(huì)崩潰。
這就是緩存雪崩。緩存雪崩在實(shí)際當(dāng)中不只會(huì)對(duì)數(shù)據(jù)庫(kù)造成傷害,嚴(yán)重的話可能還會(huì)導(dǎo)致整個(gè)服務(wù)宕機(jī),因?yàn)樵诰唧w的應(yīng)用中服務(wù)可能是分布式的其中一臺(tái)機(jī)器宕機(jī)可能會(huì)導(dǎo)致請(qǐng)求無(wú)法繼續(xù)進(jìn)行,進(jìn)而導(dǎo)致整個(gè)服務(wù)宕機(jī)。
解決方法:
Hystrix是一款開(kāi)源的“防雪崩工具”,它通過(guò) 熔斷、降級(jí)、限流三個(gè)手段來(lái)降低雪崩發(fā)生后的損失。
Hystrix就是一個(gè)Java類庫(kù),它采用命令模式,每一項(xiàng)服務(wù)處理請(qǐng)求都有各自的處理器。所有的請(qǐng)求都要經(jīng)過(guò)各自的處理器。處理器會(huì)記錄當(dāng)前服務(wù)的請(qǐng)求失敗率。一旦發(fā)現(xiàn)當(dāng)前服務(wù)的請(qǐng)求失敗率達(dá)到預(yù)設(shè)的值,Hystrix將會(huì)拒絕隨后該服務(wù)的所有請(qǐng)求,直接返回一個(gè)預(yù)設(shè)的結(jié)果。這就是所謂的“熔斷”。當(dāng)經(jīng)過(guò)一段時(shí)間后,Hystrix會(huì)放行該服務(wù)的一部分請(qǐng)求,再次統(tǒng)計(jì)它的請(qǐng)求失敗率。如果此時(shí)請(qǐng)求失敗率符合預(yù)設(shè)值,則完全打開(kāi)限流開(kāi)關(guān);如果請(qǐng)求失敗率仍然很高,那么繼續(xù)拒絕該服務(wù)的所有請(qǐng)求。這就是所謂的“限流”。而Hystrix向那些被拒絕的請(qǐng)求直接返回一個(gè)預(yù)設(shè)結(jié)果,被稱為“降級(jí)”。
Hystrix是由Netflix開(kāi)發(fā)的一款用于處理分布式系統(tǒng)之間的故障和延遲的開(kāi)源庫(kù)。它主要解決服務(wù)之間的依賴關(guān)系和網(wǎng)絡(luò)調(diào)用的不可靠性,通過(guò)提供容錯(cuò)機(jī)制和斷路器模式來(lái)提高系統(tǒng)的彈性和穩(wěn)定性。
Hystrix的核心概念包括:
-
斷路器(Circuit Breaker):Hystrix通過(guò)監(jiān)控對(duì)遠(yuǎn)程服務(wù)的調(diào)用,當(dāng)調(diào)用失敗率超過(guò)事先設(shè)定的閾值時(shí),會(huì)打開(kāi)斷路器,阻止對(duì)服務(wù)的請(qǐng)求,并返回預(yù)設(shè)的 fallback(回退)響應(yīng),避免繼續(xù)對(duì)故障的服務(wù)進(jìn)行調(diào)用,從而減少對(duì)故障服務(wù)的壓力。
-
回退(Fallback):當(dāng)斷路器打開(kāi)或遠(yuǎn)程服務(wù)調(diào)用失敗時(shí),Hystrix可以提供一個(gè)備選的回退響應(yīng),即返回一個(gè)默認(rèn)值、緩存數(shù)據(jù)或執(zhí)行一段備用邏輯,以保證系統(tǒng)的可用性,并進(jìn)行適當(dāng)?shù)慕导?jí)處理。
-
隔離策略(Isolation):為了提高系統(tǒng)的彈性和穩(wěn)定性,Hystrix將每個(gè)遠(yuǎn)程服務(wù)的調(diào)用封裝在獨(dú)立的線程池中,以實(shí)現(xiàn)請(qǐng)求的隔離。這樣可以避免一個(gè)故障服務(wù)的請(qǐng)求阻塞或影響其他服務(wù)。
-
超時(shí)控制(Timeout):Hystrix能夠根據(jù)服務(wù)的響應(yīng)時(shí)間設(shè)定超時(shí)時(shí)間,如果服務(wù)的響應(yīng)時(shí)間超過(guò)設(shè)定的時(shí)間,則認(rèn)為服務(wù)調(diào)用超時(shí),觸發(fā)回退邏輯。
-
實(shí)時(shí)監(jiān)控和度量(Metrics):Hystrix提供了實(shí)時(shí)監(jiān)控系統(tǒng)的功能,可以通過(guò)該功能收集和展示每個(gè)服務(wù)的調(diào)用指標(biāo)、錯(cuò)誤率、請(qǐng)求量、延遲等,以便于運(yùn)維人員實(shí)時(shí)監(jiān)控和調(diào)整服務(wù)的配置。
總結(jié)來(lái)說(shuō),Hystrix通過(guò)斷路器、回退、隔離策略、超時(shí)控制和實(shí)時(shí)監(jiān)控等機(jī)制,幫助開(kāi)發(fā)人員構(gòu)建彈性和可靠的分布式系統(tǒng),使得系統(tǒng)能夠更加優(yōu)雅地處理分布式系統(tǒng)之間的故障和延遲。它與Spring Cloud等微服務(wù)框架結(jié)合使用,可以提供更完善的分布式系統(tǒng)解決方案。
3.2.3 緩存擊穿
我們一般都會(huì)給緩存設(shè)定一個(gè)失效時(shí)間,過(guò)了失效時(shí)間后,該數(shù)據(jù)庫(kù)會(huì)被緩存直接刪除,從而一定程度上保證數(shù)據(jù)的實(shí)時(shí)性。
但是,對(duì)于一些請(qǐng)求量極高的熱點(diǎn)數(shù)據(jù)而言,一旦過(guò)了有效時(shí)間,此刻將會(huì)有大量請(qǐng)求落在數(shù)據(jù)庫(kù)上,從而可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)崩潰。其過(guò)程如下圖所示:
如果某一個(gè)熱點(diǎn)數(shù)據(jù)失效,那么當(dāng)再次有該數(shù)據(jù)的查詢請(qǐng)求[req-1]時(shí)就會(huì)前往數(shù)據(jù)庫(kù)查詢。但是,從請(qǐng)求發(fā)往數(shù)據(jù)庫(kù),到該數(shù)據(jù)更新到緩存中的這段時(shí)間中,由于緩存中仍然沒(méi)有該數(shù)據(jù),因此這段時(shí)間內(nèi)到達(dá)的查詢請(qǐng)求都會(huì)落到數(shù)據(jù)庫(kù)上,這將會(huì)對(duì)數(shù)據(jù)庫(kù)造成巨大的壓力。此外,當(dāng)這些請(qǐng)求查詢完成后,都會(huì)重復(fù)更新緩存。
解決方法:
加鎖。
此方法只允許一個(gè)線程重建緩存,其他線程等待重建緩存的線程執(zhí)行完,重新從緩存獲取數(shù)據(jù)即可。
當(dāng)?shù)谝粋€(gè)數(shù)據(jù)庫(kù)查詢請(qǐng)求發(fā)起后,就將緩存中該數(shù)據(jù)上鎖;此時(shí)到達(dá)緩存的其他查詢請(qǐng)求將無(wú)法查詢?cè)撟侄?,從而被阻塞等待;?dāng)?shù)谝粋€(gè)請(qǐng)求完成數(shù)據(jù)庫(kù)查詢,并將數(shù)據(jù)更新值緩存后,釋放鎖;此時(shí)其他被阻塞的查詢請(qǐng)求將可以直接從緩存中查到該數(shù)據(jù)。
當(dāng)某一個(gè)熱點(diǎn)數(shù)據(jù)失效后,只有第一個(gè)數(shù)據(jù)庫(kù)查詢請(qǐng)求發(fā)往數(shù)據(jù)庫(kù),其余所有的查詢請(qǐng)求均被阻塞,從而保護(hù)了數(shù)據(jù)庫(kù)。但是,由于采用了互斥鎖,其他請(qǐng)求將會(huì)阻塞等待,此時(shí)系統(tǒng)的吞吐量將會(huì)下降。這需要結(jié)合實(shí)際的業(yè)務(wù)考慮是否允許這么做。
互斥鎖可以避免某一個(gè)熱點(diǎn)數(shù)據(jù)失效導(dǎo)致數(shù)據(jù)庫(kù)崩潰的問(wèn)題,而在實(shí)際業(yè)務(wù)中,往往會(huì)存在一批熱點(diǎn)數(shù)據(jù)同時(shí)失效的場(chǎng)景。那么,對(duì)于這種場(chǎng)景該如何防止數(shù)據(jù)庫(kù)過(guò)載呢?
設(shè)置不同的失效時(shí)間
當(dāng)我們向緩存中存儲(chǔ)這些數(shù)據(jù)的時(shí)候,可以將他們的緩存失效時(shí)間錯(cuò)開(kāi)。這樣能夠避免同時(shí)失效。如:在一個(gè)基礎(chǔ)時(shí)間上加/減一個(gè)隨機(jī)數(shù),從而將這些緩存的失效時(shí)間錯(cuò)開(kāi)
關(guān)于緩存的三大問(wèn)題參考自 緩存三大問(wèn)題及解決方案大家可以去看原文,原文作者講的更加細(xì)致。
3.3 數(shù)據(jù)庫(kù)緩存數(shù)據(jù)同步問(wèn)題
當(dāng)我們使用緩存的時(shí)候,無(wú)可避免的會(huì)遇到這個(gè)問(wèn)題。當(dāng)我們?cè)诙嗑€程的場(chǎng)景下遇到這個(gè)問(wèn)題無(wú)論我們是先操作數(shù)據(jù)庫(kù)還是操作緩存都會(huì)出現(xiàn)線程安全問(wèn)題。
這個(gè)時(shí)候我們?nèi)绾卧诒WCCAP(一致性、效率、分區(qū)安全性)的前提下對(duì)緩存進(jìn)行同步呢?
延時(shí)雙刪
延時(shí)指的是在數(shù)據(jù)庫(kù)更改操作完成之后要等待一會(huì),因?yàn)槲覀兊臄?shù)據(jù)庫(kù)可能是主從模式或者是集群模式,讀取數(shù)據(jù)的操作是在從數(shù)據(jù)庫(kù)上完成的。所以我們要保證數(shù)據(jù)庫(kù)的一致。
雙刪指的是兩次刪除緩存,第一次刪除緩存是為了讓線程直接去數(shù)據(jù)庫(kù)查找,第二次刪除則是為了保證數(shù)據(jù)的一致性;當(dāng)我對(duì)數(shù)據(jù)庫(kù)的修改并為未完成的時(shí)候數(shù)據(jù)被讀回到緩存了怎么辦呢?二次刪除防止的就是這種情況。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-621946.html
當(dāng)然這種方法只是保證了數(shù)據(jù)的最終一致性,如果對(duì)數(shù)據(jù)安全要求比較高的情況下,則需要通過(guò)加鎖的方法,或者添加事務(wù)來(lái)解決數(shù)據(jù)一致性的問(wèn)題了。也就是對(duì)CAP的取舍。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-621946.html
到了這里,關(guān)于復(fù)習(xí)第二章之Redis的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!