Идея реализации JAVA lru кеша - PullRequest
       4

Идея реализации JAVA lru кеша

0 голосов
/ 10 октября 2018

Я пытаюсь реализовать lru кеш в Java.Моя идея такова:

  • Хранить в relatedList порядок элементов кэша.
  • Хранить в hashMap элементы появляются в списке для относительно быстрой проверки.

Я изо всех сил стараюсь реализовать часть движущегося элемента в начале кеша.Моя идея состояла в том, чтобы отобразить каждый элемент из кэша в конкретный элементный итератор, и таким образом удаление элемента займет время (1) вместо поиска элемента в списке, но поскольку мой список постоянно меняется, итератор бесполезен(Вы можете использовать его только после того, как я закончу все манипуляции в списке).

Я слышал, что такая реализация возможна в C & C ++, есть ли способ реализовать вышеуказанную идею в JAVA?

Может ли кто-нибудь из вас предложить способ реализации вышеуказанного (без использования других структур данных, таких как LinkedHashMap, только связанный список и обычный hashMap)?

Спасибо заранее!

РЕДАКТИРОВАТЬ

Этот код пока что- предположим, что bookId - это то, что я кеширую.

Все операции, которые не выполняются, - это iterator.next () после изменения списка.

private HashMap<String, ListIterator> fromBookNameToIteraot = new HashMap<>();
    private LinkedList<Integer> queue = new LinkedList<>();
    private HashMap<Integer, String> fromBookIdToBookName = new HashMap<>();
    private Iterator<Integer> iterator = queue.listIterator(0);
    private static int bookObjectID = 0;
    private int cacheSize;
    //Ctor
    public LRUCache(int cacheSize) {
        this.cacheSize = cacheSize;
    }

    public void access(String i_BookName){
        int tempBook = 0;
        //In case the requested book in cache (in our map) - O(1) remove operation
        if (fromBookNameToIteraot.containsKey(i_BookName)){
            iterator = fromBookNameToIteraot.get(i_BookName);
            //Validate the queue is not empty, then remove the one from the map
            if(iterator.hasNext()){
                tempBook = iterator.next();
                iterator.remove();
            }
            queue.addFirst(tempBook);
            iterator = queue.listIterator(0);
            fromBookNameToIteraot.put(i_BookName, (ListIterator) iterator);
            return;
        }
        /*
        *In this case the book is not in cache, and the cache is full
        * - get the last book element from queue as least recently used, and remove it.
        * - get the book name (since i don't have DB i used another map to fetch bookName from book object.
        * - delete the book from the cache map.
        * - insert the new book to cache
        * */
        else if(queue.size() == cacheSize) {
            int bookToDel = queue.getLast();
            queue.removeLast();
            String bookNameToDel = fromBookIdToBookName.get(bookToDel);
            fromBookNameToIteraot.remove(bookNameToDel);
            fromBookIdToBookName.remove(bookToDel);
        }

        queue.addFirst(bookObjectID);
        iterator = queue.listIterator(0);
        fromBookNameToIteraot.put(i_BookName, (ListIterator) iterator);
        fromBookIdToBookName.put(bookObjectID, i_BookName);
        bookObjectID++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...