亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

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

面試官:如何解決 Redis 資料傾斜、熱點(diǎn)等問題

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

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

前幾天有星球小夥伴學(xué)習(xí)時(shí),遇到下面幾個(gè)問題,來諮詢Tom哥

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

問題描述:

向你提問:在複習(xí)redis時(shí),有些疑問,麻煩看:?

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

處理hotKey時(shí),為key建立多個(gè)副本,如k-1,k-2…, 如何讓這些副本能均勻?qū)懭耄咳绾尉鶆蛟L問?

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

回覆:

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

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

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

什麼是資料傾斜?

單一機(jī)器的硬體配置有上限制約,一般我們會(huì)採用分散式架構(gòu)將多臺(tái)機(jī)器組成一個(gè)集群,下圖的集群就是由三臺(tái)Redis單機(jī)組成。客戶端透過一定的路由策略,將讀寫請(qǐng)求轉(zhuǎn)送到具體的實(shí)例上。

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

面試官:如何解決 Redis 資料傾斜、熱點(diǎn)等問題


#

資料傾斜有哪些原因呢?

1、存在大key

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

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

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


#:

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

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

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

面試官:如何解決 Redis 資料傾斜、熱點(diǎn)等問題


#2、HashTag 使用不當(dāng)

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

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

舉例:

#
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ù)程式碼,有沒有引進(jìn)HashTag ,將太多的key路由到了一個(gè)實(shí)例。結(jié)合具體場景,考慮如何做下拆分。

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

3、slot 槽位分配不均

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

你可以手動(dòng)做遷移,將一個(gè)比較大的 slot 遷移到稍微空閒的機(jī)器上,保證儲(chǔ)存和存取的均勻性。


#什麼是快取熱點(diǎn)?

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


# #1、複製多份副本

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

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

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

2、本機(jī)記憶體快取

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


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

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


面試官:如何解決 Redis 資料傾斜、熱點(diǎn)等問題


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

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

公式= hash(key) % 2^32

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

面試官:如何解決 Redis 資料傾斜、熱點(diǎn)等問題


#

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


舉例:

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

See all articles