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