Skip to main content

yggdrasil/tasks/
session_cleanup.rs

1//! 会话过期清理后台任务。
2//!
3//! 仅在 `server` feature 启用时编译,每小时运行一次。
4
5use std::time::Duration;
6
7use tokio::time::interval;
8
9use crate::db::pool::get_conn;
10
11/// 启动会话清理循环,每小时删除 `expires_at < NOW()` 的过期会话。
12pub async fn run_cleanup() {
13    // 每小时触发一次
14    let mut ticker = interval(Duration::from_secs(3600));
15    loop {
16        match get_conn().await {
17            Ok(client) => {
18                // 删除已过期会话
19                match client
20                    .execute("DELETE FROM sessions WHERE expires_at < NOW()", &[])
21                    .await
22                {
23                    Ok(_) => {
24                        // 同时清空内存中的会话缓存,避免已失效会话继续命中。
25                        crate::cache::SESSION_CACHE.invalidate_all();
26                    }
27                    Err(e) => {
28                        tracing::error!("Session cleanup error: {:?}", e);
29                    }
30                }
31            }
32            Err(e) => {
33                tracing::error!("Failed to get DB connection for cleanup: {:?}", e);
34            }
35        }
36        ticker.tick().await;
37    }
38}