Выполнение LRU в производственном коде

У меня есть код на C ++, где мне нужно реализовать замену кеша, используя технику LRU.
До сих пор я знаю два метода для выполнения замены LRU:

  1. Использование timeStamp для каждого времени доступа к кэшированным данным и, наконец, сравнения времениStamps во время замены.
  2. Использование стека кэшированных элементов и перемещение их вверх, если к ним обращаются в последнее время, так что, наконец, в нижней части будет присутствовать кандидат LRU.

Итак, какой из них лучше использовать в производственном коде?
Есть ли у них другие лучшие методы?

Недавно я реализовал кеш LRU, используя связанный список, распространенный по hash-карте.

  /// Typedef for URL/Entry pair typedef std::pair< std::string, Entry > EntryPair; /// Typedef for Cache list typedef std::list< EntryPair > CacheList; /// Typedef for URL-indexed map into the CacheList typedef boost::unordered_map< std::string, CacheList::iterator > CacheMap; /// Cache LRU list CacheList mCacheList; /// Cache map into the list CacheMap mCacheMap; 

Преимущество состоит в том, чтобы быть O (1) для всех важных операций.

Алгоритм вставки:

 // create new entry Entry iEntry( ... ); // push it to the front; mCacheList.push_front( std::make_pair( aURL, iEntry ) ); // add it to the cache map mCacheMap[ aURL ] = mCacheList.begin(); // increase count of entries mEntries++; // check if it's time to remove the last element if ( mEntries > mMaxEntries ) { // erease from the map the last cache list element mCacheMap.erase( mCacheList.back().first ); // erase it from the list mCacheList.pop_back(); // decrease count mEntries--; } 

Вот очень простая реализация кэша LRU

https://github.com/lamerman/cpp-lru-cache .

Он прост в использовании и понимает, как он работает. Общий размер кода составляет около 50 строк.

Для простоты, возможно, вам стоит рассмотреть возможность использования карты MultiIndex от Boost. Если мы отделим ключ от данных, мы поддерживаем несколько наборов ключей на одних и тех же данных.

Из [ http://old.nabble.com/realization-of-Last-Recently-Used-cache-with-boost%3A%3Amulti_index-td22326432.html ]:

«… использовать два индекса: 1) hashировать для поиска значение по ключу 2) последовательно для отслеживания последних недавно использованных элементов (получить функцию поместить элемент в качестве последнего элемента в секвенции). Если нам нужно удалить некоторые элементы из кеша, мы можем удалить их от начала последовательности). ”

Обратите внимание, что оператор «project» позволяет программисту эффективно перемещаться между разными индексами одного и того же multi_index_container.

В этой статье описывается реализация с использованием пары контейнеров STL (карта значений ключа плюс список для истории доступа к ключам) или один boost::bimap .

В нашей производственной среде мы используем двойной связанный список C ++, который похож на список, связанный с kernelм Linux . Красота заключается в том, что вы можете добавить объект к как можно большему количеству связанных списков, и вы сможете быстро и просто выполнить операцию списка.

  • Найти наименьшее целое число в списке
  • Поиск всех комбинаций хорошо сформированных скобок
  • Нужна помощь по mod 1000000007 вопросам
  • Самый эффективный способ увидеть, содержит ли ArrayList объект в Java
  • Объединить данные гироскопа и акселерометра
  • Определение пересечения двух сегментов линии?
  • Алгоритм преобразования RGB в HSV и HSV в RGB в диапазоне 0-255 для обоих
  • сортировка двусвязного списка с сортировкой слияния
  • Как округлить float до целых чисел, сохраняя их сумму?
  • Какова временная сложность алгоритмов среднего регулярного выражения?
  • Найдите, находится ли точка внутри выпуклой оболочки для набора точек без вычисления самого корпуса
  • Interesting Posts

    Облачные вычисления и веб-сайты для обмена файлами?

    Как использовать hibernate с MS Access?

    Как ограничить JFileChooser каталогом?

    Быстрый способ узнать, установлено ли установленное приложение 64-разрядной или 32-разрядной

    Что такое копирование и как он оптимизирует идиому копирования и свопинга?

    Как определить, связана ли машина с доменом (на C #)?

    HK2 не вводит HttpServletRequest трикотаж

    Добавить файл stdout в файл из терминала?

    Изменение ярлыков клавиш Windows в Windows 8

    Windows показывает больше пространства, чем на самом деле

    Создать строку с n символами

    Лучшая практика: преобразование результата запроса LINQ в DataTable без цикла

    Японская раскладка клавиатуры в Windows 7 не соответствует тому, что написано на физической клавиатуре

    Как создать пример данных из частных данных (заменяя имена переменных и уровни владельцами неинформативных мест)?

    Как включить OpenSSL в проект Qt

    Давайте будем гением компьютера.