Разбираемся с Redis

Этот материал представляет собой глубокое исследование всего, что связано с Redis. В частности — речь пойдёт о различных способах организации хранилищ Redis, о постоянном хранении данных, о форках процессов.
Эксперт-разработчик C++

Этот материал представляет собой глубокое исследование всего, что связано с Redis. В частности — речь пойдёт о различных способах организации хранилищ Redis, о постоянном хранении данных, о форках процессов.

Всем привет! Меня зовут Василий Куликов, я работаю ведущим разработчиком в Техплатформе Екома и Райдтеха Яндекса и последние пять лет разрабатываю фреймворк userver.
Это веб‑фреймворк, который позволяет создавать высоконагруженные отказоустойчивые сервисы на С++. Сегодня я расскажу, как написать на нём игрушечный, но рабочий сервис, который реализует функциональность pastebin.



Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатывает userver — современный опенсорсный асинхронный фреймворк с богатым набором абстракций для быстрого и комфортного создания микросервисов, сервисов и утилит на C++.
Когда мы пишем какой‑то код для userver и для таких сложных проектов, как Boost, периодически мы сталкиваемся с нестандартными проблемами. И эти нестандартные проблемы требуют нестандартных решений. Вот о таких решениях мы сегодня и поговорим.
А именно:
— Посмотрим, как работают исключения на платформе Linux x86, и сделаем с ними что‑то интересное.
— Залезем ещё глубже под капот исключений и сделаем их ещё быстрее.
— Сделаем висячую ссылку на невалидный объект, и всё будет хорошо.
— А под конец то, что все любим, — погрузимся в шаблонное метапрограммирование.

install, докер-образами, Yandex Cloud-образом и DEB-пакетами;
[[indeterminate]] и уменьшение количества Undefined Behavior,=delete;,...[42],assert(...),

static_assert,_,std::to_string,native_handle(),*function*,constexpr,std::submdspan,
static operator[];static constexpr в constexpr-функциях;std::print с другими консольными выводами;std::expected;static_assert(false) и прочее.std::get и std::tuple_size для агрегатов;#embed;std::stacktrace из исключений;

std::mdspanstd::flat_mapstd::flat_setstd::print("Hello {}", "world")constexpr для bitset, to_chars/from_charsstd::string::substr() &&import std;std::start_lifetime_asstatic operator()[[assume(x > 0)]];std::generator
std::expected — новый механизм сообщения об ошибках без использования исключений и без недостатков кодов возврата.std::ranges::to — результаты работы алгоритмов можно легко превратить в контейнер.std::views::join_with — добавление разделителя между элементами.void naive_accept() {
for (;;) {
auto new_socket = accept(listener);
std::thread thrd([socket = std::move(new_socket)] {
auto data = socket.receive();
process(data);
socket.send(data);
});
thrd.detach();
}
}
operator[](int, int, int)std::optionalstd::move_only_functionstd::basic_string::resize_and_overwritestd::views::zip и zip_transform, adjacent, adjacent_transform
std::to_underlying() — функцию, преобразовывающую значение enum к нижележащему целочисленному типу:enum class ABCD : std::uint64_t { A = 0x1012, B = 0x405324, };
constexpr std::uint64_t value = std::to_underlying(ABCD::A);


Немного прошерстив Habr удивился тому, что очень мало опубликовано статей на тему (beta-)фичи GitHub'а — Actions.
Казалось бы, можно объяснить такую недосказанность тем, что функционал еще в тестировании, пусть и "beta". Но именно полезная особенность беты позволяет использовать этот инструмент в приватных репозиториях. Именно про работу с данной технологией я расскажу в этой статье.