Skip to main content

tdm_server_rust/cache/
member_episode_cache.rs

1//! 组员话数分页短 TTL 缓存
2//!
3//! ## 使用说明
4//!
5//! - Key:`member_episodes:{memberId}:{page}:{pageSize}`
6//! - 读取:[`get_member_episode_json_cached`]
7//! - 失效:接稿/交稿后 [`invalidate_member_episodes`]
8
9use crate::{
10    app::AppState,
11    common::{page_bean::PageBean, result::ResultBody},
12    entity::member::MemberEpisodeVo,
13    utils::fast_json,
14};
15use std::sync::Arc;
16
17/// 组员话数分页缓存标记类型
18pub struct MemberEpisodePageCache;
19
20/// 读取 TTL 秒数
21fn cache_ttl_secs() -> u64 {
22    std::env::var("MEMBER_EPISODE_CACHE_SECS")
23        .ok()
24        .and_then(|v| v.parse().ok())
25        .unwrap_or(60)
26}
27
28/// 创建组员话数分页缓存
29pub fn new_member_episode_page_cache() -> MemberEpisodePageCache {
30    MemberEpisodePageCache
31}
32
33/// 缓存键
34pub fn member_episode_cache_key(member_id: i32, page: i32, page_size: i32) -> String {
35    format!("member_episodes:{member_id}:{page}:{page_size}")
36}
37
38/// 读取预序列化 JSON
39pub async fn get_member_episode_json_cached(state: &AppState, key: &str) -> Option<Arc<Vec<u8>>> {
40    state.redis.get_json_bytes(key).await
41}
42
43/// 写入预序列化 JSON
44pub async fn set_member_episode_json_cached(
45    state: &AppState,
46    key: String,
47    page: PageBean<MemberEpisodeVo>,
48) {
49    let body = ResultBody::success_data(&page);
50    let json = match fast_json::to_vec(&body) {
51        Ok(bytes) => Arc::new(bytes),
52        Err(_) => return,
53    };
54    state
55        .redis
56        .set_json_bytes_ttl(&key, json.as_ref(), cache_ttl_secs())
57        .await;
58}
59
60/// 使指定组员的话数分页缓存失效
61pub async fn invalidate_member_episodes(state: &AppState, member_id: i32) {
62    state
63        .redis
64        .del_json_pattern(&format!("member_episodes:{member_id}:*"))
65        .await;
66}