Вопрос или проблема
Существуют ли популярные библиотеки кэша на C++ с поддержкой постоянного хранения, аналогичные Embedded Ehcache? Ниже приведены требования к нашим библиотекам кэша.
- Несколько значений в одной записи. Поэтому необходима поддержка сложных коллекций.
- Хранение в памяти с файловой поддержкой постоянного хранения (предложения по базам данных будут полезны, но предпочтительнее файловый вариант).
- Встроенная библиотека кэша.
- Конкурентный доступ к большому набору данных для чтения, записи и обновления, который будет обрабатываться этой библиотекой.
- Активное сообщество или ясная документация по API будут полезны.
При поиске библиотек с открытым исходным кодом большинство из них не имеют поддержки постоянного хранения или не встроены. Например, Cachelib сохраняет данные только при завершении работы. Но нам нужно, чтобы данные сохранялись в процессе кэширования, поскольку имеется большой набор данных, который должен быть сохранен при достижении определенного количества, а затем загружен в память по мере необходимости. FasterKV является хранилищем ключ-значение, и документация по C++ API также не очень хороша.
Ответ или решение
В C++ существует несколько библиотек для кэширования, которые поддерживают работу с данными в памяти и обеспечивают сохранение состояния на постоянном носителе, как это делает Embedded Ehcache. Ниже приведены некоторые из наиболее подходящих библиотек, соответствующих указанным вами критериям.
1. Apache Ignite
Apache Ignite — это мощная распределенная вычислительная платформа, которая также предлагает возможности кэширования. Она поддерживает сложные коллекции и обеспечивает как in-memory хранилище, так и долговременное хранение данных. Ignite может работать в embedded режиме и поддерживает многофункциональную работу с данными.
Преимущества:
- Поддержка сложных объектов и коллекций.
- Возможность конфигурации с сохранением на файловую систему.
- Хорошая многопоточность, что позволяет обрабатывать большое количество ресурсов.
- Активное сообщество и обширная документация.
2. Redis с использованием Hiredis
Хотя Redis чаще всего используется в качестве отдельного сервиса, вы можете встроить его в ваше приложение с помощью клиентской библиотеки Hiredis. Redis предлагает поддержку сложных структур данных, как хэши и списки, а также легкую интеграцию с многопоточными приложениями.
Преимущества:
- Поддержка сложных коллекций данных.
- Быстрая работа с данными в памяти с возможностью создания постоянных снимков.
- Хорошее API и активное сообщество.
3. Memcached с Persistent Storage
Memcached изначально не поддерживает долговременное хранение, но существуют некоторые версии и патчи, которые добавляют такую поддержку. Например, существует расширение Memcached для использования с BDB (Berkeley DB) или другого аналогичного хранилища.
Преимущества:
- Высокая скорость работы и простота.
- Поддержка внешних движков для долговременного хранения.
- Доступная документация и большое сообщество.
4. DuckDB
Хотя DuckDB — это относительно новая библиотека, она ориентирована на работу с большими наборами данных и может использоваться для кэширования временных наборов данных с возможностью сохранения. DuckDB имеет поддержку SQL и может улучшить интеграцию с существующими системами.
Преимущества:
- Поддержка сложных структур данных через SQL.
- Встроенная поддержка хранения на диске.
- Хорошо документированная C++ API.
Заключение
При выборе библиотеки для кэширования следует учитывать множество факторов, включая требования к производительности, специфику задач, которые необходимо решить, а также поддержку со стороны сообщества и документации. Apache Ignite и Redis могут стать отличными вариантами для большинства задач, связанных с кэшированием с долговременным хранением данных, а также дополнительная интеграция с другими библиотеками, такими как Hiredis или DuckDB, может усилить функциональность вашего приложения.
Важно также протестировать каждую из упомянутых библиотек в вашей среде, чтобы удостовериться, что она полностью соответствует вашим требованиям по производительности и возможностям.