49 lines
2.0 KiB
Python
49 lines
2.0 KiB
Python
import asyncio
|
|
from utils.logger import root_logger as logger
|
|
from cache.cache import get_cached_author, cache_author, cache_topic, get_cached_topic
|
|
|
|
|
|
class CacheRevalidationManager:
|
|
"""Управление периодической ревалидацией кэша."""
|
|
|
|
def __init__(self):
|
|
self.items_to_revalidate = {"authors": set(), "topics": set()}
|
|
self.revalidation_interval = 60 # Интервал ревалидации в секундах
|
|
self.loop = None
|
|
|
|
def start(self):
|
|
self.loop = asyncio.get_event_loop()
|
|
self.loop.run_until_complete(self.revalidate_cache())
|
|
self.loop.run_forever()
|
|
logger.info("[services.revalidator] started infinite loop")
|
|
|
|
async def revalidate_cache(self):
|
|
"""Периодическая ревалидация кэша."""
|
|
while True:
|
|
await asyncio.sleep(self.revalidation_interval)
|
|
await self.process_revalidation()
|
|
|
|
async def process_revalidation(self):
|
|
"""Ревалидация кэша для отмеченных сущностей."""
|
|
for entity_type, ids in self.items_to_revalidate.items():
|
|
for entity_id in ids:
|
|
if entity_type == "authors":
|
|
# Ревалидация кэша автора
|
|
author = await get_cached_author(entity_id)
|
|
if author:
|
|
await cache_author(author)
|
|
elif entity_type == "topics":
|
|
# Ревалидация кэша темы
|
|
topic = await get_cached_topic(entity_id)
|
|
if topic:
|
|
await cache_topic(topic)
|
|
ids.clear()
|
|
|
|
def mark_for_revalidation(self, entity_id, entity_type):
|
|
"""Отметить сущность для ревалидации."""
|
|
self.items_to_revalidate[entity_type].add(entity_id)
|
|
|
|
|
|
# Инициализация менеджера ревалидации
|
|
revalidation_manager = CacheRevalidationManager()
|