Skip to main content

tdm_server_rust/cache/
member_all_cache.rs

1//! 全量组员列表缓存
2//!
3//! 缓存全体组员的轻量信息列表(ID、用户名、职阶、邮箱、岗位 ID)。
4//! 用于组员下拉选择、@提及等高频读取场景。
5//! TTL 默认 60 秒,可通过 `MEMBER_ALL_CACHE_SECS` 环境变量调整。
6//!
7//! ## 缓存设计
8//!
9//! - **单 Key**: 全局只有一个条目(`"member_all"`)
10//! - **Value**: `Arc<Vec<MemberCache>>`(全量组员轻量视图)
11//! - **失效**: 组员增删改后调用 [`invalidate_member_all`]
12
13use crate::{app::AppState, entity::member::MemberCache};
14use std::sync::Arc;
15use std::time::Duration;
16
17/// 缓存键(单条目)
18const CACHE_KEY: &str = "member_all";
19
20/// 全量组员列表缓存类型
21pub type MemberAllCache = moka::future::Cache<String, Arc<Vec<MemberCache>>>;
22
23/// 创建全量组员列表缓存实例
24///
25/// TTL 由环境变量 `MEMBER_ALL_CACHE_SECS` 控制,默认 60 秒。
26pub fn new_member_all_cache() -> MemberAllCache {
27    let ttl_secs = std::env::var("MEMBER_ALL_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_member_all(state: &AppState) {
40    state.member_all_cache.invalidate(CACHE_KEY).await;
41}
42
43/// 获取缓存键名
44pub fn member_all_cache_key() -> &'static str {
45    CACHE_KEY
46}