国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
回覆:" >回覆:
什麼是資料傾斜? " >什麼是資料傾斜?
資料傾斜有哪些原因呢? " >資料傾斜有哪些原因呢?
1、存在大key" >1、存在大key
#2、HashTag 使用不當" >#2、HashTag 使用不當
3、slot 槽位分配不均" >3、slot 槽位分配不均
#什麼是快取熱點? " >#什麼是快取熱點?
至於資料路由的均勻性,這個由 Hash 演算法來保證。 " >注意:快取一般都會設(shè)定過期時間,為了避免快取的集中失效,我們對快取的過期時間盡量不要一樣,可以在預(yù)設(shè)的基礎(chǔ)上增加一個隨機數(shù)。 至於資料路由的均勻性,這個由 Hash 演算法來保證。
Redis Cluster 為什麼不用一致性Hash?" >Redis Cluster 為什麼不用一致性Hash?
首頁 Java Java面試題 面試官:如何解決 Redis 資料傾斜、熱點等問題

面試官:如何解決 Redis 資料傾斜、熱點等問題

Aug 15, 2023 pm 04:43 PM
java java面試題

Redis 作為主流技術(shù),應(yīng)用場景非常多,許多大中小廠面試都列為重點考察內(nèi)容

前幾天有星球小夥伴學習時,遇到下面幾個問題,來諮詢Tom哥

考慮到這些問題比較高頻,工作中常會遇到,這裡寫篇文章系統(tǒng)講解下

問題描述:

向你提問:在複習redis時,有些疑問,麻煩看:?

如果redis集群出現(xiàn)資料傾斜,資料分配不均,該如何解決?

處理hotKey時,為key建立多個副本,如k-1,k-2…, 如何讓這些副本能均勻?qū)懭??如何均勻訪問?

redis使用hash slot來維護叢集。與一致性哈希類似,都可以避免全量遷移。為什麼不直接使用一致性hash?

回覆:

#分散式快取作為效能加速器,在系統(tǒng)最佳化中承擔著非常重要的角色。相較於本地緩存,雖然增加了一次網(wǎng)路傳輸,大約佔用不到 1 毫秒外,但卻有集中化管理的優(yōu)勢,並支援非常大的儲存容量。

分散式快取領(lǐng)域,目前應(yīng)用比較廣泛的要數(shù)Redis 了,該框架是純記憶體儲存,單執(zhí)行緒執(zhí)行指令,擁有豐富的底層資料結(jié)構(gòu),支援多種維度的資料儲存和查找。

當然,資料量一大,各種問題就出現(xiàn)了,例如:資料傾斜、資料熱點等

什麼是資料傾斜?

單一機器的硬體配置有上限制約,一般我們會採用分散式架構(gòu)將多臺機器組成一個集群,下圖的集群就是由三臺Redis單機組成??蛻舳送高^一定的路由策略,將讀寫請求轉(zhuǎn)送到具體的實例上。

由於業(yè)務(wù)資料特殊性,按照指定的分片規(guī)則,可能導(dǎo)致不同的實例上資料分佈不均勻,大量的資料集中到了一臺或幾臺機器節(jié)點上計算,從而導(dǎo)致這些節(jié)點負載多大,而其他節(jié)點處於空閒等待中,導(dǎo)致最終整體效率低下。

面試官:如何解決 Redis 資料傾斜、熱點等問題


#

資料傾斜有哪些原因呢?

1、存在大key

#例如儲存一個或多個String 類型的bigKey 數(shù)據(jù),記憶體佔用量很大。

Tom哥之前排查過這種問題,有同事開發(fā)時為了省事,採用JSON格式,將多個業(yè)務(wù)資料合併到一個value,只關(guān)聯(lián)一個key,導(dǎo)致了這個鍵值對容量達到了幾百M。

頻繁的大key讀寫,記憶體資源消耗比較重,同時給網(wǎng)路傳輸帶了極大的壓力,進而導(dǎo)致請求回應(yīng)變慢,引發(fā)雪崩效應(yīng),最後系統(tǒng)各種超時報警。


#:

#非常簡單,採用 <span style="font-size: 16px;">化整為零</span>的策略,將一個bigKey分割為多個小key,獨立維護,成本會降低很多。當然這個拆也講究些原則,既要考慮業(yè)務(wù)場景也要考慮訪問場景,將關(guān)聯(lián)緊密的放在一起。

例如:有個RPC介面內(nèi)部對Redis 有依賴,之前訪問一次就可以拿到全部數(shù)據(jù),拆分將要控制單值的大小,也要控制訪問的次數(shù),畢竟呼叫次數(shù)增加了,會拉大整體的介面回應(yīng)時間。

浙江的政府機構(gòu)都在提倡優(yōu)化流程,最多跑一次,都是一個道理。

面試官:如何解決 Redis 資料傾斜、熱點等問題


#2、HashTag 使用不當

##Redis 採用單執(zhí)行緒執(zhí)行指令,從而保證了原子性。當採用叢集部署後,為了解決mset、lua 腳本等對多key 批次操作,為了確保不同的 key 能路由到同一個 Redis 實例上,引入了 HashTag 機制。

