Эффективная структура данных для кэширования папок и файлов - PullRequest
2 голосов
/ 23 ноября 2011

У нас есть сервисный уровень, который выглядит следующим образом

interface StructureService {
    void create(FileEntry entry, EntryType type) throws IOException;
    Collection<FileEntry> getChildren(FileEntry entry)  throws IOException;
    void delete(FileEntry entry) throws IOException;
    void rename(FileEntry file, FileEntry newFile) throws IOException;
    void copy(FileEntry source, FileEntry destination) throws IOException;
    EntryType getType(FileEntry entry);
    long getLastModified(FileEntry entry) throws IOException;
    long getSize(FileEntry entry) throws IOException;
}

Мы создали прокси для кэширования этих сервисов, так как источник данных может исходить из базы данных или вызова rpc.

В настоящее время реализация кэша очищает весь кэш и восстанавливает его после операции модификации.Это привело к условиям гонки, которые можно было бы решить путем синхронизации вызовов.Однако это очень неэффективно.

Вместо этого мы хотели бы изменить структуру для каждой операции.

Интересно, существует ли хорошая, предпочтительно без блокировки, известная реализация Java, которая может помочь в этом?сценарий.

Мы используем memcache в google app engine в качестве бэкэнда, поэтому может помочь хранение каждой записи с парами ключ-значение.

1 Ответ

1 голос
/ 23 ноября 2011

Если ваша структура представляет собой дерево папок / файлов, попробуйте получить блокировку от корня до листьев и затем выполните вашу операцию.Используйте ReadAndWriteLock для каждого элемента.

Если вы читаете, используйте readlock.Если вы пишете, используйте блокировку чтения для родителей, за исключением родительского элемента и самого элемента.С ними используйте блокировку записи.

Когда вы получаете что-то, получите блокировку (создавая ее при необходимости), возьмите данные (читая их, если не в кеше), сделайте это и снимите блокировку.

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

Образцы

Обновить / a / b / c / d

lock for a - grab read lock
lock for b - grab read lock
lock for c - gran read lock
lock for d - grab write lock

создать / удалить / a / b / c / d

lock for a - grab read lock
lock for b - grab read lock
lock for c - gran **write** lock // you are modifying c's list of files

список / a / b / c / d

lock for a - grab read lock
lock for b - grab read lock
lock for c - gran read lock
lock for d - grab read lock

Примечание

Я действительно не знаю, как лучше всего реализовать это в GAE.Это работает, если у вас есть уникальные замки для каждого предмета.В случае GAE ... я не знаю, можете ли вы получить это.

...