From 4fffd1025f144f69b5a9f60dfb48707c2dfe68f1 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 16 Jan 2025 05:42:53 +0300 Subject: [PATCH] debug-update-shout-2 --- cache/cache.py | 25 +++++++++++++++++++++++++ resolvers/editor.py | 23 ++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/cache/cache.py b/cache/cache.py index a610b282..82a8d535 100644 --- a/cache/cache.py +++ b/cache/cache.py @@ -329,3 +329,28 @@ async def get_cached_topic_authors(topic_id: int): return authors return [] + + +async def invalidate_shouts_cache(cache_keys: List[str]): + """ + Инвалидирует кэш выборок публикаций по переданным ключам. + + Args: + cache_keys: Список ключей кэша для инвалидации + + Example: + await invalidate_shouts_cache([ + "feed", # общая лента + "author_123", # публикации автора + "topic_456" # публикации по теме + ]) + """ + from services.redis import redis_client + + for key in cache_keys: + cache_key = f"shouts:{key}" + try: + await redis_client.delete(cache_key) + logger.debug(f"Invalidated cache key: {cache_key}") + except Exception as e: + logger.error(f"Error invalidating cache key {cache_key}: {e}") diff --git a/resolvers/editor.py b/resolvers/editor.py index 347c6085..fc4ce442 100644 --- a/resolvers/editor.py +++ b/resolvers/editor.py @@ -4,7 +4,7 @@ from sqlalchemy import and_, desc, select from sqlalchemy.orm import joinedload from sqlalchemy.sql.functions import coalesce -from cache.cache import cache_author, cache_topic +from cache.cache import cache_author, cache_topic, invalidate_shouts_cache from orm.author import Author from orm.shout import Shout, ShoutAuthor, ShoutTopic from orm.topic import Topic @@ -330,6 +330,27 @@ async def update_shout(_, info, shout_id: int, shout_input=None, publish=False): shout_dict = shout_by_id.dict() + # Инвалидация кэша после обновления + try: + logger.info("Invalidating cache after shout update") + + # Инвалидируем кэш для всех связанных выборок + await invalidate_shouts_cache([ + "feed", # лента + f"author_{author_id}", # публикации автора + "random_top", # случайные топовые + "unrated", # неоцененные + ]) + + # Инвалидируем кэш для каждой связанной темы + for topic in shout_by_id.topics: + await invalidate_shouts_cache([f"topic_{topic.id}"]) + + logger.info("Cache invalidated successfully") + except Exception as cache_error: + logger.warning(f"Cache invalidation error: {cache_error}", exc_info=True) + # Не возвращаем ошибку, так как это некритично + if not publish: await notify_shout(shout_dict, "update") else: