标签:cn cache list Hutool dicmemo yft 缓存数据 import com
程序中有个从字典表获取数据的service -- TDicdataServiceImpl。
考虑到频繁获取字典数据,后来做了本地缓存。实现方案是利用ScheduledThreadPoolExecutor#schedule 。 在频繁访问这个方法过程中,设定每10分钟清理内存数据。
package com.cn.yft.ora.service.impl; import com.cn.yft.ora.dao.TDicdataDAO; import com.cn.yft.ora.entity.TDicdata; import com.cn.yft.ora.service.TDicdataService; import com.yft.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Slf4j @Service public class TDicdataServiceImpl implements TDicdataService { private static HashMap<String,List<TDicdata>> cacheByDicmemo = new HashMap<>(); private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
@Autowired private TDicdataDAO tDicdataDAO; @SuppressWarnings("unchecked") @Override public List<TDicdata> selectByDicmemo(String dicmemo) { List<TDicdata> list = null; if(StringUtil.isEmpty(dicmemo)) return null; list = cacheByDicmemo.get(dicmemo); if(list == null || list.size() == 0){ list = this.tDicdataDAO.selectByDicDesc(dicmemo); cacheByDicmemo.put(dicmemo, list); } if(executor.getActiveCount()+executor.getQueue().size()==0) { executor.schedule(this::cacheByDicmemoClean,10, TimeUnit.MINUTES); } return list; }
@Override // @Scheduled(cron = "0 0/10 * * * ?") 注解@Scheduled对spring无效,需在spring.xml单独配置CronTriggerBean public void cacheByDicmemoClean() { if(!cacheByDicmemo.isEmpty()) { int size=cacheByDicmemo.size(); cacheByDicmemo.clear(); log.info("#字典缓存已清空---清空缓存---本地缓存--已清空本地内存数据{}条", size); } } }
说来真巧。上面缓存优化是在2020年年底改造的。 而今适逢一年,旧历2021年的年底,使用Hutool-cache的LFUCache来再做一次改造升级。
package com.cn.yft.ora.service.impl; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.LFUCache; import com.cn.yft.ora.dao.TDicdataDAO; import com.cn.yft.ora.entity.TDicdata; import com.cn.yft.ora.service.TDicdataService; import com.yft.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import java.util.HashMap; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Slf4j @Service public class TDicdataServiceImpl implements TDicdataService { // 缓存TTL:10分钟 private static LFUCache<String,List<TDicdata>> cacheByDicmemo = CacheUtil.newLFUCache(16, TimeUnit.MINUTES.toMillis(10)); @Autowired private TDicdataDAO tDicdataDAO; @SuppressWarnings("unchecked") @Override public List<TDicdata> selectByDicmemo(String dicmemo) { List<TDicdata> list = null; if(StringUtil.isEmpty(dicmemo)) return null; list = cacheByDicmemo.get(dicmemo); if(list == null || list.size() == 0){ list = this.tDicdataDAO.selectByDicDesc(dicmemo); log.debug("获取key={},结果条数={}", dicmemo, list.size()); cacheByDicmemo.put(dicmemo, list); } return list; } @Override public void cacheByDicmemoClean() { throw new NotImplementedException(); } }
标签:cn,cache,list,Hutool,dicmemo,yft,缓存数据,import,com 来源: https://www.cnblogs.com/buguge/p/15853551.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。