Skip to main content

tdm_server_rust/cache/
member_workbench_cache.rs

1//! 组员工作台短 TTL JSON 缓存
2//!
3//! ## 使用说明
4//!
5//! - 总览 Key:`workbench_overview:{memberId}`
6//! - 任务 Key:`workbench_tasks:{memberId}:{page}:{pageSize}:{tab}:{view}:{keyword}`,分页单位为漫画组
7//! - 读取:接口层命中后直接返回预序列化 JSON
8//! - 失效:接稿、交稿、岗位、漫画名或成员相关变更后调用失效函数
9
10use crate::{
11    app::AppState,
12    common::{page_bean::PageBean, result::ResultBody},
13    entity::member::{MemberWorkbenchOverview, MemberWorkbenchTaskGroup},
14    utils::fast_json,
15};
16use std::sync::Arc;
17
18/// 工作台缓存标记类型
19pub struct MemberWorkbenchCache;
20
21/// 创建工作台缓存实例
22pub fn new_member_workbench_cache() -> MemberWorkbenchCache {
23    MemberWorkbenchCache
24}
25
26/// 读取 TTL 秒数
27fn cache_ttl_secs() -> u64 {
28    std::env::var("MEMBER_WORKBENCH_CACHE_SECS")
29        .ok()
30        .and_then(|v| v.parse().ok())
31        .unwrap_or(60)
32}
33
34/// 工作台总览缓存键
35pub fn member_workbench_overview_cache_key(member_id: i32) -> String {
36    format!("workbench_overview:{member_id}")
37}
38
39/// 工作台任务分页缓存键
40pub fn member_workbench_tasks_cache_key(
41    member_id: i32,
42    tab: &str,
43    view: &str,
44    keyword: Option<&str>,
45    page: i32,
46    page_size: i32,
47) -> String {
48    let keyword = keyword.unwrap_or("").trim();
49    format!("workbench_tasks:{member_id}:{page}:{page_size}:{tab}:{view}:{keyword}")
50}
51
52/// 读取工作台总览 JSON
53pub async fn get_workbench_overview_json_cached(
54    state: &AppState,
55    key: &str,
56) -> Option<Arc<Vec<u8>>> {
57    state.redis.get_json_bytes(key).await
58}
59
60/// 写入工作台总览 JSON
61pub async fn set_workbench_overview_json_cached(
62    state: &AppState,
63    key: String,
64    data: MemberWorkbenchOverview,
65) {
66    let body = ResultBody::success_data(&data);
67    let json = match fast_json::to_vec(&body) {
68        Ok(bytes) => Arc::new(bytes),
69        Err(_) => return,
70    };
71    state
72        .redis
73        .set_json_bytes_ttl(&key, json.as_ref(), cache_ttl_secs())
74        .await;
75}
76
77/// 读取工作台任务分页 JSON
78pub async fn get_workbench_tasks_json_cached(state: &AppState, key: &str) -> Option<Arc<Vec<u8>>> {
79    state.redis.get_json_bytes(key).await
80}
81
82/// 写入工作台任务漫画组分页 JSON
83pub async fn set_workbench_tasks_json_cached(
84    state: &AppState,
85    key: String,
86    data: PageBean<MemberWorkbenchTaskGroup>,
87) {
88    let body = ResultBody::success_data(&data);
89    let json = match fast_json::to_vec(&body) {
90        Ok(bytes) => Arc::new(bytes),
91        Err(_) => return,
92    };
93    state
94        .redis
95        .set_json_bytes_ttl(&key, json.as_ref(), cache_ttl_secs())
96        .await;
97}
98
99/// 使指定组员工作台缓存失效
100pub async fn invalidate_member_workbench(state: &AppState, member_id: i32) {
101    state
102        .redis
103        .del_json(&member_workbench_overview_cache_key(member_id))
104        .await;
105    state
106        .redis
107        .del_json_pattern(&format!("workbench_tasks:{member_id}:*"))
108        .await;
109}
110
111/// 使全部组员工作台缓存失效
112pub async fn invalidate_all_member_workbenches(state: &AppState) {
113    state.redis.del_json_pattern("workbench_overview:*").await;
114    state.redis.del_json_pattern("workbench_tasks:*").await;
115}