最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

面試分析分布式架構(gòu)Redis熱點(diǎn)key大Value解決方案

 更新時(shí)間:2022年03月10日 15:40:16   作者:Q.E.D  
這篇文章主要為大家介紹了分布式架構(gòu)Redis熱點(diǎn)key大Value解決方案,以及在面試中如果遇到這類(lèi)問(wèn)題的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助

引言

關(guān)于 Redis 熱點(diǎn)數(shù)據(jù) & 大 key 大 value 問(wèn)題也是容易被問(wèn)的高階問(wèn)題,不如一次痛快點(diǎn)說(shuō)完,讓面試官無(wú)話(huà)可說(shuō),個(gè)人工作經(jīng)驗(yàn)中,熱點(diǎn)數(shù)據(jù)問(wèn)題在工作中相比雪崩更容易遇到,只是大部分時(shí)候熱點(diǎn)不夠熱,都會(huì)被提前告警解決,但這個(gè)問(wèn)題一旦控制不了造成的線(xiàn)上問(wèn)題也是足夠讓你今年績(jī)效墊底了,廢話(huà)不說(shuō)進(jìn)入正題。

正常情況下,Redis 集群中數(shù)據(jù)都是均勻分配到每個(gè)節(jié)點(diǎn),請(qǐng)求也會(huì)均勻的分布到每個(gè)分片上,但在一些特殊場(chǎng)景中,比如外部爬蟲(chóng)、攻擊、熱點(diǎn)商品等,最典型的就是明星在微博上宣布離婚,吃瓜群眾紛紛涌入留言,導(dǎo)致微博評(píng)論功能崩潰,這種短時(shí)間內(nèi)某些 key 訪(fǎng)問(wèn)量過(guò)于大,對(duì)于這種相同的 key 會(huì)請(qǐng)求到同一臺(tái)數(shù)據(jù)分片上,導(dǎo)致該分片負(fù)載較高成為瓶頸問(wèn)題,導(dǎo)致雪崩等一系列問(wèn)題。

1、面試官:你在項(xiàng)目中有沒(méi)有遇到 Redis 熱點(diǎn)數(shù)據(jù)問(wèn)題,一般都是什么原因引起的?

問(wèn)題分析:上次聽(tīng)群里大佬面試阿里 p7 就被問(wèn)到這個(gè)問(wèn)題,難度指數(shù)五顆星,對(duì)我等小白著實(shí)是加分項(xiàng)。

答:關(guān)于熱點(diǎn)數(shù)據(jù)問(wèn)題我有話(huà)要說(shuō),這個(gè)問(wèn)題我早在剛剛學(xué)習(xí)使用 Redis 時(shí)就從已經(jīng)意識(shí)到了,所以在使用時(shí)會(huì)刻意避免,堅(jiān)決不會(huì)給自己挖坑,熱點(diǎn)數(shù)據(jù)最大的問(wèn)題會(huì)造成 Reids 集群負(fù)載不均衡(也就是數(shù)據(jù)傾斜)導(dǎo)致的故障,這些問(wèn)題對(duì)于 Redis 集群都是致命打擊。

先說(shuō)說(shuō)造成 Reids 集群負(fù)載不均衡故障的主要原因:

  • 高訪(fǎng)問(wèn)量的 Key,也就是熱 key,根據(jù)過(guò)去的維護(hù)經(jīng)驗(yàn)一個(gè) key 訪(fǎng)問(wèn)的 QPS 超過(guò) 1000 就要高度關(guān)注了,比如熱門(mén)商品,熱門(mén)話(huà)題等。
  • 大 Value,有些 key 訪(fǎng)問(wèn) QPS 雖然不高,但是由于 value 很大,造成網(wǎng)卡負(fù)載較大,網(wǎng)卡流量被打滿(mǎn),單臺(tái)機(jī)器可能出現(xiàn)千兆 / 秒,IO 故障。
  • 熱點(diǎn) Key + 大 Value 同時(shí)存在,服務(wù)器殺手。

