Пользовательская реализация кэширования в 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-операции, события, загрузчики и средства записи, истечение срока действия и т. Д., И в конечном итоге это также приведет к некоторому переполнению диска. Тем не менее, я не уверен насчет сроков... Когда вы заинтересованы в работе в этой области: взносы приветствуются!