56 lines
2.5 KiB
Python
56 lines
2.5 KiB
Python
import asyncio
|
||
from cache.cache import get_cached_author, cache_author, get_cached_topic, cache_topic
|
||
from utils.logger import root_logger as logger
|
||
|
||
|
||
class CacheRevalidationManager:
|
||
def __init__(self, interval=60):
|
||
"""Инициализация менеджера с заданным интервалом проверки (в секундах)."""
|
||
self.interval = interval
|
||
self.items_to_revalidate = {"authors": set(), "topics": set(), "shouts": set(), "reactions": set()}
|
||
self.lock = asyncio.Lock()
|
||
self.running = True
|
||
|
||
async def start(self):
|
||
"""Запуск фонового воркера для ревалидации кэша."""
|
||
asyncio.create_task(self.revalidate_cache())
|
||
|
||
async def revalidate_cache(self):
|
||
"""Циклическая проверка и ревалидация кэша каждые self.interval секунд."""
|
||
try:
|
||
while self.running:
|
||
await asyncio.sleep(self.interval)
|
||
await self.process_revalidation()
|
||
except asyncio.CancelledError:
|
||
logger.info("Revalidation worker was stopped.")
|
||
except Exception as e:
|
||
logger.error(f"An error occurred in the revalidation worker: {e}")
|
||
|
||
async def process_revalidation(self):
|
||
"""Обновление кэша для всех сущностей, требующих ревалидации."""
|
||
async with self.lock:
|
||
# Ревалидация кэша авторов
|
||
for author_id in self.items_to_revalidate["authors"]:
|
||
author = await get_cached_author(author_id)
|
||
if author:
|
||
await cache_author(author)
|
||
self.items_to_revalidate["authors"].clear()
|
||
|
||
# Ревалидация кэша тем
|
||
for topic_id in self.items_to_revalidate["topics"]:
|
||
topic = await get_cached_topic(topic_id)
|
||
if topic:
|
||
await cache_topic(topic)
|
||
self.items_to_revalidate["topics"].clear()
|
||
|
||
def mark_for_revalidation(self, entity_id, entity_type):
|
||
"""Отметить сущность для ревалидации."""
|
||
self.items_to_revalidate[entity_type].add(entity_id)
|
||
|
||
def stop(self):
|
||
"""Остановка фонового воркера."""
|
||
self.running = False
|
||
|
||
|
||
revalidation_manager = CacheRevalidationManager(interval=300) # Ревалидация каждые 5 минут
|