那么熱點(diǎn) key 或大 Value 會(huì)造成哪些故障呢:

  • 數(shù)據(jù)傾斜問(wèn)題:大 Value 會(huì)導(dǎo)致集群不同節(jié)點(diǎn)數(shù)據(jù)分布不均勻,造成數(shù)據(jù)傾斜問(wèn)題,大量讀寫(xiě)比例非常高的請(qǐng)求都會(huì)落到同一個(gè) redis server 上,該 redis 的負(fù)載就會(huì)嚴(yán)重升高,容易打掛。
  • QPS 傾斜:分片上的 QPS 不均。
  • 大 Value 會(huì)導(dǎo)致 Redis 服務(wù)器緩沖區(qū)不足,造成 get 超時(shí)。
  • 由于 Value 過(guò)大,導(dǎo)致機(jī)房網(wǎng)卡流量不足。
  • Redis 緩存失效導(dǎo)致數(shù)據(jù)庫(kù)層被擊穿的連鎖反應(yīng)。

2、面試官:真實(shí)項(xiàng)目中,那熱點(diǎn)數(shù)據(jù)問(wèn)題你是如何準(zhǔn)確定位的呢?

答:這個(gè)問(wèn)題的解決辦法比較寬泛,要具體看不同業(yè)務(wù)場(chǎng)景,比如公司組織促銷(xiāo)活動(dòng),那參加促銷(xiāo)的商品肯定是有辦法提前統(tǒng)計(jì)的,這種場(chǎng)景就可以通過(guò)預(yù)估法。對(duì)于突發(fā)事件,不確定因素,Redis 會(huì)自己監(jiān)控?zé)狳c(diǎn)數(shù)據(jù)。大概歸納下:

提前獲知法:

根據(jù)業(yè)務(wù),人肉統(tǒng)計(jì) or 系統(tǒng)統(tǒng)計(jì)可能會(huì)成為熱點(diǎn)的數(shù)據(jù),如,促銷(xiāo)活動(dòng)商品,熱門(mén)話(huà)題,節(jié)假日話(huà)題,紀(jì)念日活動(dòng)等。

Redis 客戶(hù)端收集法:

調(diào)用端通過(guò)計(jì)數(shù)的方式統(tǒng)計(jì) key 的請(qǐng)求次數(shù),但是無(wú)法預(yù)知 key 的個(gè)數(shù),代碼侵入性強(qiáng)。

public Connection sendCommand(final ProtocolCommand cmd, final byte[]... args) {
    //從參數(shù)中獲取key
    String key = analysis(args);
    //計(jì)數(shù)
    counterKey(key);
    //ignore
}

Redis 集群代理層統(tǒng)計(jì):

像 Twemproxy,codis 這些基于代理的 Redis 分布式架構(gòu),統(tǒng)一的入口,可以在 Proxy 層做收集上報(bào),但是缺點(diǎn)很明顯,并非所有的 Redis 集群架構(gòu)都有 proxy。

圖片描述

Redis 服務(wù)端收集:

監(jiān)控 Redis 單個(gè)分片的 QPS,發(fā)現(xiàn) QPS 傾斜到一定程度的節(jié)點(diǎn)進(jìn)行 monitor,獲取熱點(diǎn) key, Redis 提供了 monitor 命令,可以統(tǒng)計(jì)出一段時(shí)間內(nèi)的某 Redis 節(jié)點(diǎn)上的所有命令,分析熱點(diǎn) key,在高并發(fā)條件下,會(huì)存在內(nèi)存暴漲和 Redis 性能的隱患,所以此種方法適合在短時(shí)間內(nèi)使用;同樣只能統(tǒng)計(jì)一個(gè) Redis 節(jié)點(diǎn)的熱點(diǎn) key,對(duì)于集群需要匯總統(tǒng)計(jì),業(yè)務(wù)角度講稍微麻煩一點(diǎn)。

圖片描述

