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

目錄
回復:" >回復:
什么是數(shù)據(jù)傾斜?" >什么是數(shù)據(jù)傾斜?
數(shù)據(jù)傾斜有哪些原因呢?" >數(shù)據(jù)傾斜有哪些原因呢?
1、存在大key" >1、存在大key
2、HashTag 使用不當" >2、HashTag 使用不當
3、slot 槽位分配不均" >3、slot 槽位分配不均
什么是緩存熱點?" >什么是緩存熱點?
1、復制多份副本" >1、復制多份副本
2、本地內(nèi)存緩存" >2、本地內(nèi)存緩存
Redis Cluster 不用一致性Hash?" >Redis Cluster 不用一致性Hash?
首頁 Java Java面試題 面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題

面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題

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

Redis 作為一門主流技術,應用場景非常多,很多大中小廠面試都列為重點考察內(nèi)容

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

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

問題描述:

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

如果redis集群出現(xiàn)數(shù)據(jù)傾斜,數(shù)據(jù)分配不均,該如何解決?

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

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

回復:

分布式緩存作為性能加速器,在系統(tǒng)優(yōu)化中承擔著非常重要的角色。相比本地緩存,雖然增加了一次網(wǎng)絡傳輸,大約占用不到 1 毫秒外,但是卻有集中化管理的優(yōu)勢,并支持非常大的存儲容量。

分布式緩存領域,目前應用比較廣泛的要數(shù) Redis 了,該框架是純內(nèi)存儲存,單線程執(zhí)行命令,擁有豐富的底層數(shù)據(jù)結(jié)構(gòu),支持多種維度的數(shù)據(jù)存儲和查找。

當然,數(shù)據(jù)量一大,各種問題就出現(xiàn)了,比如:數(shù)據(jù)傾斜、數(shù)據(jù)熱點等

什么是數(shù)據(jù)傾斜?

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

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

面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題


數(shù)據(jù)傾斜有哪些原因呢?

1、存在大key

比如存儲一個或多個 String 類型的 bigKey 數(shù)據(jù),內(nèi)存占用很大。

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

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


解決方案:

辦法非常簡單,采用<code style='font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;background-color: rgba(0, 0, 0, 0.06);border-width: 1px;border-style: solid;border-color: rgba(0, 0, 0, 0.08);border-radius: 2px;padding-right: 2px;padding-left: 2px;'><span style="font-size: 16px;">化整為零</span>的策略,將一個bigKey拆分為多個小key,獨立維護,成本會降低很多。當然這個拆也講究些原則,既要考慮業(yè)務場景也要考慮訪問場景,將關聯(lián)緊密的放到一起。

比如:有個RPC接口內(nèi)部對 Redis 有依賴,之前訪問一次就可以拿到全部數(shù)據(jù),拆分將要控制單值的大小,也要控制訪問的次數(shù),畢竟調(diào)用次數(shù)增多了,會拉大整體的接口響應時間。

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

面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題


2、HashTag 使用不當

Redis 采用單線程執(zhí)行命令,從而保證了原子性。當采用集群部署后,為了解決mset、lua 腳本等對多key 批量操作,為了保證不同的 key 能路由到同一個 Redis 實例上,引入了 HashTag 機制。

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

比如:有個RPC接口內(nèi)部對 Redis 有依賴,之前訪問一次就可以拿到全部數(shù)據(jù),拆分將要控制單值的大小,也要控制訪問的次數(shù),畢竟調(diào)用次數(shù)增多了,會拉大整體的接口響應時間。

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

面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題

2、HashTag 使用不當

????????Redis 采用單線程執(zhí)行命令,從而保證了原子性。當采用集群部署后,為了解決mset、lua 腳本等對多key 批量操作,為了保證不同的 key 能路由到同一個 Redis 實例上,引入了 HashTag ??機制。????????用法也很簡單,使用????{}????大括號,指定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 的部署方式,集群中的數(shù)據(jù)庫被分為16384個槽(slot),數(shù)據(jù)庫中的每個健都屬于這16384個槽的其中一個,集群中的每個節(jié)點可以處理的0個或最多16384個槽。

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


什么是緩存熱點?

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


解決方案:

1、復制多份副本

