`

解决OSCache集群情况下缓存不同步的问题

阅读更多
问题描述: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简介 osCache最初由JBOSS公司开发,后成为开源项目。它提供了一个基于内存的缓存解决方案,可以在...

    oscache-java缓存框架

    - **集群支持**:在分布式环境中,osCache可以实现多节点间的缓存同步,确保数据一致性。 - **缓存预热**:允许在应用启动时加载预定义的数据到缓存,提高应用启动速度。 - **缓存监听器**:可以通过监听器来监控...

    oscache缓存

    osCache的核心特性包括内存管理、缓存策略、缓存同步以及对分布式环境的支持。 首先,osCache的内存管理机制允许开发者设置缓存的最大大小,一旦达到设定值,它会根据预设的淘汰策略自动清理过期或最少使用的项。这...

    oscache对象缓存

    oscache不仅限于简单的对象缓存,还提供了集群缓存的支持。在分布式环境中,多台服务器共享同一份缓存,确保所有节点都能访问到最新的数据。通过使用JMS(Java Message Service)或RMI(Remote Method Invocation)...

    OSCache缓存技术(6)【实例】

    此外,OSCache还支持集群环境下的缓存同步,通过`ClusteredCache`接口,可以在多台服务器之间共享缓存数据,实现分布式缓存。这在大型分布式系统中非常关键,因为它能确保数据的一致性和可用性。 OSCache的配置主要...

    OSCache简介

    OSCache 还支持多种特性,如集群缓存、缓存同步、缓存预热等。在集群环境中,OSCache 可以通过 JGroups 实现分布式缓存,使得多个服务器间的数据共享和一致性得以保证。缓存预热是指在应用启动时,预先加载一部分...

    oscache2.1_ful

    6. **缓存同步**: 在分布式环境中,OSCache 支持集群间的缓存同步,保证所有节点的数据一致性。 **二、OSCache 的工作原理** OSCache 基于 JVM 内存进行缓存,通过序列化和反序列化对象来存储和读取。当一个对象被...

    Java对象缓存系统的实现,实现了LRU算法,并可以进行集群同步

    本项目实现了LRU(Least Recently Used)算法,这是一种常用的页面替换策略,用于决定在内存空间有限的情况下,哪些对象应该被移出缓存。 LRU算法的基本思想是,最近最少使用的对象优先被淘汰。当缓存满时,如果...

    oscache.rar

    当一个节点更新缓存时,其他节点会通过广播机制接收到这个更新,从而保持所有节点的缓存同步。这种设计对于大型分布式系统来说至关重要,因为它能保证数据的一致性并提高系统的可用性。 在“cacheTest1”和...

    应用OSCache提升J2EE系统运行性能

    OSCache是Java应用程序中常用的缓存解决方案之一,尤其在J2EE系统中,它能显著提升系统的运行性能。本文将深入解析OSCache的工作原理、主要功能以及如何在实际项目中应用,以帮助开发者理解并有效地利用这个工具。 ...

    oscache-2.1.1-full.zip_full_oscache_oscache 2_oscache2

    osCache 是一款强大的缓存解决方案,尤其在Java开发中被广泛使用。它不仅提供了类似于Map的数据结构操作,还具备内置的集群支持,使得数据缓存可以在分布式环境中高效地进行。这个"oscache-2.1.1-full.zip"压缩包...

    Cache技术--OSCache

    OSCache的使用并不复杂,开发者可以通过官方文档进一步了解详细配置和高级功能,例如缓存预热、缓存同步、缓存锁定等,以充分利用其性能优化潜力。 总结,OSCache作为一款强大的缓存框架,不仅提高了Web应用的性能...

    oscache-2.3.jar

    2. **分布式缓存**:支持多节点间的缓存同步,适合于分布式环境,确保在集群中的数据一致性。 3. **缓存策略**:提供了多种缓存策略,如LRU(Least Recently Used)最近最少使用、FIFO(First In First Out)先进先...

    应用OSCache提升J2EE系统.pdf

    5. **分布式缓存**: 在集群环境下,OSCache支持分布式缓存,使得多个节点间的缓存保持同步。这样,无论用户请求哪个节点,都能获取到相同且最新的缓存数据,增强了系统的可扩展性和可用性。 6. **缓存预热**: 开启...

    页面缓存的小测试

    OSCache提供了一种便捷的方式来管理Web应用程序中的对象缓存,支持本地缓存和分布式缓存,适用于单服务器和集群环境。其主要特性包括: 1. **自动缓存更新**:OSCache能够监听对象的变化,并自动更新缓存中的内容,...

    二级缓存详解

    在使用二级缓存时,需要注意缓存同步和失效的问题,因为缓存中的数据可能与数据库中的数据不同步。因此,需要正确配置缓存的生命周期和清理策略,以确保数据一致性。 总之,Hibernate的二级缓存是一个强大的工具,...

    java应用服务器集群环境下代码编写要注意的问题参照.pdf

    2. **Cache策略**:对象级缓存如HashMap在单机环境下可能无法适应集群环境,需要采用分布式缓存如Ehcache、JBossCache、OSCache,或者集中式缓存如Memcached。选择哪种取决于项目需求。 3. **线程和定时器**:在...

    Tomcat集群案例

    但是这些东西一旦运用于集群环境就需要在设计的时候就要考虑到、否则真是有解决不完的问题接踵而来,该实现序列化的要实现,单例模式、静态变量、线程同步、定时器重复执行,缓存增删更新通知问题、使用的时候就...

    Liferay集群负载均衡配置

    Liferay应支持在不停止服务的情况下进行节点的增删,以实现无缝扩展。 7. **监控与故障检测**: 设置健康检查机制,如定期发送心跳信号,一旦发现某节点响应异常,负载均衡器应立即将其从池中剔除,防止故障传播。...

Global site tag (gtag.js) - Google Analytics