【发布时间】:2011-08-31 13:03:07
【问题描述】:
我正在尝试了解我的应用程序的并发要求。现在,我正在内存中存储每个用户最近更新的地图。结构如下:
Map<String, RecentUpdates> cacheMap; //Key is userId
class RecentUpdates {
public String userId; //the user
public List<EntityUpdate> recentUpdates;
}
class EntityUpdate {
public String timestamp; //The timestamp when the entity was updated
public String id; //The unique entity id
}
地图中的以下线程读/写:
单线程A:
从数据库队列(MongoDB 操作日志)中读取操作。对于每个插入/更新/删除操作:
- 如果用户没有最近更新 缓存映射中的对象,创建它并放置 将其放入缓存映射中。
- 创建一个新的 EntityUpdate 并添加它 到用户的最近更新列表。
单线程B:
迭代缓存映射。如果条目在过去一小时内没有最近更新,则删除该条目
多线程 C 到 Z:
如果缓存映射包含给定用户的最近更新,则迭代最近更新并检索晚于给定时间戳发生的更新。
问题是:
1.缓存映射并发
哪种数据结构最适合缓存映射?并发哈希映射?也许与番石榴不同?
2。最近更新列表并发
鉴于只有一个线程向其中添加项目,我是否需要同步最近的更新列表,或者我可以安全地使用 ArrayList 吗?
如果我是对的,如果线程 A 添加新元素,而线程 C-Z 使用 Iterator 迭代列表,则会抛出 ConcurrentModificationException。但是,如果我使用 for 循环迭代列表是否安全?
for(int i = 0; i < recentUpdates.size(); i++) {}
3.分布式场景
在分布式场景下(线程C-Z在不同的web服务器),能否根据我的需要推荐一个分布式缓存方案(Hazelcast、Terracota...)?
非常感谢
【问题讨论】:
标签: java concurrency distributed