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

Java 用于缓存文件夹和文件的高效数据结构,java,google-app-engine,caching,Java,Google App Engine,Caching,我们有一个如下所示的服务层 interface StructureService { void create(FileEntry entry, EntryType type) throws IOException; Collection<FileEntry> getChildren(FileEntry entry) throws IOException; void delete(FileEntry entry) throws IOException;

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

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;
}
接口结构服务{
void create(FileEntry,EntryType)抛出IOException;
集合getChildren(FileEntry)抛出IOException;
作废删除(FileEntry)抛出IOException;
无效重命名(FileEntry文件,FileEntry新文件)引发IOException;
无效副本(FileEntry源、FileEntry目标)引发IOException;
EntryType getType(FileEntry);
long getLastModified(FileEntry)抛出IOException;
long getSize(FileEntry)抛出IOException;
}
我们已经创建了一个用于缓存这些服务的代理,因为数据源可能来自数据库或rpc调用

当前,缓存实现会清除整个缓存,并在修改操作后重建它。这导致了竞争条件,可以通过同步调用来解决。然而,这是非常低效的

相反,我们希望修改每个操作的结构

我想知道是否有一个好的、最好是无锁的、已知的java实现可以帮助实现这个场景


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

如果您的结构是文件夹/文件树,请尝试获取从根到叶的锁,然后执行您的操作。对每个项目使用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
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 write lock
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的情况下。。。我不知道你是否能做到这一点。

是的,我认为这将很难在谷歌应用程序引擎上实现。您不能以这种方式在memcache中同步调用。谢谢你的回答!好。。。也许,如果您使用某个任意对象进行锁定。。。您可以使用任意读写锁。。。我的意思是,如果您有一些进行同步的静态对象(sync’ed方法,或者sync on static object),您可以使用类似的方法。但我认为假设只有一个过程是危险的。这种锁是JVM/ClassLoader的本地锁。是的,我需要一些可以与外部缓存一起工作的锁,因为应用程序可以在多个JVM上运行