以上為說(shuō)的這 4 個(gè)方法都是現(xiàn)在業(yè)界比較常用的,方法,我通過(guò)學(xué)習(xí) Redis 源碼還有一個(gè)新的想法。第 5 種:修改 Redis 源碼。

 修改 Redis 源代碼:(從讀源碼中想到的思路)

我發(fā)現(xiàn) Redis4.0 為我們帶來(lái)了許多新特性,其中便包括基于 LFU 的熱點(diǎn) key 發(fā)現(xiàn)機(jī)制,有了這個(gè)新特性,我們就可以在此基礎(chǔ)上實(shí)現(xiàn)熱點(diǎn) key 的統(tǒng)計(jì),這個(gè)只是我的個(gè)人思路。

面試官心理:小伙子還挺有想法,思路挺開(kāi)闊,還打起了修改源碼的注意,我都沒(méi)這個(gè)野心。團(tuán)隊(duì)里就需要這樣的人。

(發(fā)現(xiàn)問(wèn)題,分析問(wèn)題,解決問(wèn)題,不等面試官發(fā)問(wèn),直接講述如何解決熱點(diǎn)數(shù)據(jù)問(wèn)題,這才是核心內(nèi)容)

3、如何解決熱點(diǎn)數(shù)據(jù)問(wèn)題

 答:關(guān)于如何治理熱點(diǎn)數(shù)據(jù)問(wèn)題,解決這個(gè)問(wèn)題主要從兩個(gè)方面考慮,第一是數(shù)據(jù)分片,讓壓力均攤到集群的多個(gè)分片上,防止單個(gè)機(jī)器打掛,第二是遷移隔離。

概括總結(jié):

key 拆分:

如果當(dāng)前 key 的類(lèi)型是一個(gè)二級(jí)數(shù)據(jù)結(jié)構(gòu),例如哈希類(lèi)型。如果該哈希元素個(gè)數(shù)較多,可以考慮將當(dāng)前 hash 進(jìn)行拆分,這樣該熱點(diǎn) key 可以拆分為若干個(gè)新的 key 分布到不同 Redis 節(jié)點(diǎn)上,從而減輕壓力

遷移熱點(diǎn) key:

以 Redis Cluster 為例,可以將熱點(diǎn) key 所在的 slot 單獨(dú)遷移到一個(gè)新的 Redis 節(jié)點(diǎn)上,這樣這個(gè)熱點(diǎn) key 即使 QPS 很高,也不會(huì)影響到整個(gè)集群的其他業(yè)務(wù),還可以定制化開(kāi)發(fā),熱點(diǎn) key 自動(dòng)遷移到獨(dú)立節(jié)點(diǎn)上,這種方案也較多副本。

熱點(diǎn) key 限流:

對(duì)于讀命令我們可以通過(guò)遷移熱點(diǎn) key 然后添加從節(jié)點(diǎn)來(lái)解決,對(duì)于寫(xiě)命令我們可以通過(guò)單獨(dú)針對(duì)這個(gè)熱點(diǎn) key 來(lái)限流。

增加本地緩存:

對(duì)于數(shù)據(jù)一致性不是那么高的業(yè)務(wù),可以將熱點(diǎn) key 緩存到業(yè)務(wù)機(jī)器的本地緩存中,因?yàn)槭菢I(yè)務(wù)端的本地內(nèi)存中,省去了一次遠(yuǎn)程的 IO 調(diào)用。但是當(dāng)數(shù)據(jù)更新時(shí),可能會(huì)造成業(yè)務(wù)和 Redis 數(shù)據(jù)不一致。

面試官:你回答得很好,考慮得很全面。

