feat(posts): invalidate search cache on writes

This commit is contained in:
xfy 2026-06-17 17:21:01 +08:00
parent c40a771989
commit c780247d17
5 changed files with 12 additions and 0 deletions

View File

@ -143,6 +143,7 @@ pub async fn create_post(
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
// 失效按 slug 缓存,避免之前缓存的 404 继续命中。 // 失效按 slug 缓存,避免之前缓存的 404 继续命中。
crate::cache::invalidate_post_by_slug(&final_slug).await; crate::cache::invalidate_post_by_slug(&final_slug).await;
// 失效该文章涉及的所有标签下文章列表缓存。 // 失效该文章涉及的所有标签下文章列表缓存。

View File

@ -80,6 +80,7 @@ pub async fn delete_post(post_id: i32) -> Result<CreatePostResponse, ServerFnErr
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
crate::cache::invalidate_post_by_slug(&slug).await; crate::cache::invalidate_post_by_slug(&slug).await;
crate::cache::invalidate_tag_posts_for(&tags).await; crate::cache::invalidate_tag_posts_for(&tags).await;

View File

@ -107,6 +107,7 @@ pub async fn rebuild_content_html(rebuild_all: bool) -> Result<RebuildResult, Se
// 标签文章及单篇缓存;这里使用全量失效作为务实的回退策略。 // 标签文章及单篇缓存;这里使用全量失效作为务实的回退策略。
if rebuilt > 0 { if rebuilt > 0 {
crate::cache::invalidate_all_post_caches(); crate::cache::invalidate_all_post_caches();
crate::cache::invalidate_search_results();
} }
Ok(RebuildResult { Ok(RebuildResult {

View File

@ -90,6 +90,7 @@ pub async fn restore_post(post_id: i32) -> Result<CreatePostResponse, ServerFnEr
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
crate::cache::invalidate_post_by_slug(&current_slug).await; crate::cache::invalidate_post_by_slug(&current_slug).await;
crate::cache::invalidate_post_by_slug(&new_slug).await; crate::cache::invalidate_post_by_slug(&new_slug).await;
crate::cache::invalidate_tag_posts_for(&tags).await; crate::cache::invalidate_tag_posts_for(&tags).await;
@ -177,6 +178,7 @@ pub async fn purge_post(post_id: i32) -> Result<CreatePostResponse, ServerFnErro
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
crate::cache::invalidate_post_by_slug(&slug).await; crate::cache::invalidate_post_by_slug(&slug).await;
crate::cache::invalidate_tag_posts_for(&tags).await; crate::cache::invalidate_tag_posts_for(&tags).await;
@ -277,6 +279,7 @@ pub async fn batch_restore_posts(post_ids: Vec<i32>) -> Result<CreatePostRespons
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
for slug in &unique_slugs { for slug in &unique_slugs {
crate::cache::invalidate_post_by_slug(slug).await; crate::cache::invalidate_post_by_slug(slug).await;
} }
@ -284,6 +287,7 @@ pub async fn batch_restore_posts(post_ids: Vec<i32>) -> Result<CreatePostRespons
} else { } else {
// 影响集过大时回退到全量失效,避免大量串行缓存操作。 // 影响集过大时回退到全量失效,避免大量串行缓存操作。
crate::cache::invalidate_all_post_caches(); crate::cache::invalidate_all_post_caches();
crate::cache::invalidate_search_results();
} }
Ok(CreatePostResponse { Ok(CreatePostResponse {
@ -376,6 +380,7 @@ pub async fn batch_purge_posts(post_ids: Vec<i32>) -> Result<CreatePostResponse,
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
for slug in &slugs { for slug in &slugs {
crate::cache::invalidate_post_by_slug(slug).await; crate::cache::invalidate_post_by_slug(slug).await;
} }
@ -383,6 +388,7 @@ pub async fn batch_purge_posts(post_ids: Vec<i32>) -> Result<CreatePostResponse,
} else { } else {
// 影响集过大时回退到全量失效,避免大量串行缓存操作。 // 影响集过大时回退到全量失效,避免大量串行缓存操作。
crate::cache::invalidate_all_post_caches(); crate::cache::invalidate_all_post_caches();
crate::cache::invalidate_search_results();
} }
Ok(CreatePostResponse { Ok(CreatePostResponse {
@ -455,6 +461,7 @@ pub async fn empty_trash() -> Result<CreatePostResponse, ServerFnError> {
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
for slug in &slugs { for slug in &slugs {
crate::cache::invalidate_post_by_slug(slug).await; crate::cache::invalidate_post_by_slug(slug).await;
} }
@ -462,6 +469,7 @@ pub async fn empty_trash() -> Result<CreatePostResponse, ServerFnError> {
} else { } else {
// 影响集过大时回退到全量失效,避免大量串行缓存操作。 // 影响集过大时回退到全量失效,避免大量串行缓存操作。
crate::cache::invalidate_all_post_caches(); crate::cache::invalidate_all_post_caches();
crate::cache::invalidate_search_results();
} }
Ok(CreatePostResponse { Ok(CreatePostResponse {

View File

@ -199,6 +199,7 @@ pub async fn update_post(
crate::cache::invalidate_post_lists(); crate::cache::invalidate_post_lists();
crate::cache::invalidate_all_tags(); crate::cache::invalidate_all_tags();
crate::cache::invalidate_post_stats(); crate::cache::invalidate_post_stats();
crate::cache::invalidate_search_results();
crate::cache::invalidate_post_by_slug(&final_slug).await; crate::cache::invalidate_post_by_slug(&final_slug).await;
// 合并旧标签与新标签,统一失效标签下的文章列表缓存。 // 合并旧标签与新标签,统一失效标签下的文章列表缓存。