本文主要研究一下jetcache的MultiLevelCache
jetcache-core/src/main/java/com/alicp/jetcache/Cache.java
Cache接口主要是定义了大写的GET、GET_ALL、PUT、PUT_ALL、REMOVE、REMOVE_ALL、PUT_IF_ABSENT方法,以及基于这些大写方法包装的小写default方法 V get(K key)这样的方法虽然用起来方便,但有功能上的缺陷,当get返回null的时候,无法断定是对应的key不存在,还是访问缓存发生了异常,所以JetCache针对部分操作提供了另外一套API,提供了完整的返回值 另外主要是提供了tryLock、tryLockAndRun的default实现
jetcache-core/src/main/java/com/alicp/jetcache/AbstractCache.java
AbstractCache主要是实现了Cache的GET、GET_ALL、PUT、PUT_ALL、REMOVE、REMOVE_ALL、PUT_IF_ABSENT、computeIfAbsent、close方法,同时它定义了do_GET、do_GET_ALL、do_PUT、do_PUT_ALL、do_REMOVE、do_REMOVE_ALL、do_PUT_IF_ABSENT抽象方法 它有几个子类,分别是AbstractEmbeddedCache、AbstractExternalCache、MultiLevelCache
jetcache-core/src/main/java/com/alicp/jetcache/embedded/AbstractEmbeddedCache.java
AbstractEmbeddedCache继承了AbstractCache,它基于InnerMap实现了AbstractCache定义的一系列do_XXX方法,config方法返回的是EmbeddedCacheConfig 它主要有两个实现类,分别是LinkedHashMapCache、CaffeineCache
jetcache-core/src/main/java/com/alicp/jetcache/external/AbstractExternalCache.java
AbstractExternalCache继承了AbstractCache,其config方法返回的是ExternalCacheConfig,提供了buildKey方法;它有几个实现类,分别是MockRemoteCache、RedisCache(
jedis实现
)、RedisLettuceCache、RedisSpringDataCache、RedissonCache
jetcache-core/src/main/java/com/alicp/jetcache/MultiLevelCache.java
MultiLevelCache继承了AbstractCache,它定义了caches(
Cache[]
)属性,其config方法返回的是MultiLevelCacheConfig 其do_GET方法遍历caches,执行其GET方法,若result为success,则返回,否则继续遍历下一个cache,若都没有success的则返回CacheGetResult.NOT_EXISTS_WITHOUT_MSG;当result为success的时候会执行checkResultAndFillUpperCache方法,将查询到的值回填到遍历到的index及以下的cache上 其do_PUT方法委托给了PUT_caches,其lastIndex参数为caches.length,它遍历caches挨个更新指定key的值 其do_REMOVE方法遍历caches,挨个执行每个cache的REMOVE方法
Cache[]
)属性,其config方法返回的是MultiLevelCacheConfig;其do_GET方法遍历caches,执行其GET方法,若result为success,则返回,否则继续遍历下一个cache,若都没有success的则返回CacheGetResult.NOT_EXISTS_WITHOUT_MSG;当result为success的时候会执行checkResultAndFillUpperCache方法,将查询到的值回填到遍历到的index及以下的cache上;其do_PUT方法委托给了PUT_caches,其lastIndex参数为caches.length,它遍历caches挨个更新指定key的值;其do_REMOVE方法遍历caches,挨个执行每个cache的REMOVE方法