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

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

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

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

Redis 作為主流技術(shù),應用場景非常多,許多大中小廠面試都列為重點考察內(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)勢,並支援非常大的儲存容量。

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

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

什麼是資料傾斜?

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

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

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


#

資料傾斜有哪些原因呢?

1、存在大key

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

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

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


#:

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

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

浙江的政府機構(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è)務程式碼,有沒有引進HashTag ,將太多的key路由到了一個實例。結(jié)合具體場景,考慮如何做下拆分。

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

3、slot 槽位分配不均

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

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


#什麼是快取熱點?

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


# #1、複製多份副本

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

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

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

2、本機記憶體快取

####把熱點資料緩存在客戶端的本機記憶體中,並且設定一個失效時間。對於每次讀取請求,將首先檢查該資料是否存在於本機快取中,如果存在則直接傳回,如果不存在再去存取分散式快取的伺服器。 ############本機記憶體快取徹底「解放」了快取伺服器,不會對快取伺服器有任何壓力。 ############缺點:即時感知最新的快取資料有點麻煩,會產(chǎn)生資料不一致的情況。我們可以設定一個比較短的過期時間,採用被動更新。當然,也可以用監(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 資料傾斜、熱點等問題


#

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


舉例:

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(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 12, 2025 am 02:55 AM

Optional能清晰表達意圖並減少null判斷的代碼噪音。 1.Optional.ofNullable是處理可能為null對象的常用方式,如從map中取值時可結(jié)合orElse提供默認值,邏輯更清晰簡潔;2.通過鍊式調(diào)用map實現(xiàn)嵌套取值,安全地避免NPE,任一環(huán)節(jié)為null則自動終止並返回默認值;3.filter可用於條件篩選,滿足條件才繼續(xù)執(zhí)行後續(xù)操作,否則直接跳到o??rElse,適合輕量級業(yè)務判斷;4.不建議過度使用Optional,如基本類型或簡單邏輯中其反而增加複雜度,部分場景直接返回nu

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.io.notserializable Exception? 如何修復java.io.notserializable Exception? Jul 12, 2025 am 03:07 AM

遇到java.io.NotSerializableException的核心解決方法是確保所有需序列化的類實現(xiàn)Serializable接口,並檢查嵌套對象的序列化支持。 1.給主類添加implementsSerializable;2.確保類中自定義字段對應的類也實現(xiàn)Serializable;3.用transient標記不需要序列化的字段;4.檢查集合或嵌套對像中的非序列化類型;5.查看異常信息定位具體哪個類未實現(xiàn)接口;6.對無法修改的類考慮替換設計,如保存關鍵數(shù)據(jù)或使用可序列化的中間結(jié)構(gòu);7.考慮改

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

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

Java方法參考解釋了 Java方法參考解釋了 Jul 12, 2025 am 02:59 AM

方法引用是Java中一種簡化Lambda表達式的寫法,使代碼更簡潔。它不是新語法,而是Java8引入的Lambda表達式的一種快捷方式,適用於函數(shù)式接口的上下文。其核心在於將已有方法直接作為函數(shù)式接口的實現(xiàn)來使用。例如System.out::println等價於s->System.out.println(s)。方法引用主要有四種形式:1.靜態(tài)方法引用(ClassName::staticMethodName);2.實例方法引用(綁定到特定對象,instance::methodName);3.

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

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

如何在Java解析JSON? 如何在Java解析JSON? Jul 11, 2025 am 02:18 AM

解析JSON在Java中的常見方式有三種:使用Jackson、Gson或org.json。 1.Jackson適合大多數(shù)項目,性能好且功能全面,支持對象與JSON字符串之間的轉(zhuǎn)換及註解映射;2.Gson更適合Android項目或輕量級需求,使用簡單但處理複雜結(jié)構(gòu)和高性能場景略遜;3.org.json適用於簡單任務或小腳本,不推薦用於大型項目,因其靈活性和類型安全不足。選擇應根據(jù)實際需求決定。

See all articles