新发地网站建设网页设计工资一般2017
web/
2025/10/3 6:02:55/
文章来源:
新发地网站建设,网页设计工资一般2017,wordpress 语言切换,网站模板和后台背景
如果各位看官是分布式项目应该都采用分布式缓存了#xff0c;例如redis等#xff0c;分布式缓存不在本次讨论范围哈#xff1b;我个人建议是#xff0c;如果是用户量比较大#xff0c;建议采用分布式缓存机制#xff0c;后期可以很容易前后到分布式服务或微服务。 …背景
如果各位看官是分布式项目应该都采用分布式缓存了例如redis等分布式缓存不在本次讨论范围哈我个人建议是如果是用户量比较大建议采用分布式缓存机制后期可以很容易前后到分布式服务或微服务。
我这边项目基本上都是单体架构因为业务场景需要用户一般就几十个最多最多也就是100多用户所以单体是完全满足的同时用户对于系统的要求也不高因此采用了单体架构但是后期可以切换到分布式这是后期需求如果遇到在调整。
问题
ok背景介绍完。那就是说下单体的问题出现的情况由于业务场景需要很多的应用缓存和功能局部缓存一开始设计这块时就没好好设计这块现在遇到问题了第一个应用缓存比较乱(也有公共的缓存机制但是有些业务不希望放到公共缓存里一般就在当前类上定义了缓存)第二个线上也出现了几次因为缓存未及时刷新造成垃圾数据的产生因此在这些问题的出现后需要进一步设计缓存机制了在不大调整业务代码的前提下如何及时进行刷新应用缓存呢 应用缓存刷新
一开始刷新机制很简单有模糊匹配缓存key进行删除有指定key进行删除的但是总有写业务写的不太规范有些乱关键后期也不晓得在什么情况下进行刷新了缓存这样的操作将会给后期项目遗留问题怎么解决呢方案是创建缓存接口需要进行实现接口然后需要进行缓存刷新的实现该接口进行处理什么时间进行刷新呢根据业务进行通知即可现在面临着一个问题有些类是交给spring管理的有些类是项目自己管理的并没有交给spring这个问题如何解决呢也好解决第一种全部交给spring容器管理通过spring拿到所有刷新缓存接口实现类进行循环调用刷新接口这块属于一刀切不过比较简单我这边没有采用第二种是原有代码不调整之前什么样就是什么样那就要有spi机制这块可以采用谷歌服务发现方式这里还需要考虑一个问题如果交给spring就不用spi发现没有交给spring就需要进行发现但是为了防止重复优先使用sping机制进行获取所偶刷新解决的实现类然后通过spi找到所有实现的类进行排查把增量的实现类添加给缓存类进行统一循环处理即可 demo
Service
Slf4j
public class RefreshCacheUtils implements ApplicationContextAware, ApplicationRunner {private final static ListRefreshCache REFRESH_CACHE_LIST new ArrayList();private ApplicationContext applicationContext;public static void refreshByDeviceId(String deviceId) {for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {refreshCache.refreshByDeviceId(deviceId);}}public static void refreshByBusinessId(String businessId) {for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {refreshCache.refreshByBusinessId(businessId);}}public static void refreshdDefaultExecution(String otherParameter) {for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {refreshCache.defaultExecution(otherParameter);}}/*** param args* throws Exception*/Overridepublic void run(ApplicationArguments args) throws Exception {MapString, RefreshCache beans applicationContext.getBeansOfType(RefreshCache.class);//使用jdk提供的类ServiceLoader来加载RefreshCache的子类//如果服务发现没有请检查RefreshCache实现类是否添加注解AutoService(value RefreshCache.class)//如果实现了RefreshCache的对应的类是被spring管理就不用加AutoService(value RefreshCache.class)这块逻辑已经进行整合了ServiceLoaderRefreshCache loaders ServiceLoader.load(RefreshCache.class);//把spring容器里的Cache实现类直接放入缓存REFRESH_CACHE_LIST.addAll(beans.values());//在进行处理spiloaders.stream().forEach(s - {//是否已经存在spring容器进行打标记AtomicBoolean isExistFlag new AtomicBoolean(false);for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {String name refreshCache.getClass().getName();String spiName s.get().getClass().getName();//判断spi的对象是否在spring容器里如果在直接打上标记为true并结束循环if (name.equals(spiName) || name.contains(spiName $$)) {isExistFlag.set(true);break;}}//判断标记是否为true如果为true就说明都不处理如果为false加入到刷新缓存列表if (!isExistFlag.get()) {REFRESH_CACHE_LIST.add(s.get());}});log.info(所有待刷新缓存对象信息初始化完成{}, REFRESH_CACHE_LIST);}/*** param applicationContext* throws BeansException*/Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext applicationContext;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86053.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!