(更新時(shí)間)2021年5月12日 redis數(shù)據(jù)庫 Redis面試題
Redis高頻面試題
文章目錄
Redis高頻面試題
1、什么是Redis?簡述它的優(yōu)缺點(diǎn)?
2、Redis相比memcached有哪些優(yōu)勢(shì)?
3、Redis支持哪幾種數(shù)據(jù)類型?
4、Redis主要消耗什么物理資源?
5、Redis的全稱是什么?
6、Redis有哪幾種數(shù)據(jù)淘汰策略?
7、Redis官方為什么不提供Windows版本?
8、一個(gè)字符串類型的值能存儲(chǔ)最大容量是多少?
9、為什么Redis需要把所有數(shù)據(jù)放到內(nèi)存中?
10、Redis集群方案應(yīng)該怎么做?都有哪些方案?
11、Redis集群方案什么情況下會(huì)導(dǎo)致整個(gè)集群不可用?
12、MySQL里有2000w數(shù)據(jù),redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)?
13、Redis有哪些適合的場景?
14、Redis支持的Java客戶端都有哪些?官方推薦用哪個(gè)?
15、Redis和Redisson有什么關(guān)系?
16、Jedis與Redisson對(duì)比有什么優(yōu)缺點(diǎn)?
17、Redis如何設(shè)置密碼及驗(yàn)證密碼?
18、說說Redis哈希槽的概念?
19、Redis集群的主從復(fù)制模型是怎樣的?
20、Redis集群會(huì)有寫操作丟失嗎?為什么?
21、Redis集群之間是如何復(fù)制的?
22、Redis集群最大節(jié)點(diǎn)個(gè)數(shù)是多少?
23、Redis集群如何選擇數(shù)據(jù)庫?
24、怎么測試Redis的連通性?
25、Redis中的管道有什么用?
26、怎么理解Redis事務(wù)?
27、Redis事務(wù)相關(guān)的命令有哪幾個(gè)?
28、Redis key的過期時(shí)間和永久有效分別怎么設(shè)置?
29、Redis如何做內(nèi)存優(yōu)化?
30、Redis回收進(jìn)程如何工作的?
31、為什么redis需要把所有數(shù)據(jù)放到內(nèi)存中?
32、Redis常見的性能問題都有哪些?如何解決?
33、Redis最適合的場景有哪些?
34、Memcache與Redis的區(qū)別都有哪些?
35、Redis有哪幾種數(shù)據(jù)結(jié)構(gòu)?
36、Redis的持久化是什么?
37、RDB的優(yōu)缺點(diǎn)?
38、AOF的優(yōu)缺點(diǎn)?
39、簡單說說緩存雪崩及解決方法
40、緩存穿透怎么導(dǎo)致的?
41、項(xiàng)目中有出現(xiàn)過緩存擊穿,簡單說說怎么回事?
42、遇到緩存一致性問題,你怎么解決的?
43、為什么要用 Redis 而不用 map/guava 做緩存?
44、如何選擇合適的持久化方式?
45、Redis持久化數(shù)據(jù)和緩存怎么做擴(kuò)容?
46、Redis的內(nèi)存淘汰策略有哪些?
47、簡單描述下Redis線程模型
48、Redis事務(wù)其他實(shí)現(xiàn)方式?
49、生產(chǎn)環(huán)境中的 redis 是怎么部署的?
50、 如何解決 Redis 的并發(fā)競爭 Key 問題?
51、 什么是 RedLock?
52、什么時(shí)候需要緩存降級(jí)?
53、如何保證緩存與數(shù)據(jù)庫雙寫時(shí)的數(shù)據(jù)一致性?
1、什么是Redis?簡述它的優(yōu)缺點(diǎn)?
Redis本質(zhì)上是一個(gè)Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached,整個(gè)數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進(jìn)行保存。
因?yàn)槭羌儍?nèi)存操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。
Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單個(gè)value的最大限制是1GB,不像 memcached只能保存1MB的數(shù)據(jù),因此Redis可以用來實(shí)現(xiàn)很多有用的功能。
比方說用他的List來做FIFO雙向鏈表,實(shí)現(xiàn)一個(gè)輕量級(jí)的高性 能消息隊(duì)列服務(wù),用他的Set可以做高性能的tag系統(tǒng)等等。
另外Redis也可以對(duì)存入的Key-Value設(shè)置expire時(shí)間,因此也可以被當(dāng)作一 個(gè)功能加強(qiáng)版的memcached來用。 Redis的主要缺點(diǎn)是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上。
2、Redis相比memcached有哪些優(yōu)勢(shì)?
(1) memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數(shù)據(jù)類型
(2) redis的速度比memcached快很多
(3) redis可以持久化其數(shù)據(jù)
3、Redis支持哪幾種數(shù)據(jù)類型?
String、List、Set、Sorted Set、hash
4、Redis主要消耗什么物理資源?
內(nèi)存。
5、Redis的全稱是什么?
Remote Dictionary Server。
6、Redis有哪幾種數(shù)據(jù)淘汰策略?
noeviction:返回錯(cuò)誤當(dāng)內(nèi)存限制達(dá)到并且客戶端嘗試執(zhí)行會(huì)讓更多內(nèi)存被使用的命令(大部分的寫入指令,但DEL和幾個(gè)例外)
allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數(shù)據(jù)有空間存放。
volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放。
allkeys-random: 回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放。
volatile-random: 回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放,但僅限于在過期集合的鍵。
volatile-ttl: 回收在過期集合的鍵,并且優(yōu)先回收存活時(shí)間(TTL)較短的鍵,使得新添加的數(shù)據(jù)有空間存放。
7、Redis官方為什么不提供Windows版本?
因?yàn)槟壳癓inux版本已經(jīng)相當(dāng)穩(wěn)定,而且用戶量很大,無需開發(fā)windows版本,反而會(huì)帶來兼容性等問題。
8、一個(gè)字符串類型的值能存儲(chǔ)最大容量是多少?
512M
9、為什么Redis需要把所有數(shù)據(jù)放到內(nèi)存中?
Redis為了達(dá)到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。
所以redis具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤I/O速度為嚴(yán)重影響redis的性能。
在內(nèi)存越來越便宜的今天,redis將會(huì)越來越受歡迎。 如果設(shè)置了最大使用的內(nèi)存,則數(shù)據(jù)已有記錄數(shù)達(dá)到內(nèi)存限值后不能繼續(xù)插入新值。
10、Redis集群方案應(yīng)該怎么做?都有哪些方案?
1.codis。
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節(jié)點(diǎn)數(shù)量改變情況下,舊節(jié)點(diǎn)數(shù)據(jù)可恢復(fù)到新hash節(jié)點(diǎn)。
2.redis cluster3.0自帶的集群,特點(diǎn)在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節(jié)點(diǎn)設(shè)置從節(jié)點(diǎn)。具體看官方文檔介紹。
3.在業(yè)務(wù)代碼層實(shí)現(xiàn),起幾個(gè)毫無關(guān)聯(lián)的redis實(shí)例,在代碼層,對(duì)key 進(jìn)行hash計(jì)算,然后去對(duì)應(yīng)的redis實(shí)例操作數(shù)據(jù)。 這種方式對(duì)hash層代碼要求比較高,考慮部分包括,節(jié)點(diǎn)失效后的替代算法方案,數(shù)據(jù)震蕩后的自動(dòng)腳本恢復(fù),實(shí)例的監(jiān)控,等等。
11、Redis集群方案什么情況下會(huì)導(dǎo)致整個(gè)集群不可用?
有A,B,C三個(gè)節(jié)點(diǎn)的集群,在沒有復(fù)制模型的情況下,如果節(jié)點(diǎn)B失敗了,那么整個(gè)集群就會(huì)以為缺少5501-11000這個(gè)范圍的槽而不可用。
12、MySQL里有2000w數(shù)據(jù),redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)?
redis內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)施行數(shù)據(jù)淘汰策略。
13、Redis有哪些適合的場景?
(1)會(huì)話緩存(Session Cache)
最常用的一種使用Redis的情景是會(huì)話緩存(session cache)。用Redis緩存會(huì)話比其他存儲(chǔ)(如Memcached)的優(yōu)勢(shì)在于:Redis提供持久化。當(dāng)維護(hù)一個(gè)不是嚴(yán)格要求一致性的緩存時(shí),如果用戶的購物車信息全部丟失,大部分人都會(huì)不高興的,現(xiàn)在,他們還會(huì)這樣嗎?
幸運(yùn)的是,隨著 Redis 這些年的改進(jìn),很容易找到怎么恰當(dāng)?shù)氖褂肦edis來緩存會(huì)話的文檔。甚至廣為人知的商業(yè)平臺(tái)Magento也提供Redis的插件。
(2)全頁緩存(FPC)
除基本的會(huì)話token之外,Redis還提供很簡便的FPC平臺(tái)。回到一致性問題,即使重啟了Redis實(shí)例,因?yàn)橛写疟P的持久化,用戶也不會(huì)看到頁面加載速度的下降,這是一個(gè)極大改進(jìn),類似PHP本地FPC。
再次以Magento為例,Magento提供一個(gè)插件來使用Redis作為全頁緩存后端。
此外,對(duì)WordPress的用戶來說,Pantheon有一個(gè)非常好的插件 wp-redis,這個(gè)插件能幫助你以最快速度加載你曾瀏覽過的頁面。
(3)隊(duì)列
Reids在內(nèi)存存儲(chǔ)引擎領(lǐng)域的一大優(yōu)點(diǎn)是提供 list 和 set 操作,這使得Redis能作為一個(gè)很好的消息隊(duì)列平臺(tái)來使用。Redis作為隊(duì)列使用的操作,就類似于本地程序語言(如Python)對(duì) list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項(xiàng)目,這些項(xiàng)目的目的就是利用Redis創(chuàng)建非常好的后端工具,以滿足各種隊(duì)列需求。例如,Celery有一個(gè)后臺(tái)就是使用Redis作為broker,你可以從這里去查看。
(4)排行榜/計(jì)數(shù)器
Redis在內(nèi)存中對(duì)數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們?cè)趫?zhí)行這些操作的時(shí)候變的非常簡單,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)。
所以,我們要從排序集合中獲取到排名最靠前的10個(gè)用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:
當(dāng)然,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序。如果你想返回用戶及用戶的分?jǐn)?shù),你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個(gè)很好的例子,用Ruby實(shí)現(xiàn)的,它的排行榜就是使用Redis來存儲(chǔ)數(shù)據(jù)的,你可以在這里看到。
(5)發(fā)布/訂閱
最后(但肯定不是最不重要的)是Redis的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實(shí)非常多。我已看見人們?cè)谏缃痪W(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)!
14、Redis支持的Java客戶端都有哪些?官方推薦用哪個(gè)?
Redisson、Jedis、lettuce等等,官方推薦使用Redisson。
15、Redis和Redisson有什么關(guān)系?
Redisson是一個(gè)高級(jí)的分布式協(xié)調(diào)Redis客服端,能幫助用戶在分布式環(huán)境中輕松實(shí)現(xiàn)一些Java的對(duì)象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
16、Jedis與Redisson對(duì)比有什么優(yōu)缺點(diǎn)?
Jedis是Redis的Java實(shí)現(xiàn)的客戶端,其API提供了比較全面的Redis命令的支持;
Redisson實(shí)現(xiàn)了分布式和可擴(kuò)展的Java數(shù)據(jù)結(jié)構(gòu),和Jedis相比,功能較為簡單,不支持字符串操作,不支持排序、事務(wù)、管道、分區(qū)等Redis特性。Redisson的宗旨是促進(jìn)使用者對(duì)Redis的關(guān)注分離,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上。
17、Redis如何設(shè)置密碼及驗(yàn)證密碼?
設(shè)置密碼:config set requirepass 123456
授權(quán)密碼:auth 123456
18、說說Redis哈希槽的概念?
Redis集群沒有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384個(gè)哈希槽,每個(gè)key通過CRC16校驗(yàn)后對(duì)16384取模來決定放置哪個(gè)槽,集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽。
19、Redis集群的主從復(fù)制模型是怎樣的?
為了使在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,每個(gè)節(jié)點(diǎn)都會(huì)有N-1個(gè)復(fù)制品.
20、Redis集群會(huì)有寫操作丟失嗎?為什么?
Redis并不能保證數(shù)據(jù)的強(qiáng)一致性,這意味這在實(shí)際中集群在特定的條件下可能會(huì)丟失寫操作。
21、Redis集群之間是如何復(fù)制的?
異步復(fù)制
22、Redis集群最大節(jié)點(diǎn)個(gè)數(shù)是多少?
16384個(gè)。
23、Redis集群如何選擇數(shù)據(jù)庫?
Redis集群目前無法做數(shù)據(jù)庫選擇,默認(rèn)在0數(shù)據(jù)庫。
24、怎么測試Redis的連通性?
ping
25、Redis中的管道有什么用?
一次請(qǐng)求/響應(yīng)服務(wù)器能實(shí)現(xiàn)處理新的請(qǐng)求即使舊的請(qǐng)求還未被響應(yīng)。這樣就可以將多個(gè)命令發(fā)送到服務(wù)器,而不用等待回復(fù),最后在一個(gè)步驟中讀取該答復(fù)。
這就是管道(pipelining),是一種幾十年來廣泛使用的技術(shù)。例如許多POP3協(xié)議已經(jīng)實(shí)現(xiàn)支持這個(gè)功能,大大加快了從服務(wù)器下載新郵件的過程。
26、怎么理解Redis事務(wù)?
事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請(qǐng)求所打斷。
事務(wù)是一個(gè)原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。
27、Redis事務(wù)相關(guān)的命令有哪幾個(gè)?
MULTI、EXEC、DISCARD、WATCH
28、Redis key的過期時(shí)間和永久有效分別怎么設(shè)置?
EXPIRE和PERSIST命令。
29、Redis如何做內(nèi)存優(yōu)化?
盡可能使用散列表(hashes),散列表(是說散列表里面存儲(chǔ)的數(shù)少)使用的內(nèi)存非常小,所以你應(yīng)該盡可能的將你的數(shù)據(jù)模型抽象到一個(gè)散列表里面。
比如你的web系統(tǒng)中有一個(gè)用戶對(duì)象,不要為這個(gè)用戶的名稱,姓氏,郵箱,密碼設(shè)置單獨(dú)的key,而是應(yīng)該把這個(gè)用戶的所有信息存儲(chǔ)到一張散列表里面。
30、Redis回收進(jìn)程如何工作的?
一個(gè)客戶端運(yùn)行了新的命令,添加了新的數(shù)據(jù)。
Redi檢查內(nèi)存使用情況,如果大于maxmemory的限制, 則根據(jù)設(shè)定好的策略進(jìn)行回收。
一個(gè)新的命令被執(zhí)行,等等。
所以我們不斷地穿越內(nèi)存限制的邊界,通過不斷達(dá)到邊界然后不斷地回收回到邊界以下。
如果一個(gè)命令的結(jié)果導(dǎo)致大量內(nèi)存被使用(例如很大的集合的交集保存到一個(gè)新的鍵),不用多久內(nèi)存限制就會(huì)被這個(gè)內(nèi)存使用量超越。
31、為什么redis需要把所有數(shù)據(jù)放到內(nèi)存中?
Redis為了達(dá)到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。所以redis具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤I/O速度為嚴(yán)重影響redis的性能。在內(nèi)存越來越便宜的今天,redis將會(huì)越來越受歡迎。如果設(shè)置了最大使用的內(nèi)存,則數(shù)據(jù)已有記錄數(shù)達(dá)到內(nèi)存限值后不能繼續(xù)插入新值。
32、Redis常見的性能問題都有哪些?如何解決?
● Master寫內(nèi)存快照,save命令調(diào)度rdbSave函數(shù),會(huì)阻塞主線程的工作,當(dāng)快照比較大時(shí)對(duì)性能影響是非常大的,會(huì)間斷性暫停服務(wù),所以Master最好不要寫內(nèi)存快照。
● Master AOF持久化,如果不重寫AOF文件,這個(gè)持久化方式對(duì)性能的影響是最小的,但是AOF文件會(huì)不斷增大,AOF文件過大會(huì)影響Master重啟的恢復(fù)速度。Master最好不要做任何持久化工作,包括內(nèi)存快照和AOF日志文件,特別是不要啟用內(nèi)存快照做持久化,如果數(shù)據(jù)比較關(guān)鍵,某個(gè)Slave開啟AOF備份數(shù)據(jù),策略為每秒同步一次。
● Master調(diào)用BGREWRITEAOF重寫AOF文件,AOF在重寫的時(shí)候會(huì)占大量的CPU和內(nèi)存資源,導(dǎo)致服務(wù)load過高,出現(xiàn)短暫服務(wù)暫停現(xiàn)象。
● Redis主從復(fù)制的性能問題,為了主從復(fù)制的速度和連接的穩(wěn)定性,Slave和Master最好在同一個(gè)局域網(wǎng)內(nèi)。
33、Redis最適合的場景有哪些?
● 會(huì)話緩存(Session Cache)
● 全頁緩存(FPC)
● 隊(duì)列
● 排行榜/計(jì)數(shù)器
● 發(fā)布/訂閱
34、Memcache與Redis的區(qū)別都有哪些?
● 存儲(chǔ)方式不同,Memcache是把數(shù)據(jù)全部存在內(nèi)存中,數(shù)據(jù)不能超過內(nèi)存的大小,斷電后數(shù)據(jù)庫會(huì)掛掉。Redis有部分存在硬盤上,這樣能保證數(shù)據(jù)的持久性。
● 數(shù)據(jù)支持的類型不同memcahe對(duì)數(shù)據(jù)類型支持相對(duì)簡單,redis有復(fù)雜的數(shù)據(jù)類型。
● 使用底層模型不同 它們之間底層實(shí)現(xiàn)方式以及與客戶端之間通信的應(yīng)用協(xié)議不一樣。Redis直接自己構(gòu)建了VM機(jī)制,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求。
● 支持的value大小不一樣redis最大可以達(dá)到1GB,而memcache只有1MB。
35、Redis有哪幾種數(shù)據(jù)結(jié)構(gòu)?
● String——字符串
String數(shù)據(jù)結(jié)構(gòu)是簡單的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說白了就是鏈表(redis使用雙端鏈表實(shí)現(xiàn)的List)
● Set——集合
Set就是一個(gè)集合,集合的概念就是一堆不重復(fù)值的組合。利用Redis提供的Set數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)一些集合性的數(shù)據(jù)。
● Sorted Set——有序集合
和Set相比,Sorted Set是將Set中的元素增加了一個(gè)權(quán)重參數(shù)score,使得集合中的元素能夠按score進(jìn)行有序排列,
● 帶有權(quán)重的元素,比如一個(gè)游戲的用戶得分排行榜
● 比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),一般用到的場景不算太多
36、Redis的持久化是什么?
RDB持久化:該機(jī)制可以在指定的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的時(shí)間點(diǎn)快照(point-in-time snapshot)。
AOF持久化:記錄服務(wù)器執(zhí)行的所有寫操作命令,并在服務(wù)器啟動(dòng)時(shí),通過重新執(zhí)行這些命令來還原數(shù)據(jù)集。AOF文件中的命令全部以Redis協(xié)議的格式來保存,新命令會(huì)被追加到文件的末尾。Redis還可以在后臺(tái)對(duì)AOF文件進(jìn)行重寫(rewrite),使得AOF文件的體積不會(huì)超出保存數(shù)據(jù)集狀態(tài)所需的實(shí)際大小。
AOF和RDB的同時(shí)應(yīng)用:當(dāng)Redis重啟時(shí),它會(huì)優(yōu)先使用AOF文件來還原數(shù)據(jù)集,因?yàn)锳OF文件保存的數(shù)據(jù)集通常比RDB文件所保存的數(shù)據(jù)集更完整。
37、RDB的優(yōu)缺點(diǎn)?
**優(yōu)點(diǎn):**RDB是一個(gè)非常緊湊(compact)的文件,它保存了Redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)集。這種文件非常適合用于進(jìn)行備份:比如說,你可以在最近的24小時(shí)內(nèi),每小時(shí)備份一次RDB文件,并且在每個(gè)月的每一天,也備份一個(gè)RDB文件。這樣的話,即使遇上問題,也可以隨時(shí)將數(shù)據(jù)集還原到不同的版本。RDB非常適用于災(zāi)難恢復(fù)(disaster recovery):它只有一個(gè)文件,并且內(nèi)容都非常緊湊,可以(在加密后)將它傳送到別的數(shù)據(jù)中心,或者亞馬遜S3中。RDB可以最大化Redis的性能:父進(jìn)程在保存RDB文件時(shí)唯一要做的就是fork出一個(gè)子進(jìn)程,然后這個(gè)子進(jìn)程就會(huì)處理接下來的所有保存工作,父進(jìn)程無須執(zhí)行任何磁盤I/O操作。RDB在恢復(fù)大數(shù)據(jù)集時(shí)的速度比AOF的恢復(fù)速度要快。
**缺點(diǎn):**如果你需要盡量避免在服務(wù)器故障時(shí)丟失數(shù)據(jù),那么RDB不適合你。雖然Redis允許你設(shè)置不同的保存點(diǎn)(save point)來控制保存RDB文件的頻率,但是,因?yàn)镽DB文件需要保存整個(gè)數(shù)據(jù)集的狀態(tài),所以它并不是一個(gè)輕松的操作。因此你可能會(huì)至少5分鐘才保存一次RDB文件。在這種情況下,一旦發(fā)生故障停機(jī),你就可能會(huì)丟失好幾分鐘的數(shù)據(jù)。每次保存RDB的時(shí)候,Redis都要fork()出一個(gè)子進(jìn)程,并由子進(jìn)程來進(jìn)行實(shí)際的持久化工作。在數(shù)據(jù)集比較龐大時(shí),fork()可能會(huì)非常耗時(shí),造成服務(wù)器在某某毫秒內(nèi)停止處理客戶端;如果數(shù)據(jù)集非常巨大,并且CPU時(shí)間非常緊張的話,那么這種停止時(shí)間甚至可能會(huì)長達(dá)整整一秒。
38、AOF的優(yōu)缺點(diǎn)?
● 優(yōu)點(diǎn):
使用AOF持久化會(huì)讓Redis變得非常耐久(much more durable):你可以設(shè)置不同的fsync策略,比如無fsync,每秒鐘一次fsync,或者每次執(zhí)行寫入命令時(shí)fsync。AOF的默認(rèn)策略為每秒鐘fsync一次,在這種配置下,Redis仍然可以保持良好的性能,并且就算發(fā)生故障停機(jī),也最多只會(huì)丟失一秒鐘的數(shù)據(jù)(fsync會(huì)在后臺(tái)線程執(zhí)行,所以主線程可以繼續(xù)努力地處理命令請(qǐng)求)。AOF文件是一個(gè)只進(jìn)行追加操作的日志文件(append onlylog),因此對(duì)AOF文件的寫入不需要進(jìn)行seek,即使日志因?yàn)槟承┰蚨宋磳懭胪暾拿睿ū热鐚懭霑r(shí)磁盤已滿,寫入中途停機(jī),等等),redis-check-aof工具也可以 輕易地修復(fù)這種問題。
Redis可以在AOF文件體積變得過大時(shí),自動(dòng)地在后臺(tái)對(duì)AOF進(jìn)行重寫:重寫后的新AOF文件包含了恢復(fù)當(dāng)前數(shù)據(jù)集所需的最小命令集合。整個(gè)重寫操作是絕對(duì)安全的,因?yàn)镽edis在創(chuàng)建新AOF文件的過程中,會(huì)繼續(xù)將命令追加到現(xiàn)有的AOF文件里面,即使重寫過程中發(fā)生停機(jī),現(xiàn)有的AOF文件也不會(huì)丟失。而一旦新AOF文件創(chuàng)建完畢,Redis就會(huì)從舊AOF文件切換到新AOF文件,并開始對(duì)新AOF文件進(jìn)行追加操作。
● 缺點(diǎn):
對(duì)于相同的數(shù)據(jù)集來說,AOF文件的體積通常要大于RDB文件的體積。根據(jù)所使用的fsync策略,AOF的速度可能會(huì)慢于RDB。在一般情況下,每秒fsync的性能依然非常高,而關(guān)閉fsync可以讓AOF的速度和RDB一樣快,即使在高負(fù)荷之下也是如此。不過在處理巨大的寫入載入時(shí),RDB可以提供更有保證的最大延遲時(shí)間(latency)。
AOF在過去曾經(jīng)發(fā)生過這樣的bug:因?yàn)閭€(gè)別命令的原因,導(dǎo)致AOF文件在重新載入時(shí),無法將數(shù)據(jù)集恢復(fù)成保存時(shí)的原樣。(舉個(gè)例子,阻塞命令BRPOPLPUSH就曾經(jīng)引起過這樣的bug。)測試套件里為這種情況添加了測試:它們會(huì)自動(dòng)生成隨機(jī)的、復(fù)雜的數(shù)據(jù)集,并通過重新載入這些數(shù)據(jù)來確保一切正常。雖然這種bug在AOF文件中并不常見,但是對(duì)比來說,RDB幾乎是不可能出現(xiàn)這種bug的。
39、簡單說說緩存雪崩及解決方法
緩存雪崩我們可以簡單的理解為:由于原有緩存失效,新緩存未到期間
(例如:我們?cè)O(shè)置緩存時(shí)采用了相同的過期時(shí)間,在同一時(shí)刻出現(xiàn)大面積的緩存過期),所有原本應(yīng)該訪問緩存的請(qǐng)求都去查詢數(shù)據(jù)庫了,而對(duì)數(shù)據(jù)庫CPU和內(nèi)存造成巨大壓力,嚴(yán)重的會(huì)造成數(shù)據(jù)庫宕機(jī)。從而形成一系列連鎖反應(yīng),造成整個(gè)系統(tǒng)崩潰。)
解決辦法:
大多數(shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖( 最多的解決方案)或者隊(duì)列的方式保證來保證不會(huì)有大量的線程對(duì)數(shù)據(jù)庫一次性進(jìn)行讀寫,從而避免失效時(shí)大量的并發(fā)請(qǐng)求落到底層存儲(chǔ)系統(tǒng)上。還有一個(gè)簡單方案就時(shí)講緩存失效時(shí)間分散開。
40、緩存穿透怎么導(dǎo)致的?
在高并發(fā)下查詢key不存在的數(shù)據(jù),會(huì)穿過緩去存查詢數(shù)據(jù)庫。導(dǎo)致數(shù)據(jù)庫壓力過大而宕機(jī)。
解決方法:
對(duì)查詢結(jié)果為空的情況也進(jìn)行緩存,緩存時(shí)間(ttl)設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert了之后清理緩存。
缺點(diǎn):緩存太多空值占用了更多的空間
使用布隆過濾器。在緩存之前在加一層布隆過濾器,在查詢的時(shí)候先去布隆過濾器查詢 key 是否存在,如果不存在就直接返回,存在再查緩存和DB。
布隆過濾器原理: 當(dāng)一個(gè)元素被加入集合時(shí),將這個(gè)元素通過n次Hash函數(shù)結(jié)果映射成一個(gè)數(shù)組中的n個(gè)點(diǎn),把它們置為1。檢索時(shí),我們只要看看這些點(diǎn)是不是都是1就(大約)知道集合中有沒有它了:如果這些點(diǎn)有任何一個(gè)0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。總之布隆過濾器是一個(gè)很大二進(jìn)制的位數(shù)組,數(shù)組里面只存0和1。
41、項(xiàng)目中有出現(xiàn)過緩存擊穿,簡單說說怎么回事?
緩存在某個(gè)時(shí)間點(diǎn)過期的時(shí)候,恰好在這個(gè)時(shí)間點(diǎn)對(duì)這個(gè)Key有大量的并發(fā)請(qǐng)求過來,這些請(qǐng)求發(fā)現(xiàn)緩存過期一般會(huì)從數(shù)據(jù)庫中加載數(shù)據(jù)并回設(shè)到緩存,這個(gè)時(shí)候大并發(fā)的請(qǐng)求可能會(huì)瞬間把后端DB壓垮
解決方案:
用分布式鎖控制訪問的線程,使用redis的setnx互斥鎖先進(jìn)行判斷,這樣其他線程就處于等待狀態(tài),保證不會(huì)有大并發(fā)操作去操作數(shù)據(jù)庫。
不設(shè)超時(shí)時(shí)間,采用volatile-lru淘汰策略
缺點(diǎn):會(huì)造成寫一致問題,當(dāng)數(shù)據(jù)庫數(shù)據(jù)發(fā)生更新時(shí),緩存中的數(shù)據(jù)不會(huì)及時(shí)更新,這樣會(huì)造成數(shù)據(jù)庫中的數(shù)據(jù)與緩存中的數(shù)據(jù)的不一致,應(yīng)用會(huì)從緩存中讀取到臟數(shù)據(jù)。可采用延時(shí)雙刪策略處理。
42、遇到緩存一致性問題,你怎么解決的?
由于緩存和數(shù)據(jù)庫不屬于同一個(gè)數(shù)據(jù)源,本質(zhì)上非原子操作,所以是無法保證強(qiáng)一致性的,只能去實(shí)現(xiàn)最終一致性。
解決方案:
延時(shí)雙刪:先更新數(shù)據(jù)庫同時(shí)刪除緩存,等2秒后再刪除一次緩存,等到讀的時(shí)候在回寫到緩存。
利用工具(canal)將數(shù)據(jù)庫的binlog日志采集發(fā)送到MQ中,然后通過ACK機(jī)制確認(rèn)處理刪除緩存
43、為什么要用 Redis 而不用 map/guava 做緩存?
緩存分為本地緩存和分布式緩存。以 Java 為例,使用自帶的 map 或者 guava 實(shí)現(xiàn)的是本地緩存,最主要的特點(diǎn)是輕量以及快速,生命周期隨著 jvm 的銷毀而結(jié)束,并且在多實(shí)例的情況下,每個(gè)實(shí)例都需要各自保存一份緩存,緩存不具有一致性。
使用 redis 或 memcached 之類的稱為分布式緩存,在多實(shí)例的情況下,各實(shí)例共用一份緩存數(shù)據(jù),緩存具有一致性。缺點(diǎn)是需要保持 redis 或 memcached服務(wù)的高可用,整個(gè)程序架構(gòu)上較為復(fù)雜。
44、如何選擇合適的持久化方式?
1、一般來說, 如果想達(dá)到足以媲美PostgreSQL的數(shù)據(jù)安全性,你應(yīng)該同時(shí)使用兩種持久化功能。在這種情況下,當(dāng) Redis 重啟的時(shí)候會(huì)優(yōu)先載入AOF文件來恢復(fù)原始的數(shù)據(jù),因?yàn)樵谕ǔG闆r下AOF文件保存的數(shù)據(jù)集要比RDB文件保存的數(shù)據(jù)集要完整。
2、如果你非常關(guān)心你的數(shù)據(jù), 但仍然可以承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失,那么你可以只使用RDB持久化。
3、有很多用戶都只使用AOF持久化,但并不推薦這種方式,因?yàn)槎〞r(shí)生成RDB快照(snapshot)非常便于進(jìn)行數(shù)據(jù)庫備份, 并且 RDB 恢復(fù)數(shù)據(jù)集的速度也要比AOF恢復(fù)的速度要快,除此之外,使用RDB還可以避免AOF程序的bug。
4、如果你只希望你的數(shù)據(jù)在服務(wù)器運(yùn)行的時(shí)候存在,你也可以不使用任何持久化方式。
45、Redis持久化數(shù)據(jù)和緩存怎么做擴(kuò)容?
1、如果Redis被當(dāng)做緩存使用,使用一致性哈希實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容縮容。
2、如果Redis被當(dāng)做一個(gè)持久化存儲(chǔ)使用,必須使用固定的keys-to-nodes映射關(guān)系,節(jié)點(diǎn)的數(shù)量一旦確定不能變化。否則的話(即Redis節(jié)點(diǎn)需要?jiǎng)討B(tài)變化的情況),必須使用可以在運(yùn)行時(shí)進(jìn)行數(shù)據(jù)再平衡的一套系統(tǒng),而當(dāng)前只有Redis集群可以做到這樣。
46、Redis的內(nèi)存淘汰策略有哪些?
Redis的內(nèi)存淘汰策略是指在Redis的用于緩存的內(nèi)存不足時(shí),怎么處理需要新寫入且需要申請(qǐng)額外空間的數(shù)據(jù)。
1、全局的鍵空間選擇性移除
noeviction:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),新寫入操作會(huì)報(bào)錯(cuò)。
allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key。(這個(gè)是最常用的)
allkeys-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,隨機(jī)移除某個(gè)key。
2、設(shè)置過期時(shí)間的鍵空間選擇性移除
volatile-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,移除最近最少使用的key。
volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,隨機(jī)移除某個(gè)key。
volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,有更早過期時(shí)間的key優(yōu)先移除。
47、簡單描述下Redis線程模型
Redis基于Reactor模式開發(fā)了網(wǎng)絡(luò)事件處理器,這個(gè)處理器被稱為文件事件處理器(file event handler)。它的組成結(jié)構(gòu)為4部分:多個(gè)套接字、IO多路復(fù)用程序、文件事件分派器、事件處理器。因?yàn)槲募录峙善麝?duì)列的消費(fèi)是單線程的,所以Redis才叫單線程模型。
文件事件處理器使用 I/O 多路復(fù)用(multiplexing)程序來同時(shí)監(jiān)聽多個(gè)套接字, 并根據(jù)套接字目前執(zhí)行的任務(wù)來為套接字關(guān)聯(lián)不同的事件處理器。
當(dāng)被監(jiān)聽的套接字準(zhǔn)備好執(zhí)行連接應(yīng)答(accept)、讀取(read)、寫入(write)、關(guān)閉(close)等操作時(shí), 與操作相對(duì)應(yīng)的文件事件就會(huì)產(chǎn)生, 這時(shí)文件事件處理器就會(huì)調(diào)用套接字之前關(guān)聯(lián)好的事件處理器來處理這些事件。
雖然文件事件處理器以單線程方式運(yùn)行, 但通過使用 I/O 多路復(fù)用程序來監(jiān)聽多個(gè)套接字, 文件事件處理器既實(shí)現(xiàn)了高性能的網(wǎng)絡(luò)通信模型, 又可以很好地與 redis 服務(wù)器中其他同樣以單線程方式運(yùn)行的模塊進(jìn)行對(duì)接, 這保持了 Redis 內(nèi)部單線程設(shè)計(jì)的簡單性。
48、Redis事務(wù)其他實(shí)現(xiàn)方式?
1、基于Lua腳本,Redis可以保證腳本內(nèi)的命令一次性、按順序地執(zhí)行,
其同時(shí)也不提供事務(wù)運(yùn)行錯(cuò)誤的回滾,執(zhí)行過程中如果部分命令運(yùn)行錯(cuò)誤,剩下的命令還是會(huì)繼續(xù)運(yùn)行完
2、基于中間標(biāo)記變量,通過另外的標(biāo)記變量來標(biāo)識(shí)事務(wù)是否執(zhí)行完成,讀取數(shù)據(jù)時(shí)先讀取該標(biāo)記變量判斷是否事務(wù)執(zhí)行完成。但這樣會(huì)需要額外寫代碼實(shí)現(xiàn),比較繁瑣
49、生產(chǎn)環(huán)境中的 redis 是怎么部署的?
redis cluster,10 臺(tái)機(jī)器,5 臺(tái)機(jī)器部署了 redis 主實(shí)例,另外 5 臺(tái)機(jī)器部署了 redis 的從實(shí)例,每個(gè)主實(shí)例掛了一個(gè)從實(shí)例,5 個(gè)節(jié)點(diǎn)對(duì)外提供讀寫服務(wù),每個(gè)節(jié)點(diǎn)的讀寫高峰qps可能可以達(dá)到每秒 5 萬,5 臺(tái)機(jī)器最多是 25 萬讀寫請(qǐng)求/s。
機(jī)器是什么配置?32G 內(nèi)存+ 8 核 CPU + 1T 磁盤,但是分配給 redis 進(jìn)程的是10g內(nèi)存,一般線上生產(chǎn)環(huán)境,redis 的內(nèi)存盡量不要超過 10g,超過 10g 可能會(huì)有問題。
5 臺(tái)機(jī)器對(duì)外提供讀寫,一共有 50g 內(nèi)存。
因?yàn)槊總€(gè)主實(shí)例都掛了一個(gè)從實(shí)例,所以是高可用的,任何一個(gè)主實(shí)例宕機(jī),都會(huì)自動(dòng)故障遷移,redis 從實(shí)例會(huì)自動(dòng)變成主實(shí)例繼續(xù)提供讀寫服務(wù)。
你往內(nèi)存里寫的是什么數(shù)據(jù)?每條數(shù)據(jù)的大小是多少?商品數(shù)據(jù),每條數(shù)據(jù)是 10kb。100 條數(shù)據(jù)是 1mb,10 萬條數(shù)據(jù)是 1g。常駐內(nèi)存的是 200 萬條商品數(shù)據(jù),占用內(nèi)存是 20g,僅僅不到總內(nèi)存的 50%。目前高峰期每秒就是 3500 左右的請(qǐng)求量。
其實(shí)大型的公司,會(huì)有基礎(chǔ)架構(gòu)的 team 負(fù)責(zé)緩存集群的運(yùn)維。
50、 如何解決 Redis 的并發(fā)競爭 Key 問題?
所謂 Redis 的并發(fā)競爭 Key 的問題也就是多個(gè)系統(tǒng)同時(shí)對(duì)一個(gè) key 進(jìn)行操作,但是最后執(zhí)行的順序和我們期望的順序不同,這樣也就導(dǎo)致了結(jié)果的不同!
推薦一種方案:分布式鎖(zookeeper 和 redis 都可以實(shí)現(xiàn)分布式鎖)。(如果不存在 Redis 的并發(fā)競爭 Key 問題,不要使用分布式鎖,這樣會(huì)影響性能)
基于zookeeper臨時(shí)有序節(jié)點(diǎn)可以實(shí)現(xiàn)的分布式鎖。大致思想為:每個(gè)客戶端對(duì)某個(gè)方法加鎖時(shí),在zookeeper上的與該方法對(duì)應(yīng)的指定節(jié)點(diǎn)的目錄下,生成一個(gè)唯一的瞬時(shí)有序節(jié)點(diǎn)。判斷是否獲取鎖的方式很簡單,只需要判斷有序節(jié)點(diǎn)中序號(hào)最小的一個(gè)。當(dāng)釋放鎖的時(shí)候,只需將這個(gè)瞬時(shí)節(jié)點(diǎn)刪除即可。同時(shí),其可以避免服務(wù)宕機(jī)導(dǎo)致的鎖無法釋放,而產(chǎn)生的死鎖問題。完成業(yè)務(wù)流程后,刪除對(duì)應(yīng)的子節(jié)點(diǎn)釋放鎖。
在實(shí)踐中,當(dāng)然是從以可靠性為主。所以首推Zookeeper。
51、 什么是 RedLock?
Redis 官方站提出了一種權(quán)威的基于 Redis 實(shí)現(xiàn)分布式鎖的方式名叫 Redlock,此種方式比原先的單節(jié)點(diǎn)的方法更安全。它可以保證以下特性:
安全特性:互斥訪問,即永遠(yuǎn)只有一個(gè) client 能拿到鎖
避免死鎖:最終 client 都可能拿到鎖,不會(huì)出現(xiàn)死鎖的情況,即使原本鎖住某資源的 client crash 了或者出現(xiàn)了網(wǎng)絡(luò)分區(qū)
容錯(cuò)性:只要大部分 Redis 節(jié)點(diǎn)存活就可以正常提供服務(wù)
52、什么時(shí)候需要緩存降級(jí)?
當(dāng)訪問量劇增、服務(wù)出現(xiàn)問題(如響應(yīng)時(shí)間慢或不響應(yīng))或非核心服務(wù)影響到核心流程的性能時(shí),仍然需要保證服務(wù)還是可用的,即使是有損服務(wù)。系統(tǒng)可以根據(jù)一些關(guān)鍵數(shù)據(jù)進(jìn)行自動(dòng)降級(jí),也可以配置開關(guān)實(shí)現(xiàn)人工降級(jí)。
緩存降級(jí)的最終目的是保證核心服務(wù)可用,即使是有損的。而且有些服務(wù)是無法降級(jí)的(如加入購物車、結(jié)算)。
在進(jìn)行降級(jí)之前要對(duì)系統(tǒng)進(jìn)行梳理,看看系統(tǒng)是不是可以丟卒保帥;從而梳理出哪些必須誓死保護(hù),哪些可降級(jí);比如可以參考日志級(jí)別設(shè)置預(yù)案:
一般:比如有些服務(wù)偶爾因?yàn)榫W(wǎng)絡(luò)抖動(dòng)或者服務(wù)正在上線而超時(shí),可以自動(dòng)降級(jí);
警告:有些服務(wù)在一段時(shí)間內(nèi)成功率有波動(dòng)(如在95~100%之間),可以自動(dòng)降級(jí)或人工降級(jí),并發(fā)送告警;
錯(cuò)誤:比如可用率低于90%,或者數(shù)據(jù)庫連接池被打爆了,或者訪問量突然猛增到系統(tǒng)能承受的最大閥值,此時(shí)可以根據(jù)情況自動(dòng)降級(jí)或者人工降級(jí);
嚴(yán)重錯(cuò)誤:比如因?yàn)樘厥庠驍?shù)據(jù)錯(cuò)誤了,此時(shí)需要緊急人工降級(jí)。
服務(wù)降級(jí)的目的,是為了防止Redis服務(wù)故障,導(dǎo)致數(shù)據(jù)庫跟著一起發(fā)生雪崩問題。因此,對(duì)于不重要的緩存數(shù)據(jù),可以采取服務(wù)降級(jí)策略,例如一個(gè)比較常見的做法就是,Redis出現(xiàn)問題,不去數(shù)據(jù)庫查詢,而是直接返回默認(rèn)值給用戶。
53、如何保證緩存與數(shù)據(jù)庫雙寫時(shí)的數(shù)據(jù)一致性?
你只要用緩存,就可能會(huì)涉及到緩存與數(shù)據(jù)庫雙存儲(chǔ)雙寫,你只要是雙寫,就一定會(huì)有數(shù)據(jù)一致性的問題,那么你如何解決一致性問題?
一般來說,就是如果你的系統(tǒng)不是嚴(yán)格要求緩存+數(shù)據(jù)庫必須一致性的話,緩存可以稍微的跟數(shù)據(jù)庫偶爾有不一致的情況,最好不要做這個(gè)方案,讀請(qǐng)求和寫請(qǐng)求串行化,串到一個(gè)內(nèi)存隊(duì)列里去,這樣就可以保證一定不會(huì)出現(xiàn)不一致的情況
串行化之后,就會(huì)導(dǎo)致系統(tǒng)的吞吐量會(huì)大幅度的降低,用比正常情況下多幾倍的機(jī)器去支撐線上的一個(gè)請(qǐng)求。
還有一種方式就是可能會(huì)暫時(shí)產(chǎn)生不一致的情況,但是發(fā)生的幾率特別小,就是先更新數(shù)據(jù)庫,然后再刪除緩存。
據(jù)庫跟著一起發(fā)生雪崩問題。因此,對(duì)于不重要的緩存數(shù)據(jù),可以采取服務(wù)降級(jí)策略,例如一個(gè)比較常見的做法就是,Redis出現(xiàn)問題,不去數(shù)據(jù)庫查詢,而是直接返回默認(rèn)值給用戶。
Redis 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。