0: Давайте посмотрим, как можно кэшировать данные в редисе с помощью сторонней библиотеки. Библиотека называется фастапи кэш. Она сделана специально для фастапи. В ней около 600 звёзд, и она довольно давно уже сделана. Да, 3 года.
1: Назад и поддерживается. По сей день. Здесь есть такая скромная документация, как её использовать. И нам в целом этого будет достаточно. Сперва давайте установим версию, где используется редис, там мы будем
2: Использовать именно редис можно данные хранить также в оперативной памяти, можно хранить в мемкэш ещё в какой-то динамо дб, но мы воспользуемся редисом как оптимальным решением. Здесь мы заходим
3: Пишем нашу команду, и у нас установится в виртуальное окружение. Не забудьте в него войти. Это библиотека, фастапи, кэш 2 с редисом. То есть установится ещё библиотека, редис. Далее, что нам нужно сделать? Идём по документации.
4: Здесь есть некоторые важные переменные классы, мы их импортируем в файлик main пай, также ао редис импортируем и далее нам нужно импортировать, вставить вот такой
5: Код. Да, да, давайте импортируем их, не забудем.
6: Давайте посмотрим что делает этот код мы ещё не встречались с такой структурой апп он ивент есть 2 события в фастапи это стартап и shutdown стартап отвечает за запуск приложения то есть при запуске?
7: Положение. Вот эта функция прогоняется, она может быть синхронной, может быть асинхронной. У нас здесь на самом деле ничего асинхронного нет, поэтому можно оставить деф и есть событие шатдаун, когда у нас приложение закрывается, ювикорн.
8: Допустим, мы в консоли выключаем его или закрываем вижуал студио код. У нас все соединения от баз данных, все соединения от редиса отключаются, соответственно, так удобно.
9: Не захламлять наши приложение редис, базу данных, ещё что-то лишними подключениями. Лучше их обрывать каждый раз, что здесь происходит. Используется библиотека, редис и асинхронная версия редиса. И мы из
10: Некого. Url локал хост у нас порт 6 3 7 9. По идее его можно и не прописывать. Но я на всякий случай пропишу, чтобы вы запомнили что вот такое порт у редиса кодировка и ещё какой-то параметр. И далее мы работаем с классом фастапи кэш вы можете обратить вни?
11: Внимание, что здесь также используется нет экземпляра класса. Здесь также используется класс метод, как мы делали в дао. И у нас есть редис бэкенд, есть ещее инмемори, бэкенд, динамо, дб бэкенд. У нас именно редис и префикс данных, которые будут храниться
12: В редисе давайте сделаем просто кэш и у нас будет там, например, кэш и двоеточие, название хранимой переменной. Далее. Окей, мы это дело сохраняем и нам осталось посмотреть на примерчик.
13: Здесь под декоратор апп get у нас ставится декоратор кэш с кэшированием. Собственно, давайте попробуем его поставить на какой-нибудь из наших эндпоинтов. У нас уже есть роутер хотелс и давайте попробуем.
14: Например, здесь поставить этот декоратор экспайр, допустим, через 20 секунд кэш испарится из редиса, и нам нужно будет заново прогонять. И чтобы понять, что реально кэширование работает. Давайте здесь сделаем небольшое ожи.
15: Dunyo в размере там 3 секунд мы импортируем библиотеку асинкио и вызываем у неё слип. Да, здесь также можно было бы вызвать time sleep, но мы воспользуемся асинхронным вариантом, чтобы не блокировать.
16: Выполнение кода.
17: Что у нас сейчас будет? Давайте посмотрим. Давайте зайдём в фастапи в нашу документацию. У нас тут уже все готово. Сделаем экзекьют, ждём 3 секунды, также и встречаемся с ошибкой. Давайте посмотрим.
18: Ошибка очень популярная, и вы с ней, скорее всего, встретитесь. Здесь написано, что невозможно конвертировать словарик, ну какая-то, в общем, ошибка с номер 0. Что это значит? Причём ошибка в фостате?
19: Энкодер джейсона был энкодер постапе пытается конвертировать в json наш ответ.
20: Вот этот хотелс, причём раньше у нас все работало, да, когда у нас не было кэш, а когда мы добавили кэш, там используется ещё свой какой-то кодировщик, и он как-то не очень хорошо справляется со своими задачами. В данном случае, что нужно делать?
21: Делать. Давайте пока попробуем кэш отключить и подумаем, что на самом деле происходит. Смотрите, давайте попробуем отключить вот эту проверку. Валидацию данных на выходе от пайдентик, которую мы делали.
22: Я её пока вырежу ненадолго. Зайдём в документацию, попробуем нажать экзекьют, опять подождём 3 секунды. Да, забыли выключить, и мы столкнёмся с ошибкой. Мы получим ту же самую ошибку, чтоб полу.
23: Получается давайте взглянем сначала, что у нас в search for хотелс находится здесь находится просто некоторые скил запрос и он возвращает резалтс ну что-то точка all помните, мы работали с алхимией?
24: Там было скаляр ол и просто all и сейчас очень важно запомнить разницу, потому что действительно она есть и чтобы вам не тратить кучу времени, чтобы понимать что не так. Давайте я вам
25: Объясню, когда мы делаем запрос просто какой-то таблицы, когда у нас нет джойнов, нету каких-то выборочных столбцов. То есть вот здесь я, например, выбираю все столбцы хотелс и ещё какой-то столбец. То есть это не просто модель.
26: Hotels нам вернётся, нам вернётся ещё какой-то столбец, который мы каким-то образом получили. В таком случае скаляр будет отдавать 1 столбец, и нам это не нужно. Если бы мы просто вот здесь выбрали хотелс
27: У нас бы вернулась нормально модель хотелс и скаляр бы отработал хорошо, можно было бы с ним работать в данном случае, когда мы выбираем какие-то кастомно столбцы необычные, нам обязательно нужно использовать точка all и.
28: Не использовать скаляр да, давайте посмотрим, где у нас используется скаляр вот в этом случае, например, find all когда мы хотим обратиться к конкретной модели, например, хотелс или букингс, тогда мы можем отдавать скаляр, и они будут хорошо.
29: Отрабатывать это немножко комментарий в сторону. Очень важно было это сказать. Я постараюсь комментарий написать, когда мы эту тему изучали. Но, к сожалению, до меня только сейчас дошло. Я только сейчас нашёл ответ на этот вопрос и рад с вами поделиться им. Так вот.
30: Что у нас происходит? Мы же получаем ответ от алхимии давайте найдём, где мы находимся, мы получаем ответ от алхимии и это не json объект, это какой-то экземпляр класса, с которым можно работать, обращаться к его атрибутам да, у нас
31: Атрибуты у хотеля это локейшн, нейм и так далее. И когда вот сюда мы вставляем лист, хотел инфо у нас в постапе перед тем, как отправить хотелс, он его через пайдентик прогоняет.
32: И превращает в json и так как мы с вами видели, что нормально хотелс отрабатывает уже на протяжении нескольких уроков и отдаёт все отели, мы делаем вывод, что дело в пайдентик, и немножко порывшись в пайдентик.
33: Можно найти такую функцию, которая называется parse, обжект, что делает на самом деле пайдентик давайте попробуем здесь преобразовать хотелс в json тут же на месте парс, обжект с. И мы должны отдать тип. Вот, например, вот этот, типа.
34: Давайте его попробуем отсюда убрать, убрать валидацию на выходе, но сделать её вот здесь. То есть, по сути, мы не усложняем, мы не замедляем работу нашего эндпоинта, потому что мы валидацию просто проведём шагом ранее и
35: Собственно, какой object объект у нас хотелс. То есть мы приведём хотелс через пайдентик, провалидируем и убедимся, что вот такой тип на самом деле есть у объекта хотелс и вернём уже хотс джейсон. Давайте посмотрим, что мы получим. Так.
36: Асинкио слип убираем 3 секунды, ждать не хотим, нажимаем экзекьют, и у нас возвращается все тоже самое, с чем мы работали раньше, да, json, который здесь отображается как список словариков, с которым мы уже можем работать, то есть.
37: Мы поняли как отрабатывает фастапи, как он реально с помощью айдентика валидирует данные, и теперь мы возвращаем уже в функции этого эндпоинта не sql алхимии объект не ответ от алхимии.
38: А json давайте теперь активируем кэш и посмотрим, как он отработает, справится ли он теперь со своей задачей, когда мы самостоятельно, на шаг ранее по айдентика, валидировали данные сделаем, давайте сразу включим.
39: Sleep 3 секунды, и так уж и быть, подождём 3 секунды.
40: Execute. Ждём, ждём, ждём, ждём, ждём, ждём, ждём данные. Пришли. Супер классно. Давайте попробуем ещё раз. Мы же закэшировали их, экзекьют, и мы уже не ждём 3 секунды. Мы можем моментально получать эти данные на протяжении 15 секунд. Они молниеносн.
41: Будут приходить к нам и давайте зайдём в редис. Давайте здесь поставим, наверное, секунд побольше. 30, чтобы мы успели в редис зайти, посмотреть, как это все дело будет. Сейчас мы опять ждём 3 секунды, и у нас на 30 секунд в редисе останется вся
42: Эта история. Давайте посмотрим все ключи. У меня здесь остался ключ. А и ключ. Кэш. Давайте получим вот этот ключик.
43: Так, get вставил и его. Вот мы получаем вот такой ответ. Да, вот эти странные крокозябры это у нас русские символы, вот циферки, буковки и, собственно, все у нас есть в формате json, здесь хранится и
44: Давайте посмотрим ещё раз ключи. Спустя некоторое время редис самостоятельно удаляет ключ. У него есть такая классная особенность и вуаля. Теперь нам опять нужно будет ждать там 3 секунды или сколько, но мы поняли, что можно кэшировать данные.
45: Мы также поняли, как фастапи работает с пайдентиком, на каком этапе он обрабатывает и валидирует эти данные. И это очень важно для понимания фреймворка. Это именно работа фреймворка с библиотекой пайдентик, и это выглядит немножко костыль.
46: Я буду с вами честен. Стоит выделить, наверное, это в какую-то отдельную функцию, либо в декораторе кэш принимается кастомный кодер кодировщик, который на самом деле здесь имеет функцию decode.
47: И энкод, то есть закодировать, декодировать я пытался написать, у меня не получилось. Если у вас получится, оставляйте в комментарии, я закреплю ваш комментарий обязательно, но, тем не менее, всего 1 лишняя строка, и мы можем работать с библиотекой для кэширования.
48: Понятно, что такие проблемы только со ск алхимией, потому что у неё вот формат ответа это объекты, если мы работаем с какими-то простенькими функциями, которые возвращают там списочек, словарик, текстик или просто json с лёгкостью.
49: Мы можем закидывать их в редис и доставать всегда из кэша. Таким образом мы посмотрели на 1 из инструментов нашего большого приложения. Мы ещё остановимся на многих из них на селари, на админке, на логировании и
50: Посмотрим, как они помогают нам делать наше приложение лучше, но если подводить итог, то редис это база данных, которая имеет формат ключ значения и находится в оперативной памяти. Она очень быстрая, в том числе за счёт того, что написан
51: На языке си и позволяет нам быстро обращаться к нужным нам данным. Мы используем стороннюю библиотеку для подключения к редису, так как самостоятельно описывать кэширование, декодирование, кодирование это довольно проблематично. Мы воспользовались
52: Сторонним решением буквально за 5 минут все настроили. И у нас есть рабочий кэш. Он позволяет нам экономить время клиентов, снижать нагрузку на базу данных, снижать нагрузку на фастапи. И вообще, это вин вин. Решение единственный минус, что нам нужн.
53: Платить за то, чтобы мы