polar-bear-cache

Polar Bear Cache

Goal

設計

由於緩存通常應用在不頻繁異動的資料上,所以不應該每次都向第三方緩存服務取得資料,而是透過 MQ Service 廣播和訂閱訊息功能,發布註銷的事件,將對應的資料清除,大幅提高系統效能,降低龐大架構的維護成本

Usage

Single Service

SpringBootApplication

@EnablePolarBearCache
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

CacheConfig

public class CacheConfig {
  @Bean
  @Primary
  public PolarBearCacheManager polarBearCacheManager() {
      return new BasicCacheManager();
  }
}

Multi Service

The architecture of multiple services needs to send evict events to other services through EventService.

SpringBootApplication

@EnablePolarBearCache
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

CacheEventServiceImpl

Redis example.

public class CacheEventServiceImpl extends PolarBearCacheEventService implements InitializingBean {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisMessageListenerContainer redisMessageListenerContainer;

    @Autowired
    private DefaultClientResources defaultClientResources;

    private final String topic = "cache";
    
    @Override
    public void afterPropertiesSet() throws Exception {
        defaultClientResources.eventBus().get().subscribe((event) -> {
            if (event instanceof ConnectedEvent) {
                publishConnectedEvent();
            }
        });
    }

    @Override
    public void send(String body) {
        stringRedisTemplate.convertAndSend(topic, body);
    }

    @Override
    public void addListener(Consumer<String> listener) {
        redisMessageListenerContainer.addMessageListener((message, pattern) -> {
            log.info("pattern:{},message:{}", new String(pattern), message);
            listener.accept(new String(message.getBody()));
        }, new PatternTopic(topic));
    }
}

CacheConfig

public class CacheConfig {
  @Bean
  public PolarBearCacheEventService polarBearCacheEventService() {
      return new CacheEventServiceImpl();
  }

  @Bean
  @Primary
  public PolarBearCacheManager polarBearCacheManager() {
      return new BasicCacheManager();
  }
}

使用方式

Reference Spring Cacheable