3 проблемы кэширования, о которых часто забывают
Представим интернет-магазин. На главной странице показываются «Топ-товары недели». Если кэширования нет, сервер каждый раз обращается к базе данных и пересчитывает список. Это медленно и тратит ресурсы. С кэшом всё проще: однажды сформированный список сохраняется в быстрый хранилище, и при следующих запросах отдаётся прямо оттуда. Страница загружается быстрее, а база данных получает меньше нагрузки.
Что может пойти не так
Допустим, мы хотим показывать к товарам ещё и рейтинг из внешнего сервиса. Чтобы не дергать его постоянно, мы кэшируем рейтинг. Но если API рейтингов отвечает медленно, приложение зависает в ожидании ответа. Мы ставим короткий timeout: если сервис не успел — отдаем данные без рейтинга. Проблема в том, что рейтинг не попадает в кэш, потому что запрос не завершился. В итоге при каждом запросе мы снова пытаемся достучаться до API → растёт нагрузка.
Когда база «лежит», кэш может спасать, потому что мы просто продолжаем отдавать ранее сохранённые товары. Но если TTL «топ-товаров» истёк в момент сбоя, данные пропадут. Лучше уметь отдавать устаревший кэш чуть дольше: пусть информация не новая, зато пользователь не видит пустую страницу.
Если сотни пользователей одновременно открывают главную страницу, сервер может получить сотни одинаковых запросов на получение «топ-товаров». Без механизма объединения такие запросы будут обрабатываться по отдельности → лишняя нагрузка. Грамотное кэширование позволяет всем «ожидать» результат первого запроса, не повторяя работу много раз.
Если хочешь глубже разобраться в теме и увидеть, как кэширование работает в реальном приложении, присоединяйся 18 декабря в 18:00 МСК к вебинару «5 слоёв кэширования в веб-приложениях».
ЗАПИСАТЬ НА ВЕБИНАР ПО КЭШИРОВАНИЮ
Представим интернет-магазин. На главной странице показываются «Топ-товары недели». Если кэширования нет, сервер каждый раз обращается к базе данных и пересчитывает список. Это медленно и тратит ресурсы. С кэшом всё проще: однажды сформированный список сохраняется в быстрый хранилище, и при следующих запросах отдаётся прямо оттуда. Страница загружается быстрее, а база данных получает меньше нагрузки.
Что может пойти не так
1. Неправильное наполнение кэша
Допустим, мы хотим показывать к товарам ещё и рейтинг из внешнего сервиса. Чтобы не дергать его постоянно, мы кэшируем рейтинг. Но если API рейтингов отвечает медленно, приложение зависает в ожидании ответа. Мы ставим короткий timeout: если сервис не успел — отдаем данные без рейтинга. Проблема в том, что рейтинг не попадает в кэш, потому что запрос не завершился. В итоге при каждом запросе мы снова пытаемся достучаться до API → растёт нагрузка.
2. Пропажа данных во время сбоев
Когда база «лежит», кэш может спасать, потому что мы просто продолжаем отдавать ранее сохранённые товары. Но если TTL «топ-товаров» истёк в момент сбоя, данные пропадут. Лучше уметь отдавать устаревший кэш чуть дольше: пусть информация не новая, зато пользователь не видит пустую страницу.
3. Дублирование запросов
Если сотни пользователей одновременно открывают главную страницу, сервер может получить сотни одинаковых запросов на получение «топ-товаров». Без механизма объединения такие запросы будут обрабатываться по отдельности → лишняя нагрузка. Грамотное кэширование позволяет всем «ожидать» результат первого запроса, не повторяя работу много раз.
Если хочешь глубже разобраться в теме и увидеть, как кэширование работает в реальном приложении, присоединяйся 18 декабря в 18:00 МСК к вебинару «5 слоёв кэширования в веб-приложениях».
ЗАПИСАТЬ НА ВЕБИНАР ПО КЭШИРОВАНИЮ
Сегодня четверг, а значит в 18:00 МСК стартует второй новогодний вебинар с Senior разработчиком Артёмом Шумейко на тему кэша.
На вебинаре ты:
— разберёшь теорию кэширования: уровни, механизмы, типы хранилищ
— поймёшь, где и зачем применять разные виды кэша
— на практике внедришь 5 уровней кэширования в реальное приложение
🎁 Всех участников вебинара ждут подарки.
Еще не поздно зарегистрироваться на вебинар и получить максимум пользы в декабре⬇️
ЗАПИСАТЬСЯ НА ВЕБИНАР ПО КЭШИРОВАНИЮ
На вебинаре ты:
— разберёшь теорию кэширования: уровни, механизмы, типы хранилищ
— поймёшь, где и зачем применять разные виды кэша
— на практике внедришь 5 уровней кэширования в реальное приложение
🎁 Всех участников вебинара ждут подарки.
Еще не поздно зарегистрироваться на вебинар и получить максимум пользы в декабре
ЗАПИСАТЬСЯ НА ВЕБИНАР ПО КЭШИРОВАНИЮ
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝4 3❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Мы завершили серию новогодних вебинаров с senior разработчиком Артёмом Шумейко
Спасибо всем, кто был с нами на уроках, задавал вопросы, писал комментарии и делился обратной связью 💚
Прочитали под сотню комментариев, что вам зашли эфиры! Мы очень постарались сделать уроки максимально полезными с точки зрения теории и примеров.
Раз вам понравился такой формат, мы постараемся чаще проводить открытые уроки 🙌🏻
Спасибо всем, кто был с нами на уроках, задавал вопросы, писал комментарии и делился обратной связью 💚
Прочитали под сотню комментариев, что вам зашли эфиры! Мы очень постарались сделать уроки максимально полезными с точки зрения теории и примеров.
Раз вам понравился такой формат, мы постараемся чаще проводить открытые уроки 🙌🏻
❤20 9🔥5
Protocol в Python: шпаргалка для разработчика
Если ты до сих пор строишь зависимости через базовые классы и ABC, пора взглянуть на Protocol
Он позволяет описывать поведение без наследования, упрощает архитектуру и делает код гибче и чище.
На картинках всё, что действительно нужно знать про Protocol в Python⚡️
Если ты до сих пор строишь зависимости через базовые классы и ABC, пора взглянуть на Protocol
Он позволяет описывать поведение без наследования, упрощает архитектуру и делает код гибче и чище.
На картинках всё, что действительно нужно знать про Protocol в Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Рубрика #проверь_себя
В Pydantic есть объекты-валидаторы, которые используются для проверки и преобразования данных перед их присвоением полям модели, также для выполнения дополнительной логики валидации на уровне поля или модели.
Предлагаем выполнить следующее задание, связанное с работой валидаторов AfterValidator и BeforeValidator. Обычно такие валидаторы применяют как декораторы к функциям, но в этом примере мы рассмотрим их использование напрямую через классы.
Что будет выведено на экран при запуске кода?⬇️
В Pydantic есть объекты-валидаторы, которые используются для проверки и преобразования данных перед их присвоением полям модели, также для выполнения дополнительной логики валидации на уровне поля или модели.
Предлагаем выполнить следующее задание, связанное с работой валидаторов AfterValidator и BeforeValidator. Обычно такие валидаторы применяют как декораторы к функциям, но в этом примере мы рассмотрим их использование напрямую через классы.
Что будет выведено на экран при запуске кода?
from typing import Annotated
from pydantic import BaseModel, ValidationError, AfterValidator, BeforeValidator
def is_less_than_100(value):
if value > 100:
raise ValueError(f'{value} is less than 100')
return value
def to_int(value):
return int(value)
def multiply(value):
return value * 3
MagicNumber = Annotated[int | str, AfterValidator(to_int), BeforeValidator(multiply)]
class MyModel(BaseModel):
val: Annotated[MagicNumber, AfterValidator(is_less_than_100)]
if __name__ == '__main__':
try:
print(MyModel(val='5'))
except (ValueError, TypeError, ValidationError) as err:
print(err)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤝1
Пояснение ко вчерашней задаче
Pydantic автоматически объединяет валидаторы из всех уровней вложенности Annotated в один линейный список, который выполняется последовательно. К полю val валидаторы применяются в следующем порядке:
*
*
*
Pydantic автоматически объединяет валидаторы из всех уровней вложенности Annotated в один линейный список, который выполняется последовательно. К полю val валидаторы применяются в следующем порядке:
*
BeforeValidator(multiply) - запускается перед проверкой типа Pydantic, на этом этапе val всё ещё тот, что передан при создании модели. После BeforeValidator Pydantic пытается привести значение к типу, указанному в аннотации.*
AfterValidator(to_int) - запускается после приведения типа, указанного в аннотации.*
AfterValidator(is_less_than_100) - запускается после AfterValidator с учетом вложенности.
Итоговая цепочка событий:
При входящем значении val='5' BeforeValidator(multiply)отдает строку '5' * 3 = '555', далее AfterValidator(to_int) переводит '555' в int, и в финале валидатор AfterValidator(is_less_than_100) отсекает полученное число 555, так как оно больше 100.❤3👍3
Опыт backend разработчика измеряется не только строками кода.
Кажется, у каждого бэкенд-разработчика есть свой набор «рабочих приключений», отражающий его путь.
Проверим по бинго?
Ставь🔥 , если собрал больше трёх пунктов
Кажется, у каждого бэкенд-разработчика есть свой набор «рабочих приключений», отражающий его путь.
Проверим по бинго?
Ставь
Please open Telegram to view this post
VIEW IN TELEGRAM
Наш 2025 год
Самое приятное в подведении итогов года – это осознавать, как далеко мы продвинулись и изменились по сравнению с прошлым. Рассказываем, как прошёл этот год в Pytex⬆️
Спасибо, что был с нами в этом году! Мы очень стараемся давать как можно больше пользы для разработчиков, поэтому нам приятно получать твою поддержку и благодарность💚
Самое приятное в подведении итогов года – это осознавать, как далеко мы продвинулись и изменились по сравнению с прошлым. Рассказываем, как прошёл этот год в Pytex
Спасибо, что был с нами в этом году! Мы очень стараемся давать как можно больше пользы для разработчиков, поэтому нам приятно получать твою поддержку и благодарность
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥4 4🥰1 1
from fastapi import FastAPI
app = FastAPI()
@app.get("/new-year")
def happy_new_year(year: int = 2026):
wishes = [
"Молниеносных откликов < 50 мс",
"Отсутствия 500-ок в проде",
"Безболезненных деплоев",
"Стабильных воркеров и очередей",
"Понятных логов и чистых трассировок",
"Зелёных тестов и добрых ревью"
]
return {
"message": f"С Новым годом, друзья! В {year} желаем:",
"wishes": wishes,
"status": "success"
}
happy_new_year()
И пусть в вашем проекте под названием "2026":
🍊 не будет зависаний и дедлоков,
🍊 все роуты будут честно отдавать 200 OK,
🍊 а жизнь стабильно проходила через
async def, без блокировок и перегрузов.Увидимся в новом году!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14 7 5
Как выбрать идею для pet-проекта
Одна из самых частых проблем у начинающих и junior-разработчиков заключается в выборе темы для pet-проекта.
Мы собрали несколько рабочих подходов, которые помогают выбрать идею, которую не захочется бросить через неделю⬆️
Полезные ссылки из карточек:
GitHub Trending
Сабреддит r/SideProject/
Сабреддит r/Entrepreneur/
Пет-проекты Солвит
Одна из самых частых проблем у начинающих и junior-разработчиков заключается в выборе темы для pet-проекта.
Мы собрали несколько рабочих подходов, которые помогают выбрать идею, которую не захочется бросить через неделю
Полезные ссылки из карточек:
GitHub Trending
Сабреддит r/SideProject/
Сабреддит r/Entrepreneur/
Пет-проекты Солвит
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4 3