Пользовательская реализация кэширования в Java

Я хочу реализовать какое-то облегченное кэширование в Java, которое легко интегрируется в Java и должно быть легко развернуто с помощью приложения Java.

Уровень кэша будет находиться между приложением и уровнем базы данных: нет кэширования базы данных, нет Spring, нет Hibernate, нет EHcache, нет http-кэширования.

Мы можем использовать файловую систему или базу данных nano, чтобы кеш можно было восстановить, чтобы кеш можно было восстановить после перезапуска процесса.

Я попробовал LRU Cache:

http://stackru.com/questions/224868/easy-simple-to-use-lru-cache-in-java

http://www.programcreek.com/2013/03/leetcode-lru-cache-java/

Но я не уверен, как после переполнения сохранить базу данных в базу данных (какую базу данных лучше использовать для более быстрой вставки и поиска данных). Или я должен использовать файловую систему?

Кто-нибудь имеет лучшие входы для реализации механизма кэширования в Java?

1 ответ

Решение

Но я не уверен, как после переполнения я должен сохранить базу данных в базу данных (какую базу данных лучше использовать для более быстрой вставки и поиска нужных данных) Или мне следует использовать файловую систему?

Это зависит от варианта использования. Если ваши кэшированные значения очень велики, вы можете сохранить каждое из них в файле и использовать хеш ключа кеша в качестве имени файла.

Если у вас есть значения небольшого размера, хранение их в виде отдельных файлов будет сопряжено с большими затратами, поэтому лучше хранить кэшированные записи в одном или нескольких файлах. Чтобы реализовать это, вам нужно изучить "внешние индексы" и "управление памятью" или "управление свободным пространством" (например, оптимальное соответствие, следующее соответствие и стратегии сжатия). Это на самом деле приводит к реализации крошечной базы данных, поэтому можно использовать одну:) Некоторые вещи, которые приходят мне в голову: LevelDB, MapDB, LMDB, RocksDB

Имейте в виду, что операции кэширования выполняются одновременно из приложения, поэтому кеш может исключать значение, и запрос на один и тот же ключ может поступать одновременно. Будете ли вы выполнять только основные операции, такие как Cache.get а также Cache.put или также CAS-операции типа Cache.putIfAbsent? Хотите ли вы эффективно использовать многоядерные системы, как это принято сегодня?

Тем не менее, при использовании крошечной базы данных вам нужно будет подготовиться к нескольким месяцам инженерных работ.

Кто-нибудь имеет лучшие входы для реализации механизма кэширования в Java?

Вы можете прочитать мой блог на http://cruftex.net/, чтобы узнать больше о реализации легкого и быстрого кэширования в Java.

Для реализации кеша с переполнением вы можете взглянуть на imcache. Но imcache не является полноценным универсальным кешем, потому что, например, отсутствуют CAS-операции, см. Интерфейс Cache.

Моя собственная высокопроизводительная реализация кеша Java cache2k, включает в себя CAS-операции, события, загрузчики и средства записи, истечение срока действия и т. Д., И в конечном итоге это также приведет к некоторому переполнению диска. Тем не менее, я не уверен насчет сроков... Когда вы заинтересованы в работе в этой области: взносы приветствуются!

Другие вопросы по тегам