Кэширование в 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. Удаление этого каталога сбрасывает инкрементальную базу.
¶Рекомендации по очистке
- При подозрении на некорректное поведение сборки начинать с
cargo clean. - При нехватке диска удалять
~/.cargo/registry/cache(архивы.crate) — исходники останутся, повторная распаковка не потребуется. - Не удалять
~/.cargo/binбез необходимости — там хранятся установленные утилиты. - Использовать
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)
