
能力说明:
掌握封装、继承和多态设计Java类的方法,能够设计较复杂的Java类结构;能够使用泛型与集合的概念与方法,创建泛型类,使用ArrayList,TreeSet,TreeMap等对象掌握Java I/O原理从控制台读取和写入数据,能够使用BufferedReader,BufferedWriter文件创建输出、输入对象。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明一、序言Caffeine是一个进程内部缓存框架。对比Guava CacheCaffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。使用Caffeine后无需使用Guava Cache,从并发的角度来讲,Caffeine明显优于Guava,原因是使用了Java 8最新的StampedLock锁技术。二、缓存简介(一)缓存对比从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性。下面对比三种常用缓存:Redis、EhCache、Caffeine。1、序列化缓存序列化原因Redis必须实现序列化进程间数据传输,因此必须实现序列化。大多数情况下涉及内网网络传输;作为缓存数据库使用,持久化是标配。EhCache不一定需要实现序列化当缓存配置不持久化到磁盘时,无需实现序列化接口。使用时,如果不确定是否需要持久化到磁盘,建议统一实现序列化接口。Caffeine不需要实现序列化Map对象的改进型接口,不涉及任何形式的网络传输和持久化,因此完全不需要实现序列化接口。2、进程关系缓存进程关系备注Redis与业务进程独立,由操作系统独立管理,业务系统重启对缓存服务无影响Redis服务与业务服务独立,互相影响较小EhCache附着于业务进程,业务系统重启,存储与内存部分的缓存数据丢失;存储与硬盘部分的数据继续存在缓存配置存在两种模式:一种是纯内存型,一种是可持久化到磁盘Caffeine附着于业务进程,业务系统重启,缓存数据全部丢失纯内存型内存型缓存的理解:缓存都是使用内存作为存储媒介的,各种缓存服务的区别如下:Caffeine是内存型缓存是指缓存与调用者属于同一个应用,准确的说属于同一个JVM;Redis是指另外一个独立进程的内存型,缓存数据存储在Redis数据库的内存中,而不是在调用服务所属的内存中。(二)本地缓存本地缓存与分布式缓存对应,缓存进程和应用进程同属于一个JVM,数据的读、写在一个进程内完成。本地缓存没有网络开销,访问速度很快。Caffeine是基于Guava Cache增强的新一代缓存技术,缓存性能极其出色。1、MapJDK内置的Map可作为缓存的一种实现方式,然而严格意义来讲,其不能算作缓存的范畴。原因如下:一是其存储的数据不能主动过期;二是无任何缓存淘汰策略。三、SpringCacheCaffeine作为Spring体系中内置的缓存之一,Spring Cache同样提供调用接口支持。(一)需求分析1、CacheManagerCaffeine属于进程内部缓存框架,不需要配置多数据源,因此一个CacheManager即可满足需求。如果应用中仅使用Caffeine作为唯一的缓存框架,那么通过注解使用时无需显式指明。2、CacheName任何一类缓存,不同业务模块间缓存过期时间以及缓存淘汰策略几乎不相同,因此应该支持多CacheName,并且应该具有不同配置。过期时间是不同CacheName间缓存配置的重要区别。3、Key内存型缓存,无可视化界面,因此首要满足键值的唯一性,键值唯一是正确使用业务缓存的基础保证。(二)序列化Caffeine缓存不涉及任何序列化,因此目标缓存对象不需要实现Serializable接口。若涉及多级缓存或者多种缓存共用,其它需要网络传输或者持久化的缓存需要序列化,Caffeine尽管也使用实现序列化的实体类,但是不做序列化操作。不需要序列化,降低了缓存使用难度。(三)集成1、引入依赖如果无特别要求,使用较新SpringBoot的内置版本即可。<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>2、全局配置全局配置中指定使用caffeine缓存管理。spring: cache: type: caffeine3、缓存管理器配置缓存管理器:多CacheName配置。public interface CacheNameTimeConstant { String CACHE_DEFAULT = "CACHE_DEFAULT"; String CACHE_10SECS = "CACHE_10SECS"; String CACHE_60SECS = "CACHE_60SECS"; }同一个CacheManager配置多个CacheName,此处仅配置过期时间的差异,其余配置可自由增加。@Bean public CacheManager caffeineCacheManager() { SimpleCacheManager cacheManager = new SimpleCacheManager(); List<CaffeineCache> caches = new ArrayList<>(); caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_5SECS, Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build())); caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_10SECS, Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build())); caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_30SECS, Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build())); cacheManager.setCaches(caches); return cacheManager; }原文地址
一、序言本文承接Mybatis缓存体系探究,提供基于MybatisPlus技术可用于生产环境下的二级缓存解决方案。1、前置条件掌握MyBatis二级缓存的原理有关MyBatis缓存原理内容,参考Mybatis缓存体系探究选择符合条件的MybatisPlus版本本方案对MybatisPlus版本有严格的限制,使用版本不低于3.4.3.4,如果低于此版本,则无法满足生产环境条件下的闭环需求。正确处理连接(多表)查询正确的多表连接查询,请参考MybatisPlus连接查询解决方案2、目标与收获如果应用有分布式缓存需求,那么直接弃用二级缓存的方案,直接选配业务层缓存方案。假如应用没有分布式场景,那么通过简单改造,引入二级缓存,能够极大提高响应效率。二、原理分析1、二级缓存选用MybatisPlus来实现二级缓存最大的考量是其使用的单表操作,换而言之,正确的使用二级缓存的前提是不能使用传统意义上的多表连接操作,否则一定存在缓存数据不能实时更新的情况。2、缓存数据更新所有的缓存数据必然涉及到数据更新,二级缓存同样需要主动更新数据。二级缓存是以命名空间为单位的,换而言之同一个命名空间内的数据更新会自动触发缓存更新(本质为数据失效)。查询操作缓存数据,增加、修改、删除数据使缓存失效。自成体系的缓存更新与管理在提高了应用响应速度的同时降低了缓存管理的复杂度,有利于提高开发效率。3、缓存的区别这里提到的二级缓存有必要与三级缓存(业务缓存)做区分,二级缓存指DAO层缓存,使用缓存的目的是降低网络IO对应用的影响;三级缓存指业务层缓存,主要是降低复杂计算对CPU性能的占用。三、本地二级缓存对于普通项目,使用内置本地二级缓存即能够满足需求,这里以MybatisPlus为例说明如何正确的使用二级缓存。1、两套APIMybatisPlus内置封装两套访问数据库的API,一是以BaseMapper为基础的API,另一套是以AR为基础的API,二者在使用二级缓存不可通用。表现形式是BaseMapper内置接口缓存的数据,使用AR内置接口更新数据时无法清楚缓存,至少到此版本尚不支持。考虑到BaseMapper接口体系比较丰富,因此选择保留BaseMapper体系接口而禁用AR接口,从机制上保证使用的是一套接口,从而调用增删查改能够实时刷新二级缓存。需要指明的是Mapper层和Service层使用的是同一套接口,因此可放心使用。2、缓存实现类型默认二级缓存实现类型为PerpetualCache,此中类型的缓存要求被缓存的对象实现序列化接口。其它类型的本地缓存有EhCache、Caffeine等。原文地址
2022年02月
2022年01月