Открыть сервисСервис

Кэширование в Rust и очистка кэша

Кэширование в Rust — это механизм сохранения промежуточных результатов компиляции и выполнения программ, написанных на языке программирования Rust, с целью ускорения повторных операций. Очистка кэша в Rust может относиться к нескольким уровням: кэшу сборщика пакетов Cargo, кэшу сборки проекта, кэшу целевых артефактов, а также к кэшу в приложениях, написанных на Rust. Порядок и методы очистки зависят от конкретного типа кэша.

Кэш Cargo

Cargo — официальный сборщик пакетов и система сборки языка Rust. По умолчанию Cargo хранит кэшированные данные в домашней директории пользователя в каталоге .cargo. Основные подкаталоги:

КаталогНазначение
~/.cargo/registryСкачанные из реестра crates.io пакеты (исходники)
~/.cargo/gitЗависимости, полученные из Git-репозиториев
~/.cargo/binУстановленные бинарные утилиты (cargo install)
target/ (в проекте)Скомпилированные артефакты сборки

Очистка кэша сборки проекта

Для удаления артефактов сборки конкретного проекта используется команда:

`` cargo clean ``

Команда удаляет каталог target/ в корне проекта, включая все скомпилированные бинарные файлы, объектные модули и зависимости. После очистки следующая сборка (cargo build) выполняется заново с полной компиляцией всех зависимостей, что занимает существенно больше времени.

Для выборочного удаления можно использовать флаги:

  • cargo clean --release — удаление только release-артефактов;
  • cargo clean --target <triple> — удаление артефактов для конкретной целевой платформы;
  • cargo clean --doc — удаление собранной документации.

Очистка реестра пакетов

Каталог ~/.cargo/registry со временем может занимать несколько гигабайт. Ручное удаление папки приведёт к повторной загрузке всех зависимостей при следующей сборке. Более аккуратный вариант — использование неофициальной утилиты cargo-cache:

`` cargo install cargo-cache cargo cache --autoclean ``

Утилита удаляет устаревшие версии пакетов, сохраняя наиболее свежие. Полная очистка реестра выполняется командой cargo cache --autoclean-all.

Кэш зависимостей в системе

Cargo по умолчанию использует глобальный кэш зависимостей, что позволяет разным проектам переиспользовать одни и те же скачанные пакеты. Отключить глобальное кэширование можно переменной окружения:

`` CARGO_HOME=/path/to/local/dir cargo build ``

Такой подход изолирует кэш в рамках конкретного проекта и упрощает его удаление вместе с остальными файлами проекта.

Кэш в приложениях на Rust

При разработке веб-сервисов и приложений на Rust кэширование применяется на уровне бизнес-логики. Наиболее распространённые инструменты:

  • cached — крейт для декларативного кэширования функций с поддержкой LRU-кэшей, TTL и асинхронных вызовов. Очистка кэша выполняется вызовом метода cache_reset() у структуры кэша или с помощью макроса #[cached] с ручным сбросом.
  • moka — потокобезопасная библиотека кэширования с поддержкой асинхронности и автоматического вытеснения записей. Очистка — метод invalidate_all().
  • dashmap — конкурентная хеш-таблица, часто используемая как простейший кэш; очистка — метод clear().

Пример с cached:

```rust use cached::proc_macro::cached; use std::time::Duration;

[cached(time_expire = 300)]

fn expensive_computation(key: u64) -> u64 { // ресурсоёмкая операция key * 42 } ```

Для принудительного сброса кэша в подобных случаях применяют глобальный реестр кэшей cached::GLOBAL_CACHE и вызывают clear().

Кэш в базах данных и прокси

Rust-приложения часто взаимодействуют с внешними системами кэширования:

  • Redis — популярное кэш-хранилище; очистка выполняется командой FLUSHDB (текущая БД) или FLUSHALL (все БД), либо через крейты redis-rs методом flushdb().
  • HTTP-кэш — в фреймворках типа actix-web и axum кэширование ответов настраивается middleware; сброс выполняется инвалидацией ключей.

Кэш компилятора Rust

Сам компилятор rustc использует кэширование кодогенерации. Директива #[cfg(...)] и условная компиляция не создают отдельного кэша, но флаг -Z incremental (в nightly-версии) включает инкрементальную компиляцию, хранящую промежуточные результаты в каталоге target/debug/incremental. Удаление этого каталога сбрасывает инкрементальную базу.

Рекомендации по очистке

  1. При подозрении на некорректное поведение сборки начинать с cargo clean.
  2. При нехватке диска удалять ~/.cargo/registry/cache (архивы .crate) — исходники останутся, повторная распаковка не потребуется.
  3. Не удалять ~/.cargo/bin без необходимости — там хранятся установленные утилиты.
  4. Использовать cargo-cache для регулярной автоматической очистки.

Интересные факты

  • Каталог target/ проекта на среднем Rust-проекте может занимать от 500 МБ до нескольких гигабайт.
  • Cargo поддерживает переменную CARGO_TARGET_DIR, позволяющую вынести каталог сборки за пределы проекта и разделять его между несколькими проектами.
  • Команда cargo build --timings генерирует HTML-отчёт о времени компиляции каждого модуля, что помогает выявить «узкие места» без очистки кэша.

Источники:

  • Документация Cargo (doc.rust-lang.org/cargo)
  • Документация крейта cached (docs.rs/cached)
  • Документация крейта moka (docs.rs/moka)
  • The Rust Programming Language (doc.rust-lang.org/book)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru