DSH 0.1.7 引入了基於引用計數的會話管理機制:主視圖切換會話時會釋放舊會話的引用,當引用計數歸零,該會話的 generation(包含本地數據、作用域 Context 和歷史窗口)會被銷燬。切回該會話時,系統會重建一個新的 generation 並重新拉取歷史記錄(至少 50 條消息),這會導致界面顯示“Loading history…”。
dsh-session-keepwarm 插件通過爲最近使用過的會話持有額外的引用,防止其被銷燬。切回這些會話時,可以直接複用內存中已加載的歷史窗口,避免重複讀取。該插件實現了一個基於 keepWarm 設置的 LRU(最近最少使用)緩存,在減少歷史重讀的同時控制內存佔用。
基本信息¶
- 名稱:dsh-session-keepwarm
- 作者:dzwalker
- 分類:記憶
- 許可證:MIT
核心功能¶
- 持有額外引用:爲最近使用過的會話持有額外的引用,確保其不會因爲引用計數歸零而被銷燬。
- 複用歷史窗口:切回已保活的會話時,複用內存中已有的歷史窗口。由於
Session.open()對已打開會話是冪等的,因此不會再次拉取歷史。 - LRU 緩存:實現了一個 LRU 緩存,上限由
keepWarm設置決定,防止無限佔用內存。 - 會話監控:監控
sessions.list快照,當檢測到會話被切換到時,將其移動到 LRU 隊列頭部。 - 僅支持普通會話:只處理普通會話;子代理行有自己的生命週期管理,不受此插件影響。
- 輕量級保活:只保活客戶端本地數據和歷史流,不會啓動或持有 Host Agent。
安裝與啓用¶
通過以下命令安裝插件:
dsh plugin --profile web add dsh-session-keepwarm
安裝後,在對應的 profile 中啓用該插件。
配置與使用¶
插件的配置項定義在 session-keepwarm profile 條目下:
| 配置項 | 默認值 | 說明 |
|---|---|---|
enabled |
true |
總開關。設爲 false 會釋放所有被保活的引用。 |
keepWarm |
5 |
保活最近使用會話的數量。範圍通常爲 1 到 20。值越大,佔用瀏覽器內存越多。 |
適用場景與限制¶
- 僅限同標籤頁:該插件只對同一個標籤頁內的會話狀態有效。客戶端不在標籤頁或瀏覽器之間共享會話狀態(無 SharedWorker 或 BroadcastChannel),因此新窗口或新瀏覽器打開會話時仍需重新加載歷史。
- 首次打開仍需加載:即使會話被保活,第一次在任何標籤頁打開該會話時,仍然需要加載歷史記錄。保活隻影響“切走之後切回來”的場景。
- 退出條件:這是一個臨時方案。如果上游 DSH 客戶端添加了原生的“保留最近 N 個會話”設置或等價的延遲銷燬策略,應優先使用上游設置並移除此插件。
總結¶
dsh-session-keepwarm 通過簡單的引用計數補充,解決了 DSH 0.1.7+ 版本中會話切換時的歷史重讀問題。它適合需要頻繁在多個會話間切換以減少歷史加載延遲的用戶,但需注意其內存佔用與同標籤頁的限制。