Skip to main content

tdm_server_rust/cache/
collect_list_cache.rs

1//! 组员收藏列表分页短 TTL JSON 缓存
2//!
3//! ## 使用说明
4//!
5//! - Key:`collect_list:{memberId}:{page}:{pageSize}`
6//! - 读取:[`get_collect_list_json_cached`]
7//! - 失效:收藏增删后 [`invalidate_collect_list`]
8
9use crate::{
10    app::AppState,
11    common::{page_bean::PageBean, result::ResultBody},
12    entity::manga::MangaListVo,
13    utils::fast_json,
14};
15use std::sync::Arc;
16
17/// 收藏列表分页缓存标记类型
18pub struct CollectListPageCache;
19
20/// 读取 TTL 秒数
21fn cache_ttl_secs() -> u64 {
22    std::env::var("COLLECT_LIST_CACHE_SECS")
23        .ok()
24        .and_then(|v| v.parse().ok())
25        .unwrap_or(60)
26}
27
28/// 创建收藏列表分页缓存
29pub fn new_collect_list_page_cache() -> CollectListPageCache {
30    CollectListPageCache
31}
32
33/// 缓存键
34pub fn collect_list_cache_key(member_id: i32, page: i32, page_size: i32) -> String {
35    format!("collect_list:{member_id}:{page}:{page_size}")
36}
37
38/// 读取预序列化 JSON
39pub async fn get_collect_list_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_collect_list_json_cached(
45    state: &AppState,
46    key: String,
47    page: PageBean<MangaListVo>,
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_collect_list(state: &AppState, member_id: i32) {
62    state
63        .redis
64        .del_json_pattern(&format!("collect_list:{member_id}:*"))
65        .await;
66}