有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于缓存文件夹和文件的java高效数据结构

我们有一个如下所示的服务层

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实现可以帮助解决这个问题

我们在google app engine上使用memcache作为后端,因此使用键值对存储每个条目可能会有所帮助


共 (1) 个答案

  1. # 1 楼答案

    如果您的结构是文件夹/文件树,请尝试获取从根到叶的锁,然后执行您的操作。对每个项目使用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中实现这一点的最佳方式是什么。如果你对每件物品都有唯一的锁,它就可以工作。在盖伊的情况下。。。我不知道你能不能得到