问题描述:oscache集群环境下,如果网络发生故障,会导致集群变成多个小的子群甚至单节点,这期间如果其中一节点做了更新缓存的操作,当网络恢复后,集群中的cache状态会不一致,导致用户看到不同的view。
解决思路:获取网络恢复后子群合并时产生的通知,并进行更新。最简单有效的就是清空所有节点的缓存。
jar版本:oscache2.4.1 jgroups2.12.1
oscache在集群环境下的配置需要打开cache.event.listeners属性,里面包含JavaGroupsBroadcastingListener。
JavaGroupsBroadcastingListener使用了JGroups的NotificationBus进行通信,而NotificationBus实现了receiver接口,其中的ViewAccept就是在view变化时被调用的。
我们需要做的是重写JavaGroupsBroadcastingListener的初始化方法。
重写NotificationBus的viewAccept方法。
修改oscache.properties里面的cache.event.listeners.
红色是添加或修改的,上代码:
MySelfJavaGroupsBroadcastingListener类:
public synchronized void initialize(Cache cache, Config config) throws InitializationException {
super.initialize(cache, config);
String properties = config.getProperty(CHANNEL_PROPERTIES);
String multicastIP = config.getProperty(MULTICAST_IP_PROPERTY);
if ((properties == null) && (multicastIP == null)) {
multicastIP = DEFAULT_MULTICAST_IP;
}
if (properties == null) {
properties = DEFAULT_CHANNEL_PROPERTIES_PRE + multicastIP.trim() + DEFAULT_CHANNEL_PROPERTIES_POST;
} else {
properties = properties.trim();
}
if (log.isInfoEnabled()) {
log.info("Starting a new JavaGroups broadcasting listener with properties=" + properties);
}
try {
bus = new MySelfNotificationBus(BUS_NAME, properties); bus.start();
bus.getChannel().setOpt(Channel.LOCAL, new Boolean(false));
bus.setConsumer(this);
log.info("JavaGroups clustering support started successfully");
} catch (Exception e) {
throw new InitializationException("Initialization failed: " + e);
}
}
MySelfNotificationBus类:
public class MySelfNotificationBus extends NotificationBus {
public MySelfNotificationBus (String bus_name, String properties) throws Exception {
super(bus_name,properties);
}
public synchronized void viewAccepted(View new_view) {
super.viewAccepted(new_view);
final NotificationBus bus = this;
if(new_view instanceof MergeView){
new Thread() {
public void run() {
bus.notifyConsumer(new ClusterNotification(ClusterNotification.FLUSH_CACHE,new Date()));
}
}.start();
}
}
oscache.properties:
cache.event.listeners=
x.x.x.MySelfJavaGroupsBroadcastingListener, \
com.opensymphony.oscache.extra.CacheEntryEventListenerImpl, \
com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl, \
com.opensymphony.oscache.extra.ScopeEventListenerImpl
分享到:
相关推荐
osCache的核心功能包括缓存管理、缓存同步以及集群支持,尤其在处理大数据量和高并发场景下表现优异。 一、osCache简介 osCache最初由JBOSS公司开发,后成为开源项目。它提供了一个基于内存的缓存解决方案,可以在...
- **集群支持**:在分布式环境中,osCache可以实现多节点间的缓存同步,确保数据一致性。 - **缓存预热**:允许在应用启动时加载预定义的数据到缓存,提高应用启动速度。 - **缓存监听器**:可以通过监听器来监控...
osCache的核心特性包括内存管理、缓存策略、缓存同步以及对分布式环境的支持。 首先,osCache的内存管理机制允许开发者设置缓存的最大大小,一旦达到设定值,它会根据预设的淘汰策略自动清理过期或最少使用的项。这...
oscache不仅限于简单的对象缓存,还提供了集群缓存的支持。在分布式环境中,多台服务器共享同一份缓存,确保所有节点都能访问到最新的数据。通过使用JMS(Java Message Service)或RMI(Remote Method Invocation)...
此外,OSCache还支持集群环境下的缓存同步,通过`ClusteredCache`接口,可以在多台服务器之间共享缓存数据,实现分布式缓存。这在大型分布式系统中非常关键,因为它能确保数据的一致性和可用性。 OSCache的配置主要...
OSCache 还支持多种特性,如集群缓存、缓存同步、缓存预热等。在集群环境中,OSCache 可以通过 JGroups 实现分布式缓存,使得多个服务器间的数据共享和一致性得以保证。缓存预热是指在应用启动时,预先加载一部分...
6. **缓存同步**: 在分布式环境中,OSCache 支持集群间的缓存同步,保证所有节点的数据一致性。 **二、OSCache 的工作原理** OSCache 基于 JVM 内存进行缓存,通过序列化和反序列化对象来存储和读取。当一个对象被...
本项目实现了LRU(Least Recently Used)算法,这是一种常用的页面替换策略,用于决定在内存空间有限的情况下,哪些对象应该被移出缓存。 LRU算法的基本思想是,最近最少使用的对象优先被淘汰。当缓存满时,如果...
当一个节点更新缓存时,其他节点会通过广播机制接收到这个更新,从而保持所有节点的缓存同步。这种设计对于大型分布式系统来说至关重要,因为它能保证数据的一致性并提高系统的可用性。 在“cacheTest1”和...
OSCache是Java应用程序中常用的缓存解决方案之一,尤其在J2EE系统中,它能显著提升系统的运行性能。本文将深入解析OSCache的工作原理、主要功能以及如何在实际项目中应用,以帮助开发者理解并有效地利用这个工具。 ...
osCache 是一款强大的缓存解决方案,尤其在Java开发中被广泛使用。它不仅提供了类似于Map的数据结构操作,还具备内置的集群支持,使得数据缓存可以在分布式环境中高效地进行。这个"oscache-2.1.1-full.zip"压缩包...
OSCache的使用并不复杂,开发者可以通过官方文档进一步了解详细配置和高级功能,例如缓存预热、缓存同步、缓存锁定等,以充分利用其性能优化潜力。 总结,OSCache作为一款强大的缓存框架,不仅提高了Web应用的性能...
2. **分布式缓存**:支持多节点间的缓存同步,适合于分布式环境,确保在集群中的数据一致性。 3. **缓存策略**:提供了多种缓存策略,如LRU(Least Recently Used)最近最少使用、FIFO(First In First Out)先进先...
5. **分布式缓存**: 在集群环境下,OSCache支持分布式缓存,使得多个节点间的缓存保持同步。这样,无论用户请求哪个节点,都能获取到相同且最新的缓存数据,增强了系统的可扩展性和可用性。 6. **缓存预热**: 开启...
OSCache提供了一种便捷的方式来管理Web应用程序中的对象缓存,支持本地缓存和分布式缓存,适用于单服务器和集群环境。其主要特性包括: 1. **自动缓存更新**:OSCache能够监听对象的变化,并自动更新缓存中的内容,...
在使用二级缓存时,需要注意缓存同步和失效的问题,因为缓存中的数据可能与数据库中的数据不同步。因此,需要正确配置缓存的生命周期和清理策略,以确保数据一致性。 总之,Hibernate的二级缓存是一个强大的工具,...
2. **Cache策略**:对象级缓存如HashMap在单机环境下可能无法适应集群环境,需要采用分布式缓存如Ehcache、JBossCache、OSCache,或者集中式缓存如Memcached。选择哪种取决于项目需求。 3. **线程和定时器**:在...
但是这些东西一旦运用于集群环境就需要在设计的时候就要考虑到、否则真是有解决不完的问题接踵而来,该实现序列化的要实现,单例模式、静态变量、线程同步、定时器重复执行,缓存增删更新通知问题、使用的时候就...
Liferay应支持在不停止服务的情况下进行节点的增删,以实现无缝扩展。 7. **监控与故障检测**: 设置健康检查机制,如定期发送心跳信号,一旦发现某节点响应异常,负载均衡器应立即将其从池中剔除,防止故障传播。...