Java 番石榴:在彼此之间同步几个加载缓存
我有:基于WebSocket(非阻塞io)的Web应用程序。浏览器中的每个用户选项卡都与一个Java 番石榴:在彼此之间同步几个加载缓存,java,concurrency,guava,Java,Concurrency,Guava,我有:基于WebSocket(非阻塞io)的Web应用程序。浏览器中的每个用户选项卡都与一个对等对象关联。还有三个全局对等集合,可通过peer.engine.*对等引用链从每个peer访问。见下面的代码: public class Peer implements WebSocketListener { private org.eclipse.jetty.websocket.api.Session session; private long sessionId; private
对等对象关联。还有三个全局对等集合,可通过peer.engine.*对等引用链从每个peer
访问。见下面的代码:
public class Peer implements WebSocketListener {
private org.eclipse.jetty.websocket.api.Session session;
private long sessionId;
private Engine engine;
public Peer(Engine engine) {
this.engine = engine;
}
//all WebSocketListener methods implementation
}
//singleton
public class Engine {
// Where key is the peer.sessionId
//HERE IS THE POINT: each user can remove, add, replace elements of caches with the same key (`sessionId`) in concurrent way.
LoadingCache<Long, Peer> activePeers;
LoadingCache<Long, Peer> inactivePeers;
LoadingCache<Long, Peer> closedPeers;
private Engine(LoadingCache<Long, Peer> a, LoadingCache<Long, Peer> b, LoadingCache<Long, Peer> c) {
this.activePeers = a;
this.inactivePeers = b;
this.closedPeers = c;
}
}
公共类对等实现WebSocketListener{
private org.eclipse.jetty.websocket.api.Session;
私人长会期;
私人发动机;
公共对等(引擎){
这个。发动机=发动机;
}
//所有WebSocketListener方法的实现
}
//独生子女
公共级引擎{
//其中key是peer.sessionId
//要点是:每个用户都可以用相同的键(`sessionId`)以并发方式删除、添加、替换缓存元素。
加载缓存活动节点;
加载缓存不活动对等点;
加载缓存关闭的指针;
专用引擎(加载缓存a、加载缓存b、加载缓存c){
this.activePeers=a;
这个。不活动对等点=b;
此参数为c;
}
}
问题解释:每个对等方都可以从所有*对等方集合中添加、删除自己或其他对等方,或将其他对等方从一个集合替换到另一个集合问题:有许多同级,所有同级都同时发生
重要的细微差别!:如果用户从多个选项卡使用我的应用程序,他将有许多同龄人。用户只能触摸(意味着添加、删除、替换)他的同行。我的意思是,每个对等方只能触摸(添加、删除、替换)在加载缓存中具有相同键的对等方
问题:我是否需要同步所有这些操作(添加、删除、替换)或者LoadingCache已经为我完成了
p.S.如果你需要额外的解释,尽管问,不客气 呃,为什么不将对等状态嵌入peer
类中呢?这样,您就只有一个缓存需要处理。另外,缓存是如何构建的?您是否设置了RemovalListener
设置?替换/删除/添加是什么意思?您是否通过调用AsMap从缓存中获取映射?或者您是指“无效”方法吗?@fge 2)是的,我有一个RemovalListener
,在某些情况下,它只是将对等方
移动到另一个集合。例如,如果发生访问超时,我会在RemovalListener
中将对等点从activePeers
移动到inactivePeers
。1) 你所说的同侪国家是什么意思。这些集合包含所有用户的所有对等方。我必须将它们存储在一个地方,以允许它们之间的通信users@Chunkz示例:我在inactivePeers
map中有peer1
。在某些事件中,我应该将peer1
和所有truepeer.sessionId==peer1.sessionId
的现有对等方替换为activePeers
缓存。我可以通过使其失效来实现这一点吗?如果是,那么使用asMap
或invalidate
都没有关系。对等方可以有多个状态吗?ie它们可以同时关闭和激活吗?否则,我同意@fge的观点,即指示其当前状态的属性应该创建更干净、更不容易出错的代码。