【限流算法】滑動(dòng)時(shí)間窗口,最核心邏輯

slidingWindow.jpeg

核心原理

滑動(dòng)時(shí)間窗口的核心原理是: 我們先確認(rèn)一個(gè)窗口,這個(gè)創(chuàng)建就是一個(gè)單位時(shí)間,比如10s, 統(tǒng)計(jì)10s內(nèi)某個(gè)Redis的Key訪問(wèn)次數(shù),這個(gè)10s就是一個(gè)單位時(shí)間窗口,如果僅僅以10s一個(gè)單位來(lái)做統(tǒng)計(jì),這個(gè)就太粗糙了,而且結(jié)果不準(zhǔn)確。

通常的做法是,將這個(gè)10s的窗口,進(jìn)行一個(gè)切分,比如切分10個(gè)小塊,每個(gè)小塊代表 1 秒,這個(gè)切分的步驟,它的思想是來(lái)源于 桶排序中,桶的劃分思想, 桶排序這個(gè)思想可以應(yīng)用于很多方面,利用桶排序思想,其實(shí)我們具體利用的不是他的排序功能,而是這個(gè) 的功能。

比如 Java中的高性能計(jì)數(shù)器 LongAddr ,底層的邏輯核心思想也是 的思想

核心邏輯

既然利用滑動(dòng)時(shí)間窗口做統(tǒng)計(jì), 這里面的最核心的一個(gè)步驟,我覺(jué)得并不是 如何 做統(tǒng)計(jì),而是 確認(rèn)當(dāng)前時(shí)間在窗口中的哪個(gè)小方塊中,具體統(tǒng)計(jì)的計(jì)算,只是很自然的一步。
這里我們把小方塊稱為 , 對(duì)于當(dāng)前時(shí)間,如何確定它應(yīng)該放在哪個(gè)桶里面呢?
其實(shí)很簡(jiǎn)單:

  1. (當(dāng)前時(shí)間 - 窗口起始時(shí)間) / 1, 這里的 1 表示一個(gè)桶的規(guī)格,實(shí)際也可以是3,4,5等

直接看代碼
timeMillisPerSlice: 每個(gè)桶的大小
timeSliceSize:窗口內(nèi)共有多少桶

    /**
     * 計(jì)算當(dāng)前所在的時(shí)間片的位置
     */
    private int currentIndex() {
        long now = System.currentTimeMillis();
        // 如果當(dāng)前的key已經(jīng)超出一整個(gè)時(shí)間片了,那么就直接初始化就行了,不用去計(jì)算了
        if (now - lastAddTimestamp > timeMillisPerSlice * windowSize) {
            reset();
        }
        return (int) (((now - beginTimestamp) / timeMillisPerSlice) % timeSliceSize);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 之前發(fā)過(guò)一篇文章,介紹了alibaba Sentinel限流功能。Alibaba Sentinel限流功能[htt...
    北交吳志煒閱讀 2,421評(píng)論 0 3
  • 在網(wǎng)上搜滑動(dòng)時(shí)間窗口限流算法,大多都太復(fù)雜了,本人實(shí)現(xiàn)了個(gè)簡(jiǎn)單的,先上代碼: 運(yùn)行可以看到,任意10秒內(nèi),通過(guò)的次...
    Java弟中弟閱讀 497評(píng)論 0 2
  • 高并發(fā)的處理有三個(gè)比較常用的手段,緩存,限流和降級(jí)。緩存的使用相信很多開(kāi)發(fā)者都很了解了,諸如redis,memca...
    菜six歲閱讀 4,813評(píng)論 1 16
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,837評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 8,087評(píng)論 0 4

友情鏈接更多精彩內(nèi)容