用法也很簡單,使用{}<span style="font-size: 16px;"></span>#大括號,指定key只計算大括號內(nèi)字串的哈希,從而將不同key的健值對插入到同一個哈希槽。

舉例:

#
192.168.0.1:6380> CLUSTER KEYSLOT testtag
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT {testtag}
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT mykey1{testtag}
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT mykey2{testtag}
(integer) 764

check 下業(yè)務(wù)程式碼,有沒有引進HashTag ,將太多的key路由到了一個實例。結(jié)合具體場景,考慮如何做下拆分。

就像 RocketMQ 一樣,很多時候只要能保證分區(qū)有序,就可以滿足我們的業(yè)務(wù)需求。具體實戰(zhàn)中,要找到這個平衡點,而不是為了解決問題而解決問題。

3、slot 槽位分配不均

#如果採用Redis Cluster 的部署方式,叢集中的資料庫被分成16384個槽(slot),資料庫中的每個健都屬於這16384個槽的其中一個,集群中的每個節(jié)點可以處理的0個或最多16384個槽。

你可以手動做遷移,將一個比較大的 slot 遷移到稍微空閒的機器上,保證儲存和存取的均勻性。


#什麼是快取熱點?

快取熱點是指大部分甚至所有的業(yè)務(wù)請求都命中同一份快取數(shù)據(jù),給快取伺服器帶來了巨大壓力,甚至超過了單機的承載上限,導(dǎo)致伺服器宕機。


# #1、複製多份副本

我們可以在key的後面拼上有序編號,例如key#01、key#02。 。 。 key#10多個副本,這些加工後的key位於多個快取節(jié)點上。

客戶端每次存取時,只需要在原key的基礎(chǔ)上拼接一個分片數(shù)上限的隨機數(shù),將請求路由不到的實例節(jié)點。

注意:快取一般都會設(shè)定過期時間,為了避免快取的集中失效,我們對快取的過期時間盡量不要一樣,可以在預(yù)設(shè)的基礎(chǔ)上增加一個隨機數(shù)。 至於資料路由的均勻性,這個由 Hash 演算法來保證。

2、本機記憶體快取

####把熱點資料緩存在客戶端的本機記憶體中,並且設(shè)定一個失效時間。對於每次讀取請求,將首先檢查該資料是否存在於本機快取中,如果存在則直接傳回,如果不存在再去存取分散式快取的伺服器。 ############本機記憶體快取徹底「解放」了快取伺服器,不會對快取伺服器有任何壓力。 ############缺點:即時感知最新的快取資料有點麻煩,會產(chǎn)生資料不一致的情況。我們可以設(shè)定一個比較短的過期時間,採用被動更新。當然,也可以用監(jiān)控機制,如果感知到資料已經(jīng)發(fā)生了變化,就及時更新本地快取。 ##########


Redis Cluster 為什麼不用一致性Hash?

Redis Cluster 叢集有16384個哈希槽,每個<span style="font-size: 16px;">key</span>透過<span style="font-size: 16px;">#CRC16</span>校驗後對<span style="font-size: 16px;">16384</span>取模來決定要放置哪個槽。叢集的每個節(jié)點負責一部分hash槽,舉個例子,例如目前叢集有3個節(jié)點,那麼<span style="font-size: 16px;">node-1</span> 包含0 到5460 號哈希槽,<span style="font-size: 16px;">node-2</span> 包含5461 到10922 號哈希槽,<span style="font-size: 16px;">node-3</span>包含10922 ?到16383 號哈希槽。


面試官:如何解決 Redis 資料傾斜、熱點等問題


#一致性雜湊演算法是1997年麻省理工學院的Karger 等人提出了,為的就是解決分散式快取的問題。

一致性雜湊演算法本質(zhì)上也是一種取模演算法,不同於以伺服器數(shù)量取模,一致性雜湊是對固定值 2^32 取模。

公式= hash(key) % 2^32

其取模的結(jié)果必然是在[0, 2^32-1] 這個區(qū)間中的整數(shù),從圓上映射的位置開始順時針方向找到的第一個節(jié)點即為儲存key的節(jié)點

面試官:如何解決 Redis 資料傾斜、熱點等問題


#

一致性雜湊演算法大大緩解了擴容或縮容導(dǎo)致的快取失效問題,只影響本節(jié)點負責的那一小段key。如果叢集的機器不多,且平時單機的負載水位很高,某節(jié)點宕機帶來的壓力很容易引發(fā)雪崩效應(yīng)。


舉例:

Redis叢集總共有4臺機器,假設(shè)資料分佈均衡,每臺機器承擔四分之一的流量,如果某一臺機器突然掛了,順時針方向下一臺機器將要承擔這多出來的四分之一流量,最終要承擔二分之一的流量,還是有點恐怖。

但是如果採用<span style="font-size: 16px;">CRC16</span>#計算後,並結(jié)合槽位與實例的綁定關(guān)係,無論是擴容還是縮容,只需將對應(yīng)節(jié)點的key做下資料平滑遷移,廣播儲存新的槽位映射關(guān)係,不會產(chǎn)生快取失效,彈性很高。

