# data-update-event **Repository Path**: bingWeb/data-update-event ## Basic Information - **Project Name**: data-update-event - **Description**: 数据更新事件 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-29 - **Last Updated**: 2024-12-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

data-update-event

基于SpringBoot开发的轻量级Java快速开发框架

## 平台简介 一直想做一款缓存自动清理的工具,做C端的同学经常会遇到缓存难维护的问题,容易导致漏删缓存,系统一上线就被反馈为什么我改了配置不生效等等缓存不一致的问题。如此便有了data-update-event。他可以轻松嵌入到springboot生态的web应用程序,任何用到缓存的项目,清除缓存解放双手。代码也是很简易上手,自己可以在此基础上做扩展,也或许你可以参考我的思路,自行去改造更加符合你们的业务场景。 相信常用到缓存的人经常头疼的是什么时候删除缓存,这个就是常常影响缓存一致性的问题所在。但是除此之外,规范性的使用缓存也是尤其重要的。比如:常常有的人喜欢在service直接加缓存,这个是很不好的习惯(可复用、可维护性极差),所以一般单独一个缓存的服务类,引入相应的service再在对应的方法上加缓存注解。也有的人喜欢用编程式的方式增、删、改缓存,这种方式会导致缓存和业务强耦合(当然并不是说编程式都不好,只是大多数场景我们不需要去耦合它),spring提供给我们的就有@Cacheable,用于在方法上的,我这里的例子用的就是这个。 可能同学有疑问,为什么我老介绍缓存而我的项目叫data-update-event。其实是因为清除缓存只是这个data-update-event的一个很实用的一个体现而已。而最核心的代码其实是监听更新DB的事件然后通过事件传播出来。目前event-core内置了两个事件了,一个是注解事件(启动的时候把你所关注的注解跟类的信息做了缓存),一个是DB更新事件(这里目前只接入了mybatis)。这里的DB更新事件其实也用到了注解事件,因为DB更新事件用到了自定义注解。 ## 内置功能 1. 注解加载事件:配置关注的注解,加载到这个注解的时候会触发事件。 2. DB更新事件:这里目前内置的是mybatis触发事件推送。 3. 清除缓存:基于命名空间清除相关缓存(这里是redis)。 ## 参考核心配置 ``` # event配置 config: mybatis: enable: true jpa: enable: true job: enable: true annotation: enable: true monitor: packageName: com.event annotations: - com.event.common.annotation.RepoNameSpace - org.springframework.cache.annotation.Cacheable ``` - config.annotation.enable 控制整个功能的开关 - config.annotation.packageName 扫描(@RepoNameSpace)的路径 - config.annotation.annotations 配置关注的注解(目前的实现这个两个必须保存不变) - enable 开关看自己需求添加 ## 使用说明 1. 保证你的原项目的mybatis和redis都能正常服务 2. 引入event-mybatis-starter 3. 引入event-cache-clear **注意** : - 要手动注入一下IClearCacheService ``` @Bean public IClearCacheService clearCacheService(RedisTemplate redisTemplate) { return new ClearCacheService(redisTemplate); } ``` - 如果自定义了SqlSessionFactory ``` @Autowired(required = false) private MybatisUpdateInterceptor mybatisUpdateInterceptor; // 需要手动设置一下 sessionFactory.setPlugins(new Interceptor[]{mybatisUpdateInterceptor}); ``` ## 模块说明 | event-common | 公共模块一些实体、工具类 | |-----------------------|--------------| | event-core | 核心模块 | | event-mybatis-starter | mybatis事件模块 | | event-cache-clear | 缓存清除模块 | | event-job | 定时任务模块 | | event-cache-example | 案例 | ## 注意 - 因为改项目清除缓存是通过命名空间划分范围,所以在加缓存的时候最好是每个表都有单独的命名空间。意味着,你的代码要更加规范才能体现出这个工具的优点。 - mybatis-plus中批量更新或者新增的时候,无法获取到最新的值(批量操作的机制如此)。如果你一样想管理缓存,需要手动处理如: ``` @RepoSwitch(value = false) public void insertList(List tags){ this.saveBatch(tags); batchClearCacheService.batchClearCache(CacheNameSpace.TOP_ORDER_MAPPER, tags.stream().map(Tag::getTagId).collect(Collectors.toList())); } ```