4、面試官:關(guān)于 Redis 最后一個(gè)問(wèn)題,Redis 支持豐富的數(shù)據(jù)類(lèi)型,那么這些數(shù)據(jù)類(lèi)型存儲(chǔ)的大 Value 如何解決,線(xiàn)上有遇到這種情況嗎?

 問(wèn)題分析:相比熱點(diǎn) key 大概念,大 Value 的概念比好好理解,由于 Redis 是單線(xiàn)程運(yùn)行的,如果一次操作的 value 很大會(huì)對(duì)整個(gè) redis 的響應(yīng)時(shí)間造成負(fù)面影響,因?yàn)?Redis 是 Key - Value 結(jié)構(gòu)數(shù)據(jù)庫(kù),大 value 就是單個(gè) value 占用內(nèi)存較大,對(duì) Redis 集群造成最直接的影響就是數(shù)據(jù)傾斜。

 答:(想難倒我?我可是有備而來(lái)。)

我先說(shuō)說(shuō)多大的 Value 算大,根據(jù)公司基礎(chǔ)架構(gòu)給出的經(jīng)驗(yàn)值可做以下劃分:

注:(經(jīng)驗(yàn)值不是標(biāo)準(zhǔn),都是根據(jù)集群運(yùn)維人員長(zhǎng)期觀察線(xiàn)上 case 總結(jié)出來(lái)的)

大:string 類(lèi)型 value > 10K,set、list、hash、zset 等集合數(shù)據(jù)類(lèi)型中的元素個(gè)數(shù) > 1000。

超大: string 類(lèi)型 value > 100K,set、list、hash、zset 等集合數(shù)據(jù)類(lèi)型中的元素個(gè)數(shù) > 10000。

由于 Redis 是單線(xiàn)程運(yùn)行的,如果一次操作的 value 很大會(huì)對(duì)整個(gè) redis 的響應(yīng)時(shí)間造成負(fù)面影響,所以,業(yè)務(wù)上能拆則拆,下面舉幾個(gè)典型的分拆方案:

  • 一個(gè)較大的 key-value 拆分成幾個(gè) key-value ,將操作壓力平攤到多個(gè) redis 實(shí)例中,降低對(duì)單個(gè) redis 的 IO 影響
  • 將分拆后的幾個(gè) key-value 存儲(chǔ)在一個(gè) hash 中,每個(gè) field 代表一個(gè)具體的屬性,使用 hget,hmget 來(lái)獲取部分的 value,使用 hset,hmset 來(lái)更新部分屬性。
  • hash、set、zset、list 中存儲(chǔ)過(guò)多的元素

類(lèi)似于場(chǎng)景一中的第一個(gè)做法,可以將這些元素分拆。

以 hash 為例,原先的正常存取流程是:

hget(hashKey, field); 
hset(hashKey, field, value)

現(xiàn)在,固定一個(gè)桶的數(shù)量,比如 10000,每次存取的時(shí)候,先在本地計(jì)算 field 的 hash 值,模除 10000,確定該 field 落在哪個(gè) key 上,核心思想就是將 value 打散,每次只 get 你需要的。

newHashKey = hashKey + (hash(field) % 10000); 
hset(newHashKey, field, value); 
hget(newHashKey, field)

面試官已經(jīng)被我折服,終于放棄了 Redis 的追問(wèn)。

總結(jié)

如果你對(duì) Redis 真對(duì)不是很熟悉,有些人干脆說(shuō)自己項(xiàng)目小,壓根沒(méi)有用過(guò) Redis,只知道一些理論知識(shí),那么我建議你讀者重點(diǎn)掌握《 說(shuō)說(shuō) Redis 中有哪些數(shù)據(jù)結(jié)構(gòu)及底層實(shí)現(xiàn)原理》《緩存必問(wèn):Redis 持久化,高可用集群》《Redis 雪崩,穿透,擊穿三連問(wèn)》這三篇,至于 Redis 熱點(diǎn)數(shù)據(jù)問(wèn)題,如果想要多談點(diǎn)工資盡量掌握。推薦閱讀《Redis 開(kāi)發(fā)與運(yùn)維》

