Ответ
Инвалидация кэша — это процесс удаления или обновления устаревших данных в кэше для поддержания их актуальности. Выбор стратегии зависит от требований к консистентности данных и производительности.
Основные стратегии:
-
Time-To-Live (TTL)
- Описание: Каждой записи в кэше присваивается "срок жизни", по истечении которого она автоматически удаляется.
- Применение: Идеально для данных, которые могут быть неактуальными в течение короткого периода (например, погода, курсы валют, статистика).
- Пример (Redis):
import redis r = redis.Redis() # Ключ 'weather:moscow' будет удален через 600 секунд (10 минут) r.set('weather:moscow', '{"temp": 15}', ex=600)
-
Write-Through (Сквозная запись)
- Описание: Приложение записывает данные одновременно и в кэш, и в основную базу данных. Операция считается завершенной только после успеха в обоих хранилищах.
- Плюс: Гарантирует высокую консистентность данных между кэшем и БД.
- Минус: Увеличивает задержку (latency) операции записи.
-
Explicit Invalidation (Явная инвалидация)
- Описание: Это наиболее распространенный паттерн, также известный как Cache-Aside. Приложение само отвечает за удаление данных из кэша после их изменения в основной базе данных.
- Пример:
def update_user_profile(user_id, data): # 1. Обновляем данные в основной базе db.update_user(user_id, data) # 2. Явно удаляем старые данные из кэша cache.delete(f'user:{user_id}')
-
Write-Back (Отложенная запись)
- Описание: Данные сначала очень быстро пишутся в кэш, а через некоторое время или по расписанию асинхронно сохраняются в базу данных.
- Плюс: Очень низкая задержка операций записи.
- Минус: Высокий риск потери данных при сбое кэша до того, как данные были сохранены в БД.
Ответ 18+ 🔞
А, ну вот, опять про эту вашу инвалидацию кэша, блядь! Ну, сидит такой разработчик, думает: "О, я сейчас всё закеширую, производительность будет овердохуища!" А потом, сука, данные в базе поменялись, а в кэше — старые, и пошёл пиздец, пользователи видят хуйню. Так вот, чтобы этого не было, есть несколько способов этот кэш почистить, то есть инвалидировать. Выбирай, в зависимости от того, насколько тебе важна свежесть данных и скорость.
Смотри, какие есть варианты, блядь:
-
Время жизни (TTL) Это как йогурт в холодильнике, ёпта. Положил — и он через N часов протухнет сам. Так и тут: задаёшь записи срок годности, и она сама удалится. Идеально для всякой ерунды, которой можно быть немного устаревшей. Ну, там, погода, курсы доллара (хотя они, блядь, меняются каждую секунду), топ постов за час.
import redis r = redis.Redis() # Ключ 'weather:moscow' сдохнет сам через 600 секунд r.set('weather:moscow', '{"temp": 15}', ex=600)Поставил и забыл. Главное — срок правильно подобрать, а то пользователи будут смотреть на вчерашний снег, а на улице, блядь, +30.
-
Сквозная запись (Write-Through) Тут ты, сука, перфекционист. Каждая операция записи идёт сразу в два места: и в кэш, и в основную базу. Только когда оба места сказали "ок", ты успокаиваешься.
- Плюс: Данные везде, блядь, как штык, консистентные. Идеал.
- Минус: Скорость записи — хуйня. Ты ждёшь отклика от двух систем, а это, блядь, как две очереди в поликлинике отстоять. Задержка увеличивается, терпения ноль ебать.
-
Явная инвалидация (Explicit Invalidation) или Cache-Aside А это, блядь, классика, как "Муму" у Тургенева! Самый распространённый паттерн. Работает по принципу "сам за собой убери". Изменил что-то в базе — тут же, сука, почисти за собой кэш. Не надеешься ни на кого, только на себя, любимого.
def update_user_profile(user_id, data): # 1. Тыкаем данные в базу db.update_user(user_id, data) # 2. А старый кэш про этого юзера — нахуй в озеро, как Муму! cache.delete(f'user:{user_id}')Всё просто и понятно. Но надо не забывать это делать, а то опять будет, блядь, рассинхрон.
-
Отложенная запись (Write-Back) О, это для экстремалов, которым скорость записи важнее всего на свете! Данные летят прямиком в кэш — быстро, как хуй с горы. А в базу они записываются потом, не спеша, асинхронно: раз в минуту, раз в пять, когда там очередь накопится.
- Плюс: Запись — просто космос, мгновенная.
- Минус: Риск, блядь, огромный! Если кэш, сука, накрылся медным тазом до того, как данные сбросились в базу — всё, пиши пропало. Данные похерились навсегда. Это как написать гениальную мысль на салфетке, а потом её в стирку сунуть. Пиздец, а не стратегия.
Вот и вся философия, блядь. Выбирай, что тебе ближе: надёжность, скорость или чтобы само всё как-то работало. Главное — понимать, за что ты платишь в каждой схеме, а то потом волнение ебать, когда продакшн ляжет.