用于缓存文件夹和文件的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 楼答案
如果您的结构是文件夹/文件树,请尝试获取从根到叶的锁,然后执行您的操作。对每个项目使用ReadAndWriteLock
如果您正在阅读,请使用readlock。如果正在写入,请为父项使用读锁,但中间父项和项本身除外。使用写锁
当你获得某个东西时,获取锁(必要时创建锁),抓取数据(如果不在缓存中读取数据),执行该操作,然后释放锁
树型锁为父项获取读锁,只为被修改的项获取写锁,这样您可以同时访问,但在修改时可以更正锁定
样本
更新/a/b/c/d
创建/删除/a/b/c/d
清单a/b/c/d
注意
我真的不知道在GAE中实现这一点的最佳方式是什么。如果你对每件物品都有唯一的锁,它就可以工作。在盖伊的情况下。。。我不知道你能不能得到