以上就是面試分析分布式架構(gòu)Redis熱點(diǎn)key大Value解決方案的詳細(xì)內(nèi)容,更多關(guān)于分布式架構(gòu)面試Redis熱點(diǎn)key大Value的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redis事務(wù)常用操作詳解

    redis事務(wù)常用操作詳解

    在本篇文章里小編給大家分享了關(guān)于redis事務(wù)常用操作的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2019-07-07
  • 基于session?Redis實(shí)現(xiàn)登錄

    基于session?Redis實(shí)現(xiàn)登錄

    這篇文章主要介紹了基于session?Redis實(shí)現(xiàn)登錄的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Redis Cluster原理及配置詳解

    Redis Cluster原理及配置詳解

    這篇文章主要為大家介紹了Redis Cluster原理及配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 使用Redis存儲(chǔ)SpringBoot項(xiàng)目中Session的詳細(xì)步驟

    使用Redis存儲(chǔ)SpringBoot項(xiàng)目中Session的詳細(xì)步驟

    在開(kāi)發(fā)Spring Boot項(xiàng)目時(shí),我們通常會(huì)遇到如何高效管理Session的問(wèn)題,默認(rèn)情況下,Spring Boot會(huì)將Session存儲(chǔ)在內(nèi)存中,今天,我們將學(xué)習(xí)如何將Session存儲(chǔ)從內(nèi)存切換到Redis,并驗(yàn)證配置是否成功,需要的朋友可以參考下
    2024-06-06
  • redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖

    redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖

    這篇文章主要介紹了redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2013-09-09
  • Redis?Lua腳本實(shí)現(xiàn)ip限流示例

    Redis?Lua腳本實(shí)現(xiàn)ip限流示例

    這篇文章主要介紹了Redis?Lua腳本實(shí)現(xiàn)ip限流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 使用redis實(shí)現(xiàn)高效分頁(yè)的項(xiàng)目實(shí)踐

    使用redis實(shí)現(xiàn)高效分頁(yè)的項(xiàng)目實(shí)踐

    在很多場(chǎng)景下,我們需要對(duì)大量的數(shù)據(jù)進(jìn)行分頁(yè)展示,本文主要介紹了使用redis實(shí)現(xiàn)高效分頁(yè)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • redis集群搭建過(guò)程(非常詳細(xì),適合新手)

    redis集群搭建過(guò)程(非常詳細(xì),適合新手)

    這篇文章主要介紹了redis集群搭建過(guò)程,Redis集群至少需要3個(gè)節(jié)點(diǎn),因?yàn)橥镀比蒎e(cuò)機(jī)制要求超過(guò)半數(shù)節(jié)點(diǎn)認(rèn)為某個(gè)節(jié)點(diǎn)掛了該節(jié)點(diǎn)才是掛了,所以2個(gè)節(jié)點(diǎn)無(wú)法構(gòu)成集群,具體搭建過(guò)程跟隨小編一起看看吧
    2021-11-11
  • 基于redis實(shí)現(xiàn)token驗(yàn)證用戶(hù)是否登陸

    基于redis實(shí)現(xiàn)token驗(yàn)證用戶(hù)是否登陸

    這篇文章主要為大家詳細(xì)介紹了基于redis實(shí)現(xiàn)token驗(yàn)證用戶(hù)是否登陸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Redis Redisson lock和tryLock的原理分析

    Redis Redisson lock和tryLock的原理分析

    這篇文章主要介紹了Redis Redisson lock和tryLock的原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評(píng)論

泗阳县| 师宗县| 北辰区| 玉山县| 堆龙德庆县| 苏州市| 当涂县| 墨脱县| 大竹县| 永兴县| 东莞市| 鹤峰县| 利辛县| 河西区| 临夏市| 绿春县| 随州市| 本溪市| 岳池县| 抚顺县| 钦州市| 黄骅市| 阿合奇县| 岫岩| 湖北省| 葵青区| 邵阳县| 阿克苏市| 呼图壁县| 海晏县| 黄山市| 龙山县| 贡觉县| 兴城市| 安徽省| 察隅县| 原平市| 宁城县| 新蔡县| 南召县| 西平县|