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//! - 读取 JSON:[`get_member_all_json_cached`](缓存命中零拷贝)
10//! - 失效:组员增删改后 [`invalidate_member_all`]
11
12use crate::{
13    app::AppState, common::result::ResultBody, entity::member::MemberCache, utils::fast_json,
14};
15use std::sync::Arc;
16
17/// 缓存键(单条目)
18const CACHE_KEY: &str = "member_all";
19/// 结构化值缓存命名空间
20const VALUE_NS: &str = "member_all";
21
22/// 全量组员缓存条目(结构化数据 + 预序列化 JSON)
23#[derive(Clone)]
24pub struct MemberAllCacheEntry {
25    /// 组员轻量列表
26    pub data: Vec<MemberCache>,
27    /// `ResultBody` 序列化后的 JSON 字节
28    pub json: Arc<Vec<u8>>,
29}
30
31/// 全量组员列表缓存类型
32pub struct MemberAllCache;
33
34/// 创建全量组员列表缓存实例
35pub fn new_member_all_cache() -> MemberAllCache {
36    MemberAllCache
37}
38
39/// 使全量组员列表缓存失效
40pub async fn invalidate_member_all(state: &AppState) {
41    state.redis.del_json(CACHE_KEY).await;
42    state.redis.del_value(VALUE_NS, CACHE_KEY).await;
43}
44
45/// 获取缓存键名
46pub fn member_all_cache_key() -> &'static str {
47    CACHE_KEY
48}
49
50/// 读取预序列化 JSON,未命中返回 `None`
51pub async fn get_member_all_json_cached(state: &AppState) -> Option<Arc<Vec<u8>>> {
52    state.redis.get_json_bytes(CACHE_KEY).await
53}
54
55/// 读取全量组员结构化缓存,未命中返回 `None`
56pub async fn get_member_all_cached(state: &AppState) -> Option<Vec<MemberCache>> {
57    state.redis.get_value(VALUE_NS, CACHE_KEY).await
58}
59
60/// 写入全量组员缓存(含预序列化 JSON)
61pub async fn set_member_all_cached(state: &AppState, data: Vec<MemberCache>) {
62    let body = ResultBody::success_data(&data);
63    let json = match fast_json::to_vec(&body) {
64        Ok(bytes) => Arc::new(bytes),
65        Err(_) => return,
66    };
67    state
68        .redis
69        .set_json_bytes_ttl(CACHE_KEY, json.as_ref(), cache_ttl_secs())
70        .await;
71    state
72        .redis
73        .set_value_ttl(VALUE_NS, CACHE_KEY, &data, cache_ttl_secs())
74        .await;
75}
76
77/// 读取 TTL 秒数
78fn cache_ttl_secs() -> u64 {
79    std::env::var("MEMBER_ALL_CACHE_SECS")
80        .ok()
81        .and_then(|v| v.parse().ok())
82        .unwrap_or(60)
83}