去字節面試被面這題能答上來嗎?談談你對時間輪的理解?
?1.什么是時間輪
時間輪,簡單理解就是一種=個用來存儲定時任務的環狀數組,它的工作原理和鐘表的表盤類似。
它由兩個部分組成, 一個是環狀數組,另一個是遍歷環狀數組的指針。
首先,要定義一個固定長度的環狀數組,然后數組的每一個元素代表一個時間刻度,假設每個刻度間隔是 1s,那么長度為 8 的數組,就代表 8 秒鐘。
然后,就是有一個指針,這個指針按照順時針無限地循環這個數組,每隔1個最小的時間單位就前進一個數組索引。
這個指針完整地轉1圈,就代表 8 秒鐘,轉兩圈表示 16 秒,假設從 0 點 0 分 0 秒開始,轉
一圈以后就到了 0 點 0 分 9 秒鐘。
2.工作原理
時間輪,環狀數組里面的每個元素,都是用來存儲定時任務的容器,當我們向時間輪里面添加一個定時任務的時候,我們會根據定時任務的執行時間計算它所存儲的數組下標。當然,有可能在某個時間刻度上會存在多個定時任務,這個時候會采用雙向鏈表的方式來存儲。
當指針指向某個數組的時候,就會把這個數組中存儲的任務取出來,然后遍歷這個鏈表逐個運行里面的任務。
那如果某個定時任務的執行時間大于環形數組所表示的長度,一般可以使用一個圈數來表示該任務的延遲執行時間。比如,1個第 16 秒要執行的任務,那意味著這個任務應該是在第2圈的數組下標 為0 的位置執行。
3.優、缺點分析
使用時間輪的方式來管理多個定時任務的好處有很多,我認為有兩個比較重要的優點:
(1)減少定時任務添加和刪除的時間復雜度,提升性能。
(2)可以保證每次執行定時器任務都是 O(1)復雜度,在定時器任務密集的情況下,性能優勢非常明顯。
當然,時間輪也有缺點,對于執行時間非常嚴格的任務,時間輪不是很適合,因為時間輪算法的精度取決于最小時間單元的粒度。假設以 1s 為一個時間刻度,那小于 1s 的任務就無法被時間輪調度。
時間輪算法在很多框架中都有用到,比如 Dubbo、Netty、Kafka 等。
時間輪算法也是一個比較經典的設計。使用范圍比較廣,但是在實際應用中,大部分同學接觸非常少。我認為這種設計思想或者這種數據結構,在我們實際應用中的某些特定場景也是可以借鑒和使用的。比如定時重試、衰減重試等等。