Spring实现一个可重复造轮子的缓存功能

70 阅读1分钟
关于缓存市面上太多解决方案了,但是对于单体简单应用属实大才小用了,对于开发经验少的人不好把握,下面就简单实现一个代码级别的缓存功能
  1. 创建appCache接口
public interface AppCache {
    /**
     * 刷新缓存,重新获取
     */
    List<TreeSelect> treeList();

    /**
     * 刷新分类树缓存,重新获取
     */
    void refreshTree();

    /**
     * 刷新全部缓存,重新获取
     */
    void refresh();
}
  1. 创建appCacheMemory实现类
@Service
public class AppCacheMemory implements AppCache {

    private final static Logger logger = LoggerFactory.getLogger(AppCacheMemory.class);

    /**
     * 考虑到可能会对树结构进行更改所以选用更安全的 CopyOnWriteArrayList或者ConcurrentHashMap
     */
    CopyOnWriteArrayList<TreeSelect> treeSelects = new CopyOnWriteArrayList<>();

    @Autowired
    private PmsCategoryServiceImpl pmsCategoryService;

    @Override
    public List<TreeSelect> treeList() {

        return treeSelects;
    }

    @Override
    public void refreshTree() {

        List<TreeSelect> list =pmsCategoryService.listWithTree();
        treeSelects.addAll(list);

    }

    /**
     * 以后业务都要先创建对应刷新缓存方法得到map或者list,然后放到系统刷新执行
     */
    @Override
    public void refresh() {
        refreshTree();
    }
}
  1. 创建AppRunner类实现CommandLineRunner在run方法中把appCache提前加载进去
@Component
@Order(value = 1)
public class AppRunner implements CommandLineRunner {

    private static final Logger LOGGER = LoggerFactory.getLogger(AppRunner.class);

    @Autowired
    private AppCache appCache;

    @Override
    public void run(String... args) {
        LOGGER.info(">>>>>>>>>>>>>>>服务启动执行,执行加载应用信息操作<<<<<<<<<<<<<");

        try {
            //TODO 把appCache提前装配
            appCache.refresh();
        } catch (Exception e) {
            LOGGER.error("应用信息获取失败!!请保证应用配置系统正常启动!");
            e.printStackTrace();
        }
    }
}

大家可以自己写接口测试,把appCache注入调用就行了,我这里就只粘贴核心代码了,经过我的测试原来获取分类数据需要300ms 现在只需148ms。

关于缓存的文章因为最近有业务需求我会持续更新,希望大家多多讨论和关注