Запросы несуществующих товаров проходят мимо кэша и грузят базу
def get_product(product_id):
cached = redis.get(f"product:{product_id}")
if cached:
return json.loads(cached)
product = db.fetch_product(product_id)
if product:
redis.set(f"product:{product_id}", json.dumps(product), ex=600)
return product
Парсер конкурента перебирает id подряд, большинства товаров не существует. Нагрузка на базу выросла в десять раз, хотя процент попаданий в кэш для настоящих товаров высокий. Почему и что сделать?
- Отсутствие товара не кэшируется — закэшировать пустой ответ с коротким TTL
- Увеличить TTL существующих товаров с 10 минут до суток
- Кэшировать товары при старте сервиса целиком, а не по запросу
- Заменить redis.get на redis.exists, он работает быстрее