另外,如果伺服器節(jié)點配置存在差異化,我們可以自訂分配不同節(jié)點負責的 slot 編號,調(diào)整不同節(jié)點的負載能力,非常方便。

以上是面試官:如何解決 Redis 資料傾斜、熱點等問題的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應(yīng)的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在Java的地圖上迭代? 如何在Java的地圖上迭代? Jul 13, 2025 am 02:54 AM

遍歷Java中的Map有三種常用方法:1.使用entrySet同時獲取鍵和值,適用於大多數(shù)場景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡化代碼結(jié)構(gòu)。 entrySet返回包含所有鍵值對的Set集合,每次循環(huán)獲取Map.Entry對象,適合頻繁訪問鍵和值的情況;若只需鍵或值,可分別調(diào)用keySet()或values(),也可在遍歷鍵時通過map.get(key)獲取值;Java8中可通過Lambda表達式使用forEach((key,value)-&gt

Java中的可比較與比較器 Java中的可比較與比較器 Jul 13, 2025 am 02:31 AM

在Java中,Comparable用於類內(nèi)部定義默認排序規(guī)則,Comparator用於外部靈活定義多種排序邏輯。 1.Comparable是類自身實現(xiàn)的接口,通過重寫compareTo()方法定義自然順序,適用於類有固定、最常用的排序方式,如String或Integer。 2.Comparator是外部定義的函數(shù)式接口,通過compare()方法實現(xiàn),適合同一類需要多種排序方式、無法修改類源碼或排序邏輯經(jīng)常變化的情況。兩者區(qū)別在於Comparable只能定義一種排序邏輯且需修改類本身,而Compar

如何處理Java中的字符編碼問題? 如何處理Java中的字符編碼問題? Jul 13, 2025 am 02:46 AM

處理Java中的字符編碼問題,關(guān)鍵是在每一步都明確指定使用的編碼。 1.讀寫文本時始終指定編碼,使用InputStreamReader和OutputStreamWriter並傳入明確的字符集,避免依賴系統(tǒng)默認編碼。 2.在網(wǎng)絡(luò)邊界處理字符串時確保兩端一致,設(shè)置正確的Content-Type頭並用庫顯式指定編碼。 3.謹慎使用String.getBytes()和newString(byte[]),應(yīng)始終手動指定StandardCharsets.UTF_8以避免平臺差異導(dǎo)致的數(shù)據(jù)損壞??傊?,通過在每個階段

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時間,包括獲取當前時間、測量執(zhí)行時間、操作時間點與持續(xù)時間及格式化解析時間。 1.獲取當前時間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但係統(tǒng)時鐘可能不單調(diào);2.測量執(zhí)行時間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,並通過duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時間點(time_point)和持續(xù)時間(duration)可相互操作,但需注意單位兼容性和時鐘紀元(epoch)

Hashmap在Java內(nèi)部如何工作? Hashmap在Java內(nèi)部如何工作? Jul 15, 2025 am 03:10 AM

HashMap在Java中通過哈希表實現(xiàn)鍵值對存儲,其核心在於快速定位數(shù)據(jù)位置。 1.首先使用鍵的hashCode()方法生成哈希值,並通過位運算轉(zhuǎn)換為數(shù)組索引;2.不同對象可能產(chǎn)生相同哈希值,導(dǎo)致衝突,此時以鍊錶形式掛載節(jié)點,JDK8後鍊錶過長(默認長度8)則轉(zhuǎn)為紅黑樹提升效率;3.使用自定義類作鍵時必須重寫equals()和hashCode()方法;4.HashMap動態(tài)擴容,當元素數(shù)超過容量乘以負載因子(默認0.75)時,擴容並重新哈希;5.HashMap非線程安全,多線程下應(yīng)使用Concu

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

Java中的'靜態(tài)”關(guān)鍵字是什麼? Java中的'靜態(tài)”關(guān)鍵字是什麼? Jul 13, 2025 am 02:51 AM

InJava,thestatickeywordmeansamemberbelongstotheclassitself,nottoinstances.Staticvariablesaresharedacrossallinstancesandaccessedwithoutobjectcreation,usefulforglobaltrackingorconstants.Staticmethodsoperateattheclasslevel,cannotaccessnon-staticmembers,

什麼是Java的重新進入? 什麼是Java的重新進入? Jul 13, 2025 am 02:14 AM

ReentrantLock在Java中提供比synchronized更靈活的線程控制。 1.它支持非阻塞獲取鎖(tryLock())、帶超時的鎖獲取(tryLock(longtimeout,TimeUnitunit))和可中斷等待鎖;2.允許設(shè)置公平鎖,避免線程飢餓;3.支持多個條件變量,實現(xiàn)更精細的等待/通知機制;4.需手動釋放鎖,必須在finally塊中調(diào)用unlock()以避免資源洩漏;5.適用於需要高級同步控制的場景,如自定義同步工具或複雜並發(fā)結(jié)構(gòu),但對簡單互斥需求仍推薦使用synchro

See all articles