我們可以在key的后面拼上有序編號,比如key#01、key#02。。。key#10多個副本,這些加工后的key位于多個緩存節(jié)點上。

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

注意:緩存一般都會設置過期時間,為了避免緩存的集中失效,我們對緩存的過期時間盡量不要一樣,可以在預設的基礎上增加一個隨機數(shù)。

至于數(shù)據(jù)路由的均勻性,這個由 Hash 算法來保證。


2、本地內(nèi)存緩存

把熱點數(shù)據(jù)緩存在客戶端的本地內(nèi)存中,并且設置一個失效時間。對于每次讀請求,將首先檢查該數(shù)據(jù)是否存在于本地緩存中,如果存在則直接返回,如果不存在再去訪問分布式緩存的服務器。

本地內(nèi)存緩存徹底“解放”了緩存服務器,不會對緩存服務器有任何壓力。

缺點:實時感知最新的緩存數(shù)據(jù)有點麻煩,會產(chǎn)生數(shù)據(jù)不一致的情況。我們可以設置一個比較短的過期時間,采用被動更新。當然,也可以用監(jiān)控機制,如果感知到數(shù)據(jù)已經(jīng)發(fā)生了變化,及時更新本地緩存。


Redis Cluster 不用一致性Hash?

Redis Cluster 集群有16384個哈希槽,每個<code style='font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;background-color: rgba(0, 0, 0, 0.06);border-width: 1px;border-style: solid;border-color: rgba(0, 0, 0, 0.08);border-radius: 2px;padding-right: 2px;padding-left: 2px;'><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>key

通過<p style="min-height: 24px;margin-bottom: 24px;">CRC16<br></p>面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題校驗后對<p style="min-height: 24px;margin-bottom: 24px;">16384<br></p>取模來決定放置哪個槽。集群的每個資源負責一部分hash槽,舉了個例子,比如當前資源有3個節(jié)點,那么

<span style="color: rgb(43, 43, 43);font-size: 16px;">節(jié)點- 1</span>

包含0到5460號哈希槽,

<span style="color: rgb(0, 0, 0);font-size: 16px;">node-2</span>

包含 5461 到 10922 號哈希槽,
<blockquote data-tool="mdnice編輯器" style="border-top: none;border-right: none;border-bottom: none;font-size: 0.9em;overflow: auto;color: rgb(106, 115, 125);padding: 10px 10px 10px 20px;margin-bottom: 20px;margin-top: 20px;background: rgb(249, 249, 249);border-left-color: rgb(92, 157, 255);">node-3<p style="font-size: 16px;line-height: 26px;color: rgb(153, 153, 153);padding-top: 3px;padding-bottom: 3px;"></p> </blockquote>包含10922到16383號哈希槽。

面試官:如何解決 Redis 數(shù)據(jù)傾斜、熱點等問題

一致性梯度算法是1997年年麻省理工學院的Karger等人提出了,為的就是分散解決存儲的問題。


??一致性對稱算法本質(zhì)上也是一種取模算法,相反按服務器數(shù)量取模,一致性哈希是對固定值 2^32 取模。??????????公式 = hash(key) % 2^32????????????其取模的結(jié)果必然在 [0, 2^32-1]區(qū)間這個中的整數(shù),??從圓上映射的位置開始順時針方向找到的第一個節(jié)點即為存儲key的節(jié)點????????????????

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


舉個例子:

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

但是如果采用 <span style="font-size: 16px;">CRC16</span>CRC16計算后,并結(jié)合槽位與實例的綁定關系,無論是擴容還是縮容,只需將相應節(jié)點的key做下數(shù)據(jù)平滑遷移,廣播存儲新的槽位映射關系,不會產(chǎn)生緩存失效,靈活性很高。

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

??

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(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)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

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

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

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

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

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

比較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。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存泄漏風險。1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對象被標記為垃圾。2.基于標記-清除算法,標記所有可達對象,清除未標記對象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應用;ParallelGC提升吞吐量;CMS降

了解網(wǎng)絡端口和防火墻 了解網(wǎng)絡端口和防火墻 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

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用于在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按后進先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用于文件關閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用于recover;5.避免在循環(huán)中濫用defer,防止資源泄漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles