您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關什么是ringbuffer,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
嗯,正如名字所說的一樣,它是一個環(首尾相接的環),你可以把它用做在不同上下文(線程、協程)間傳遞數據的buffer。
基本來說,ringbuffer擁有一個固定長度,且每個位置有一個序號,并且是連續的。
隨著你不停地填充這個buffer(可能也會有相應的讀取),這個序號會一直增長,直到繞過這個環。
一般,ringbuffer都是由數組實現,而由于其在內存上的連續性,因此性能得到了極高的提升。
從數組上看,是這樣的,不再是環形。
一般定義的數據結構
type RingBuffer struct{ buffer []interface{} read uint64 //讀的位置 write uint64 //寫的位置 size uint64 //緩沖區大小 }
幾大概念:
read == write 時,緩沖區為空
(write + 1) % size == read, 緩沖區滿了
ringbuffer看上去是一個環,但是實際上是一個數組,寫入到數組尾部之后需要繞回到數組首部。但是由于數據包的大小是不定大小,所以到了尾部可能會出現數據分割,包一半在尾部一半在開頭,對應的讀取的時候數據包一半在尾部,一半在開頭需要把它們合并起來。
當寫入速度大于讀取速度時,新寫入數據會與未讀數據發生覆蓋,這樣就有兩種決策:覆蓋未讀數據和丟棄新寫入數據。
由于ringbuffer是通過覆蓋寫入數據,并不會刪除未讀數據,所以就通過ringbuffer中的read來判斷是否還有未讀數據。
假設一個消費場景,消費是耗時的,只有當消費者確認了,這個對象已經被消費掉了,才能被釋放掉資源。這時候就需要重讀/重寫
我們使用 Ring Buffer 這種數據結構,是因為它給我們提供了可靠的消息傳遞特性。
這個理由就足夠了,不過它還有一些其他的優點。
首先,Ring Buffer 比鏈表要快,因為它是數組,而且有一個容易預測的訪問模式。
CPU 高速緩存友好 (CPU-cache-friendly)-數據可以在硬件層面預加載到高速緩存,因此 CPU 不需要經常回到主內存 RAM 里去尋找 Ring Buffer 的下一條數據。
Ring Buffer 是一個數組,你可以預先分配內存,并保持數組元素永遠有效。這意味著內存垃圾收集(GC)在這種情況下幾乎什么也不用做。此外,也不像鏈表那樣每增加一條數據都要創建對象-當這些數據從鏈表里刪除時,這些對象都要被清理掉。
以上就是什么是ringbuffer,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。