23284
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
У «Библиотеки программиста» появился резервный канал в мессенджере MAX
Он нужен исключительно для связи с теми, кто не может следить за обновлениями здесь из-за трудностей с доступом. Поэтому, если вы видите это сообщение, распространите его среди жильцов вашего ЖЭКа.
Контент в MAX будет дублировать телеграмный — основной нашей площадкой был и остаётся Telegram. Надеемся, это временная мера.
→ Подписаться на «Библиотеку программиста» в MAX
⚙️ F#: кэширование разрешения перегрузок
Когда компилятор F# встречает вызов метода, он каждый раз заново проверяет все доступные перегрузки и выбирает подходящую. В файлах с тысячами однотипных вызовов это превращается в заметную часть времени компиляции.
Новая preview-фича кэширует результат этой проверки. Если метод вызывается повторно с теми же типами аргументов, компилятор берёт готовый результат из кэша вместо повторного перебора.
Ключ кэша состоит из трёх частей: идентификатор группы методов, типы аргументов и тип возвращаемого значения. Кэш автоматически отключается там, где контекст влияет на выбор перегрузки: именованные аргументы, SRTP-ограничения и похожие сценарии.
.NET 10 уже сам по себе ускорил компиляцию в шесть раз по сравнению с девяткой. Кэш перегрузок даёт ещё двукратный прирост сверху и заметно снижает давление на GC.
Фича доступна в preview. Чтобы включить, нужно добавить --langversion:preview в параметры компилятора.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
🤩 GitHub Copilot теперь умеет мигрировать .NET-проекты
Microsoft выпустила кастомный агент modernize-dotnet для GitHub Copilot. Раньше автоматизированная миграция .NET работала только внутри Visual Studio. Теперь тот же процесс доступен в VS Code, терминале через Copilot CLI и прямо на GitHub.
Агент работает по модели оценка → план → выполнение. На выходе — три артефакта прямо в репозитории: отчёт о текущем состоянии кода, план апгрейда с последовательностью шагов и набор задач с конкретными изменениями.
Как запустить в терминале:
/plugin marketplace add dotnet/modernize-dotnet
/plugin install modernize-dotnet@modernize-dotnet-plugins
/agent # выбрать modernize-dotnet
# затем: upgrade my solution to a new version of .NET
👀 Дайджест недели
Чуток материалов помимо второго превью .NET
— .NET 11 Preview 2
— Реферальный рекрутинг в IT
— Протокол против AI слопа в вебе
— MCP C# SDK v1.0
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
🔄 Microsoft выпустила внеплановый патч .NET 10.0.5.
В .NET 10.0.4 сломался отладчик на macOS — при попытке дебажить любое .NET-приложение через VS Code он падал.
Кому стоит обновится: macOS + VS Code + .NET SDK 10.0.104 или 10.0.200 или рантайм 10.0.4.
Windows и Linux не затронуты.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
✏️ using — синтаксический сахар
Предлагаем ответить на вопрос с собеседования:
Что делает оператор using в C#
using (var connection = new SqlConnection(connectionString))
{
// работаем с ресурсом
}
💡 Healthy ≠ Готов к работе
Большинство health check'ов проверяют три вещи:
- Запущен ли процесс?
- Есть ли коннект к базе данных?
- Доступен ли Redis?
Это полезно. Но этого недостаточно для больших продуктивных систем.
Приложение может быть технически живым и при этом функционально сломанным. Процесс работает, эндпоинт возвращает 200, Kubernetes считает под здоровым, но первый же реальный запрос падает с ошибкой.
К примеру, кастомный health check для EF Core миграций:
public class DbContextMigrationsHealthCheck(DbContext dbContext) : IHealthCheck
{
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
try
{
var applied = await dbContext.Database
.GetAppliedMigrationsAsync(cancellationToken: cancellationToken);
var pending = await dbContext.Database
.GetPendingMigrationsAsync(cancellationToken);
if (pending.Any())
{
return HealthCheckResult.Degraded(
"Есть неприменённые миграции.",
data: new Dictionary<string, object>
{
{ "PendingMigrations", pending },
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
return HealthCheckResult.Healthy(
data: new Dictionary<string, object>
{
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
catch (Exception ex)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: ex);
}
}
}
✏️ Hello World с приколом
Вот код, который видел каждый в первый день знакомства с языком. Только здесь он немного другой:
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Console.CursorVisible = false;
print('H', ConsoleColor.Red);
print('e', ConsoleColor.Yellow);
print('l', ConsoleColor.Magenta);
print('l', ConsoleColor.Green);
print('o', ConsoleColor.Blue);
print(',', ConsoleColor.Red);
print(' ', ConsoleColor.Red);
print('w', ConsoleColor.Magenta);
print('o', ConsoleColor.Cyan);
print('r', ConsoleColor.Yellow);
print('l', ConsoleColor.Green);
print('d', ConsoleColor.Blue);
print('!', ConsoleColor.Red);
}
static void print(char letter, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.Write(letter);
}
}
🔎 Подборка вакансий для шарпистов
Fullstack .NET / C# Developer (Middle/Senior) — 3 000 — 4 500 $, удалёнка.
Middle Unity (С#) developer — от 1 500 до 2 700 $, удалёнка.
C# backend-разработчик в команду Security — офис или гибрид в Москве.
➡️ Еще больше топовых вакансий — в нашем канале C# Jobs
🐸 Библиотека шарписта
🔄 .NET 11 Preview 2
Вышел второй превью .NET 11. Пока это не финальный релиз, но уже есть что посмотреть.
Самое заметное в этом превью — работа над производительностью на нескольких уровнях одновременно.
• В рантайме появился Runtime Async V2.
Это переработанная реализация асинхронности на уровне самого рантайма, не на уровне компилятора. Цель — убрать лишние аллокации и сделать работу async/await дешевле по ресурсам.
• SDK стал немного меньше.
Установщики для Linux и macOS сократились в размере. Плюс обновили анализаторы кода и добавили новые предупреждения при сборке.
• F# в этом превью получил несколько практичных вещей.
Кэширование при разрешении перегрузок должно ускорить компиляцию в проектах с большим количеством overload-ов.
Упростили иерархии DIM-интерфейсов, добавили директиву #elif и функцию partitionWith для коллекций.
• В Entity Framework Core добавили поддержку LINQ операторов MaxBy и MinBy. Для SQL Server появилась поддержка DiskANN векторных индексов и VECTOR_SEARCH().
• MAUI тоже не обошли стороной. Улучшили работу карт, ускорили TypedBinding, добавили аннотации неизменяемости для Color и Font. Для Android теперь минимально требуется API 24.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#пульс_индустрии
⏳ Часовая готовность: создаём ИИ-агента в прямом эфире
В 19:00 МСК в рамках нашего курса «Разработка AI-агентов» стартует вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке.
Будет live-демо работающего агента, реальные метрики из корпоративной среды и честный разбор архитектурных граблей — без воды и «успешного успеха».
Всем зрителям эфира дадим эксклюзивный промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
📋 Один и тот же рынок, но разные шансы
Кандидат с рекомендацией получает оффер в 4 раза чаще, чем тот, кто откликнулся в холодную. Сбер говорит, что треть сотрудников пришли именно так. И это не исключение — это уже норма для крупных IT-компаний.
Разобрали, как работает реферальный рекрутинг, где компании публикуют свои программы и что нужно, чтобы вас порекомендовали.
➡️ Как устроиться по рекомендации и где искать реферальные программы
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
👨💻 Протокол против AI слопа в вебе
Есть потрясающий проект, который пытается решить одну из главных проблем современного интернета: как узнать, создан ли контент человеком или это просто сгенерированный AI?
Как работает доверие
Не нужно доверять всему интернету сразу. Выбираете несколько сайтов, которым уже доверяешь.
Потом система ищет все сайты, которые эти люди одобрили. Это 1 хоп. Потом сайты, которые одобрили они. Это 2 хопа. И так далее.
Если видите сайт, который находится на расстоянии 1-2 хопа от человека, которому вы доверяете, то это реальный контент с высокой вероятностью.
Расстояние визуализируется цветом: зелёный (0-1 хоп), жёлтый (2), оранжевый (3+).
Вы публикуете на своём сайте JSON файл:
{
"version": "0.1.1",
"url": "https://example.com",
"vouches": [
{
"url": "https://trusted-person.com",
"vouched_at": "2026-01-15"
}
]
}<head> добавляете:<link rel="human-json">
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#garbage_collector
💥 Открытый вебинар | ИИ-агенты в продакшене: от хайпа к деньгам
Агенты уже везде. Но мало кто признаётся, сколько денег сжёг на бесконечных циклах, галлюцинациях в RAG и отсутствии мониторинга.
Полина Полунина, руководитель AI-направления Альфа-Банка, расскажет честно:
▪️ Чем агент отличается от «просто GPT с промптом» и когда бизнесу достаточно обычного LLM
▪️ 3 реальных кейса из корпоративной среды: что взлетело, а что нет
▪️ Live-демо работающего агента
▪️ ТОП-5 граблей, на которые наступают команды при внедрении
⏱️ 10 марта в 19:00 (МСК)
🎁 Участники получат промокод на скидку на самый полный курс по ИИ-агентам
👉 Регистрируйся
🤩 Утилита, которая возвращает правый Ctrl вместо кнопки Copilot
На новых ноутбуках с Copilot+ PC правый Ctrl заменили физической кнопкой Copilot. Microsoft продвигала её как часть сертификации устройств. Те, кто активно использовал правый Ctrl — в VirtualBox, в терминале, при выделении текста — внезапно обнаружили, что кнопки больше нет.
Перепривязать её стандартными средствами Windows нельзя нормально и без костылей.
Разработчик выпустил утилиту NoCopilotKey. Она перехватывает нажатие кнопки Copilot через low-level keyboard hook и подменяет его на Right Ctrl. Никаких настроек, никакого интерфейса.
Скачал, запустил, кнопка работает как Ctrl.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#garbage_collector
⭐️ F#: упрощённые иерархии интерфейсов с DIM
Раньше при работе с C#-интерфейсами, где базовый слот закрыт через дефолтную реализацию интерфейсов, F# всё равно требовал явно реализовать оба интерфейса.
Теперь достаточно реализовать только производный интерфейс.
Допустим, есть такие C#-интерфейсы:
public interface IA { int M(); }
public interface IB : IA {
new int M();
int IA.M() => this.M() + 100; // DIM покрывает слот IA.M
}IA, и IB. Теперь достаточно IB:type C() =
interface IB with member _.M() = 42
(C() :> IB).M() // 42
(C() :> IA).M() // 142 — DIM перенаправляет: this.M() + 100
--langversion:preview.
🤩 JIT-оптимизации в новом .NET Preview: что улучшилось
Несколько тихих, но полезных улучшений в JIT-компиляторе, которые влияют на производительность без изменений в коде.
Устранение проверок границ для паттерна i + cns < len
JIT теперь убирает лишние bounds check в типичном сценарии, когда индекс плюс константа сравниваются с длиной массива. Такой паттерн встречается в парсерах, обработке буферов, посимвольном разборе строк. Раньше каждая такая проверка генерировала лишние инструкции в рантайме.
Удаление избыточных checked-контекстов
Если JIT может доказать, что значение уже находится в допустимом диапазоне, он теперь выбрасывает проверку переполнения как ненужную.
Это касается арифметики в checked-блоках, где компилятор раньше перестраховывался даже там, где переполнение было физически невозможно.
Девиртуализация generic-виртуальных методов в R2R
ReadyToRun-образы теперь умеют девиртуализировать несовместно используемые generic virtual method calls. Это означает, что AOT-скомпилированный код получает те же оптимизации прямых вызовов, которые раньше были доступны только в JIT-режиме.
SVE2-интринсики для ARM
Добавлены новые интринсики ShiftRightLogicalNarrowingSaturate(Even|Odd) для архитектур с поддержкой SVE2. Требуют и поддержки в JIT, и соответствующего API. Полезно для векторных вычислений на серверном ARM-железе вроде Graviton или Neoverse.
Все четыре изменения работают автоматически при обновлении рантайма. Ничего менять в коде не нужно.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
👨💻 TarFile.CreateFromDirectory теперь поддерживает выбор формата архива
Продолжаем копаться в превью .NET 11.
До этого TarFile.CreateFromDirectory всегда создавал архивы в формате Pax. Без вариантов. Если нужен был GNU или Ustar — приходилось обходными путями.
Теперь у метода появятся новые перегрузки с параметром TarEntryFormat. Поддерживаются все четыре формата: Pax, Ustar, GNU и V7.
// GNU — для совместимости с Linux-окружениями
TarFile.CreateFromDirectory("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, TarEntryFormat.Gnu);
// Ustar — широкая совместимость с разными инструментами
TarFile.CreateFromDirectory("/source/dir", outputStream,
includeBaseDirectory: false, TarEntryFormat.Ustar);
// Асинхронный вариант тоже есть
await TarFile.CreateFromDirectoryAsync("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, TarEntryFormat.Pax, cancellationToken);
tar в Linux.
Самый востребованный навык в ИТ в 2026-м — навык создания ИИ-агентов
Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов.
В программе:
— архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов;
— практическая работа с актуальными фреймворками LangGraph, AutoGen, MCP и CrewAI;
— настройка продвинутого RAG для парсинга документов и точного поиска;
— внедрение решений с учётом действующего законодательства (152-ФЗ);
— дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы.
Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.
Запись первого открытого вебинара, на котором мы вместе с руководителем AI-направления в Альфа-Банке Полиной Полуниной пилили агента в прямом эфире.
⚙️ System.Text.Json теперь возвращает типизированные метаданные без приведения типов
Разбираем превью .NET 11.
В .NET появятся два новых метода у JsonSerializerOptions — GetTypeInfo<T>() и TryGetTypeInfo<T>(). Раньше, чтобы получить JsonTypeInfo<T>, приходилось вручную кастовать результат из не-дженерикового GetTypeInfo(Type).
// Раньше
JsonTypeInfo<MyType> info = (JsonTypeInfo<MyType>)options.GetTypeInfo(typeof(MyType));
// Теперь
JsonTypeInfo<MyType> info = options.GetTypeInfo<MyType>();
TryGetTypeInfo<T>(), который не бросает исключение, а возвращает bool.if (options.TryGetTypeInfo<MyType>(out JsonTypeInfo<MyType>? typeInfo))
{
// typeInfo готов к работе
}
⚡️ Кэширование в .NET 10 с EasyCaching
Если ваш дашборд каждый раз агрегирует данные из нескольких таблиц, а список сотрудников делает новый запрос к БД при каждой загрузке — с десятью пользователями это терпимо. Под реальной нагрузкой всё рассыпается.
EasyCaching решает эту проблему — чистый кэширующий слой, который встраивается в .NET.
Что даёт интеграция:
• Провайдер, TTL и ключи живут в appsettings.json.
Пример:
"PerEndpoint": {
"Dashboard:Metrics": { "AbsoluteTtlSeconds": 300 },
"Employees:GetAll": { "AbsoluteTtlSeconds": 300, "SlidingTtlSeconds": 120 }
}var cached = await _cache.GetAsync<TResponse>(cacheKey);
if (cached != null) return cached;
var result = await next(); // реальный запрос к БД
await _cache.SetAsync(cacheKey, result, CacheKeyPrefixes.EmployeesAll);
return result;
POST /cache/invalidate и GET /cache/stats для ручного управления
📄 Автоматическое удаление персональных данных из документов на C#
Рабочие документы почти всегда содержат что-то личное. Имена, номера паспортов, банковские счета, налоговые идентификаторы — всё это регулярно оседает в PDF-файлах и других документах.
Cloudmersive предлагает DLP API с поддержкой .NET, который работает через AI-модель с наложением сетки на документ.
Вы сами указываете, какие типы данных считать недопустимыми, API находит их в документе и закрашивает или удаляет. При этом в ответе возвращается и сам отредактированный файл, и полный отчёт о том, что именно было найдено.
Установка:
Install-Package Cloudmersive.APIClient.NETCore.DLP -Version 1.1.0
using Cloudmersive.APIClient.NETCore.DLP.Api;
using Cloudmersive.APIClient.NETCore.DLP.Client;
using Cloudmersive.APIClient.NETCore.DLP.Model;
Configuration.Default.AddApiKey("Apikey", "YOUR_API_KEY");
var apiInstance = new RedactApi();
var body = new DlpDocumentRedactionRequest();
DlpDocumentRedactionResponse result = apiInstance.RedactDocument(body);
⚙️ Лямбды с захватом переменных: скрытые аллокации на горячем пути
Один из способов незаметно нагрузить хип — захватить локальную переменную внутри лямбды:
int threshold = 10;
var query = items.Where(x => x > threshold);
var query = items.Where(static x => x > 10);
static bool IsAbove(int x, int threshold) => x > threshold;
☝️ Уже сегодня: ИИ-агенты в продакшене — инженерный подход к интеграции LLM
Индустрия активно обсуждает потенциал нейросетей, способных автоматизировать бизнес-процессы и заменить целые отделы. Однако реальное внедрение агентов в production вскрывает серьёзные проблемы: разработчикам приходится бороться с непредсказуемыми галлюцинациями моделей, нестабильными API и сложной интеграцией в существующую архитектуру.
Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции LLM.
Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
💡 Консольный интерфейс за 5 минут
SharpConsoleUI — это библиотека для .NET, которая позволяет строить полноценный оконный интерфейс прямо в терминале.
Несколько окон одновременно, модальные диалоги, фокус, мышь, клавиатура. Всё то, что обычно ждёшь от GUI-фреймворка, но работает в консоли.
Под капотом двойная буферизация и частичное обновление только грязных регионов, так что мерцания нет. Рендеринг либо напрямую, либо через буфер.
Самый простой вариант:
var windowSystem = new ConsoleWindowSystem(RenderMode.Buffer);
var window = new Window(windowSystem)
{
Title = "Hello World",
Width = 50,
Height = 15
};
windowSystem.AddWindow(window);
windowSystem.Run();
var window = new WindowBuilder(windowSystem)
.WithTitle("Modern Hello World")
.WithSize(50, 15)
.Centered()
.WithColors(Color.DarkBlue, Color.White)
.Build();
export SHARPCONSOLEUI_DEBUG_LOG=/tmp/consoleui.log
export SHARPCONSOLEUI_DEBUG_LEVEL=Debug
Spectre.Console, кнопки, чекбоксы, многострочный редактор текста с прокруткой, дерево для иерархических данных, список с выбором и табличная сетка.
🛠 MCP C# SDK v1.0
Стабильная версия пакета разработчика принесла полезные фичи для интеграции ИИ в .NET.
OAuth теперь проще. Сервер может хранить метаданные тремя способами, пакет найдёт сам.
Инструменты теперь получают иконки. Настраивается через атрибут:
[McpServerTool(IconSource = "https://example.com/icon.svg")]
public static string GetWeather(string city) { }
var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(new() { Endpoint = new Uri("http://localhost:6184") }),
clientOptions: new()
{
Capabilities = new ClientCapabilities
{
Sampling = new SamplingCapability { Tools = new SamplingToolsCapability {} }
}
});
Tool rollDieTool = new Tool()
{
Name = "roll_die",
Description = "Rolls a six-sided die and returns 1-6."
};
builder.Services.AddDistributedMemoryCache();
builder.Services.AddMcpServer()
.WithHttpTransport()
.WithDistributedCacheEventStreamStore()
.WithTools<MyTools>();
await context.EnablePollingAsync(retryInterval: TimeSpan.FromSeconds(5));
var taskStore = new InMemoryMcpTaskStore();
builder.Services.AddMcpServer(options => { options.TaskStore = taskStore; })
.WithHttpTransport();
Task:[McpServerTool(TaskSupport = ToolTaskSupport.Required)]
public static async Task<string> ProcessData(int count, CancellationToken ct)
{
await Task.Delay(TimeSpan.FromSeconds(8), ct);
return $"Processed {count} records.";
}
var result = await client.CallToolAsync(
new CallToolRequestParams
{
Name = "processDataset",
Task = new McpTaskMetadata { TimeToLive = TimeSpan.FromHours(2) }
});
var completedTask = await client.PollTaskUntilCompleteAsync(result.Task.TaskId);
🖥 Первый дайджест весны
Прошла первая неделя весны и мы снова собрали для вас то, что могло уйти из вашего инфополя.
— Cake 6.0.0 вышел
— Спам тимлидам, фейковые офферы и приукрашенное резюме
— Merge conflict для календаря
— NuGet стал удобнее
— Noundry готова к бою
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
👨💻 Кэширование в три слоя — спасение базы данных
База данных имеет лимит количества запросов в секунду, который она может обработать. При миллионах запросов в час этот лимит будет достигнут независимо от того, насколько хорошо написан код. Решение одно: кэшировать агрессивно.
Неправильный подход это кэшировать все и везде без логики. Правильный подход это иметь стратегию кэширования с разными слоями.
Первый слой: память приложения
MemoryCache в .NET работает очень быстро, потому что данные лежат в памяти одного процесса. Здесь кэшируются часто запрашиваемые данные с коротким временем жизни. Профили пользователей, настройки, статические справочники. TTL может быть 30 секунд или минута.
Второй слой: распределенный кэш
Redis или Memcached. Когда приложение запущено на нескольких контейнерах, они должны видеть одни и те же данные. Если один контейнер кэшировал профиль пользователя, остальные должны получить его без запроса в БД.
Третий слой: кэширование ответов
Некоторые API ответы не зависят от пользователя и могут быть закэшированы целиком. Если GET /api/countries возвращает список стран, это можно кэшировать на час, потому что страны не меняются часто.
На практике такая архитектура может снизить нагрузку на базу данных на 80 процентов. Просто потому, что большинство запросов идут в кэш, а не в БД.
Ключ в том, чтобы знать, какие данные и как долго кэшировать. Не нужно хранить в кэше пользовательские данные, которые меняются каждую секунду. Нужно кэшировать данные, которые стабильны и часто запрашиваются.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор