Гид по Redis в C# ASP.NET: ускоряем приложения и снижаем нагрузку на базу данных.
Redis — быстрая база данных в памяти, которая помогает масштабировать системы и ускорять доступ к данным. На открытом вебинаре курса OTUS C# ASP.NET Core разработчик Андрей Сорокин покажет, как интегрировать Redis в ASP.NET Core 8 и внедрить кэширование в реальных проектах.
📌 12 ноября, 20:00
Гид по Redis в C# ASP.NET
— настройка Redis в Docker
— кэширование ответов API
— хранение данных для быстрого доступа
— ускорение обработки запросов и снижение нагрузки на БД
Вебинар бесплатный и будет полезен C#-разработчикам, архитекторам и тимлидам, которые хотят повысить производительность приложений и упростить масштабирование.
👉 Регистрируйтесь: https://clc.to/YMHL9A
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Redis — быстрая база данных в памяти, которая помогает масштабировать системы и ускорять доступ к данным. На открытом вебинаре курса OTUS C# ASP.NET Core разработчик Андрей Сорокин покажет, как интегрировать Redis в ASP.NET Core 8 и внедрить кэширование в реальных проектах.
📌 12 ноября, 20:00
Гид по Redis в C# ASP.NET
— настройка Redis в Docker
— кэширование ответов API
— хранение данных для быстрого доступа
— ускорение обработки запросов и снижение нагрузки на БД
Вебинар бесплатный и будет полезен C#-разработчикам, архитекторам и тимлидам, которые хотят повысить производительность приложений и упростить масштабирование.
👉 Регистрируйтесь: https://clc.to/YMHL9A
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤4
Представьте, что вы пришли в магазин и продавец говорит: «Вот вам что-то. Не знаю что. Может быть, помидоры, может быть, кирпич, может быть, счастье. Узнаете, когда вернётесь домой». Вот такое же ощущение от
IActionResult без типов.Проблема с
IActionResult:[HttpGet("{id:guid}")]
public async Task<IActionResult> GetById(Guid id, ISender mediator, CancellationToken ct)
{
var dto = await mediator.Send(new GetUserQuery(id), ct);
return dto is null ? NotFound() : Ok(dto);
}Возвращаемый тип —
IActionResult. Просто интерфейс. Ничего конкретного. Кто читает этот код, не знает, что именно вернётся. Может быть UserDto, может быть ошибка, может быть что угодно.Вот так выглядит сгенерированная Swagger документация:
{
"responses": {
"200": { "description": "Success" }
}
}Никакой информации о схеме. Кто использует ваш API, не знает, какие поля будут в ответе. IDE не может подсказать структуру. Тесты пишутся вслепую.
Решение:
ActionResult<T>[HttpGet("{id:guid}")]
public async Task<ActionResult<UserDto>> GetById(Guid id, ISender mediator, CancellationToken ct)
{
var dto = await mediator.Send(new GetUserQuery(id), ct);
return dto is null ? NotFound() : Ok(dto);
}Возвращаемый тип —
ActionResult<UserDto>. Конкретно и ясно. Читающий код понимает мгновенно: метод возвращает UserDto при успехе или ошибку. Swagger генератор видит типы и строит правильную документацию.IActionResult можно использовать, когда метод не возвращает тело, к примеру ответ 204.#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍3
Откройте логи ошибки из продакшена. Видите стек-трейс? Он полон
<>c__DisplayClass2_0, d__5``1.MoveNext() и прочих артефактов, которые сгенерировал компилятор. Это не ошибка — это просто то, как .NET преобразует современный C# в IL. Но это делает поиск проблемы медленнее, чем нужно.Demystifier восстанавливает оригинальный вид кода:
• Вместо
ValueTuple``2 param показывает (string val, bool) param• Вместо
Func``1 показывает Func<string>•
async методы помечает как async Task<string>• Локальные функции и лямбды показывает с контекстом
Как применить
Вызовите
exception.Demystify() и передайте результат:try { /* ваш код */ }
catch (Exception ex)
{
logger.LogError(ex.Demystify(), "Ошибка");
}Анализ стека стоит ресурсов. На высоконагруженной системе вызывать Demystify для каждого исключения неэкономно. Используйте его выборочно — для критических путей, для отладки в development окружении или для редких, но важных ошибок.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Нужно посчитать, сколько раз каждое значение встречается в данных. Логично напрашивается проверка:
if (counts.ContainsKey(key))
counts[key]++;
else
counts[key] = 1;
Но есть способ проще:
counts[key] = counts.GetValueOrDefault(key) + 1;
Метод
GetValueOrDefault возвращает значение, если ключ есть, или значение по умолчанию (для int это 0). Затем добавляем единицу. Никаких условных операторов, одна строка.Если можете — используйте LINQ:
var counts = items.GroupBy(x => x.Key)
.ToDictionary(g => g.Key, g => g.Count());
Это явно показывает намерение: группируем по ключу, считаем количество в каждой группе.
Но если вы наполняете словарь в цикле или обрабатываете поток данных, GetValueOrDefault — идеальный выбор.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Компания работает над несколькими направлениями, которые должны сделать IDE более интегрированной с AI.
Новые агенты для обработки сложных workflow, улучшения в режиме Agent Mode и Chat, а также поддержка работы нескольких агентов одновременно.
По части моделей Microsoft планирует добавить автоматический выбор модели в Chat, GPT-5 Codex, улучшить UX для устаревающих моделей и поддержку разных системных промптов для каждой модели.
Microsoft ставит цель сделать Copilot доступным на каждом этапе разработки — не только для написания кода, но и для поиска, исправления ошибок, написания тестов, коммитов.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🥱5