From 116deb16d7fa14013d2f3da51f69f1ce57172e7e Mon Sep 17 00:00:00 2001 From: Untone Date: Wed, 1 Oct 2025 23:53:09 +0300 Subject: [PATCH] invalidation-follow-fix3 --- resolvers/follower.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/resolvers/follower.py b/resolvers/follower.py index 692ee28b..48ff6fd2 100644 --- a/resolvers/follower.py +++ b/resolvers/follower.py @@ -58,7 +58,7 @@ async def follow( cache_key_pattern = f"author:follows-{entity_type}s:{follower_id}" await redis.execute("DEL", cache_key_pattern) await redis.execute("DEL", f"author:id:{follower_id}") - logger.debug(f"Инвалидирован кеш подписок В НАЧАЛЕ операции: {cache_key_pattern}") + logger.debug(f"Инвалидирован кеш подписок follower'а: {cache_key_pattern}") entity_classes = { "AUTHOR": (Author, AuthorFollower, get_cached_follower_authors, cache_author), @@ -150,6 +150,11 @@ async def follow( subscription_id=subscription_id, ) + # ✅ КРИТИЧНО: Инвалидируем кеш списка подписчиков автора + # чтобы новый подписчик сразу появился в списке + await redis.execute("DEL", f"author:followers:{entity_id}") + logger.debug(f"Инвалидирован кеш подписчиков автора: author:followers:{entity_id}") + # Инвалидируем кеш статистики авторов для обновления счетчиков подписчиков logger.debug("Инвалидируем кеш статистики авторов") await invalidate_authors_cache(entity_id) @@ -277,15 +282,7 @@ async def unfollow( session.commit() logger.info(f"Пользователь {follower_id} отписался от {what.lower()} с ID {entity_id}") - # Инвалидируем кэш подписок пользователя - cache_key_pattern = f"author:follows-{entity_type}s:{follower_id}" - await redis.execute("DEL", cache_key_pattern) - logger.debug(f"Инвалидирован кэш подписок: {cache_key_pattern}") - - # ✅ КРИТИЧНО: Также инвалидируем кеш полных данных для корректной загрузки при рефреше - await redis.execute("DEL", f"author:id:{follower_id}") - logger.debug(f"Инвалидирован кеш полных данных пользователя: author:id:{follower_id}") - + # Кеш подписок follower'а уже инвалидирован в начале функции if get_cached_follows_method and isinstance(follower_id, int): logger.debug("Получение актуального списка подписок из кэша") follows = await get_cached_follows_method(follower_id) @@ -296,6 +293,11 @@ async def unfollow( if what == "AUTHOR" and isinstance(follower_dict, dict): await notify_follower(follower=follower_dict, author_id=entity_id, action="unfollow") + # ✅ КРИТИЧНО: Инвалидируем кеш списка подписчиков автора + # чтобы отписавшийся сразу исчез из списка + await redis.execute("DEL", f"author:followers:{entity_id}") + logger.debug(f"Инвалидирован кеш подписчиков автора после unfollow: author:followers:{entity_id}") + # Инвалидируем кеш статистики авторов для обновления счетчиков подписчиков logger.debug("Инвалидируем кеш статистики авторов после отписки") await invalidate_authors_cache(entity_id)