將 oic-cache 的核心數(shù)據(jù)類型從 Vec<u8> 遷移到 bytes::Bytes,以提升性能并與 Axum 生態(tài)系統(tǒng)保持一致。
主要變更
1. 核心類型更新
-
StorageLocation:
Inline(Vec<u8>)→Inline(Bytes) -
API 返回類型:
Option<Vec<u8>>→Option<Bytes> -
API 參數(shù)類型:
Vec<u8>→impl Into<Bytes>
2. 存儲層優(yōu)化
-
read_inline(): 返回Bytes,零拷貝 Clone -
read_file(): 返回Bytes,零成本轉(zhuǎn)換 -
compress()/decompress(): 返回Bytes
3. 應(yīng)用層適配
-
oic-web服務(wù)層和控制器層已更新 - 所有測試和示例代碼已遷移
性能提升
1. 零拷貝 Clone
之前 (Vec<u8>):
let data = cached_data.clone(); // O(n) 內(nèi)存復(fù)制
現(xiàn)在 (Bytes):
let data = cached_data.clone(); // O(1) 引用計數(shù)
收益:
- 內(nèi)聯(lián)存儲(< 4KB)的 Clone 操作從 O(n) 降至 O(1)
- 緩存命中時的數(shù)據(jù)傳遞零拷貝
- 在高并發(fā)場景下顯著減少內(nèi)存分配和復(fù)制開銷
2. 內(nèi)存效率
-
Bytes使用引用計數(shù),多個引用共享同一份底層數(shù)據(jù) - 減少不必要的內(nèi)存分配
- 降低 GC 壓力(雖然 Rust 沒有 GC,但減少分配有助于內(nèi)存管理)
3. 與 Axum 生態(tài)一致
- Axum 底層使用
Bytes類型 - 減少類型轉(zhuǎn)換開銷(
Vec<u8>→Bytes) - 更好的互操作性
實際場景性能影響
緩存命中場景
- 之前: 每次緩存命中需要復(fù)制整個數(shù)據(jù)(O(n))
- 現(xiàn)在: 僅增加引用計數(shù)(O(1))
- 提升: 對于 10KB 的緩存數(shù)據(jù),減少約 10KB 的內(nèi)存復(fù)制
并發(fā)讀取場景
- 之前: 1000 個并發(fā)讀取 = 1000 次完整數(shù)據(jù)復(fù)制
- 現(xiàn)在: 1000 個并發(fā)讀取 = 1 次數(shù)據(jù)分配 + 1000 次引用計數(shù)操作
-
提升: 內(nèi)存使用量從
1000 × data_size降至1 × data_size
內(nèi)聯(lián)存儲場景
-
之前: 每次
read_inline()返回都需要復(fù)制數(shù)據(jù) - 現(xiàn)在: 零拷貝返回,多個引用共享同一份數(shù)據(jù)
- 提升: 小數(shù)據(jù)(< 4KB)的讀取性能提升顯著
技術(shù)優(yōu)勢
-
零拷貝語義:
Bytes實現(xiàn)了零拷貝的 Clone,適合高并發(fā)場景 -
內(nèi)存共享: 多個
Bytes實例可以共享底層數(shù)據(jù),減少內(nèi)存占用 - 類型安全: 保持強(qiáng)類型,編譯時檢查
- 生態(tài)兼容: 與 Axum、Hyper 等 HTTP 框架原生兼容

bytes.png