Skip to main content

tdm_server_rust/cache/
manga_name_cache.rs

1//! 漫画译名/原名列表缓存
2//!
3//! 缓存全量漫画的译名和原名 ID→名称映射列表。
4//! 用于前端下拉选择框和漫画名称搜索。
5//! TTL 默认 60 秒,可通过 `MANGA_NAME_CACHE_SECS` 环境变量调整。
6//!
7//! ## 缓存设计
8//!
9//! - **单 Key**: 全局只有一个条目(`"manga_tran_names"`),存储全量列表
10//! - **Value**: `Arc<Vec<MangaSimpleVo>>`(包含 ID 和名称的简 VO 列表)
11//! - **失效**: 漫画增删改后调用 [`invalidate_manga_names`] 同时失效译名和原名缓存
12
13use crate::{app::AppState, entity::manga::MangaSimpleVo};
14use std::sync::Arc;
15use std::time::Duration;
16
17/// 缓存键(单条目,译名和原名共用此键名)
18const CACHE_KEY: &str = "manga_tran_names";
19
20/// 译名/原名列表缓存类型
21pub type MangaTranNameCache = moka::future::Cache<String, Arc<Vec<MangaSimpleVo>>>;
22
23/// 创建译名/原名列表缓存实例
24///
25/// TTL 由环境变量 `MANGA_NAME_CACHE_SECS` 控制,默认 60 秒。
26pub fn new_manga_tran_name_cache() -> MangaTranNameCache {
27    let ttl_secs = std::env::var("MANGA_NAME_CACHE_SECS")
28        .ok()
29        .and_then(|v| v.parse().ok())
30        .unwrap_or(60);
31    moka::future::Cache::builder()
32        .time_to_live(Duration::from_secs(ttl_secs))
33        .build()
34}
35
36/// 使译名和原名列表缓存同时失效
37///
38/// 漫画新增、更新、删除后调用。
39pub async fn invalidate_manga_names(state: &AppState) {
40    state.manga_tran_name_cache.invalidate(CACHE_KEY).await;
41    state.manga_ori_name_cache.invalidate(CACHE_KEY).await;
42}
43
44/// 获取缓存键名
45pub fn cache_key() -> &'static str {
46    CACHE_KEY
47}