Skip to main content

we_trust_sqlite/reader/
cache.rs

1use crate::reader::BTreePage;
2use parking_lot::Mutex;
3use std::collections::{HashMap, VecDeque};
4use tokio::sync::RwLock;
5
6/// 简单的 Page 缓存,支持 LRU 淘汰策略
7pub struct PageCache {
8    pages: RwLock<HashMap<u32, BTreePage>>,
9    lru_order: Mutex<VecDeque<u32>>,
10    capacity: usize,
11}
12
13impl PageCache {
14    pub fn new(capacity: usize) -> Self {
15        Self {
16            pages: RwLock::new(HashMap::new()),
17            lru_order: Mutex::new(VecDeque::new()),
18            capacity,
19        }
20    }
21
22    pub async fn get(&self, page_id: u32) -> Option<BTreePage> {
23        let pages = self.pages.read().await;
24        if let Some(page) = pages.get(&page_id) {
25            // 更新 LRU 顺序
26            let mut order = self.lru_order.lock();
27            if let Some(pos) = order.iter().position(|&id| id == page_id) {
28                order.remove(pos);
29            }
30            order.push_back(page_id);
31            return Some(page.clone());
32        }
33        None
34    }
35
36    pub async fn insert(&self, page_id: u32, page: BTreePage) {
37        let mut pages = self.pages.write().await;
38        let mut order = self.lru_order.lock();
39
40        // 如果已存在,先移除旧的
41        if pages.contains_key(&page_id) {
42            if let Some(pos) = order.iter().position(|&id| id == page_id) {
43                order.remove(pos);
44            }
45        } else if pages.len() >= self.capacity {
46            // 触发淘汰
47            if let Some(oldest_id) = order.pop_front() {
48                pages.remove(&oldest_id);
49            }
50        }
51
52        pages.insert(page_id, page);
53        order.push_back(page_id);
54    }
55
56    pub async fn clear(&self) {
57        let mut pages = self.pages.write().await;
58        let mut order = self.lru_order.lock();
59        pages.clear();
60        order.clear();
61    }
62}