gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:49:49 25 4
gpt4 key购买 nike

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

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 实现可以帮助解决这种情况。

我们在谷歌应用引擎上使用内存缓存作为后端,因此使用键值对存储每个条目可能会有所帮助。

最佳答案

如果您的结构是文件夹/文件树,请尝试获取从根到叶的锁,然后执行您的操作。对每个项目使用 ReadAndWriteLock。

如果您正在阅读,请使用 readlock。如果您正在写作,请为 parent 使用读锁,除了中间 parent 和项目本身。和他们一起使用写锁。

当你获得一些东西时获取锁(必要时创建它),获取数据(如果不在缓存中则读取它),执行操作,然后释放锁。

树状锁为父级获取读锁,只为被修改的项写锁,让您并发访问但修改时正确锁定。

示例

更新/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 案例中......我不知道你是否可以拥有它。

关于java - 用于缓存文件夹和文件的高效数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8241897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com