diff --git a/CHANGES.md b/CHANGES.md index 631cc735451ef5f8cca512b939a36bc127c57029..b4913a37b349093d0397c8858cbe4d7413dde34b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,17 @@ # J2Cache 版本更新记录 +**j2cache-core 2.8.2 (2020-4-26)** + +1. 修复在使用redis-cluster时redisClient未初始化导致NPE +2. redis二级缓存的keys、clear方法使用scan命令实现(以应对云平台Redis服务对keys命令的限制) + +**j2cache-core 2.8.1 (2020-4-16)** + +* 修复redis使用lettuce连接时,设置密码中出现特殊字符'@'时连接地址及密码解析出错的异常(感谢 [@eddy](https://gitee.com/xqxyxchy)) +详情请看 [https://gitee.com/ld/J2Cache/pulls/149](https://gitee.com/ld/J2Cache/pulls/149) + + +------ **J2Cache 2.4.1-release (2018-8-xx)** diff --git a/README.md b/README.md index b757a403d229a14dded60a927f52c5cd9909f211..017339b015009a6e2cf4655591f348dab814cc43 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -![J2Cache](docs/J2Cache.png) - -# J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架 - +
+ +
++
Just for Inner Use.
* @@ -69,27 +78,29 @@ public abstract class CacheChannel implements Closeable , AutoCloseable { */ public CacheObject get(String region, String key, boolean...cacheNullObject) { + this.assertNotClose(); + CacheObject obj = new CacheObject(region, key, CacheObject.LEVEL_1); - obj.setValue(CacheProviderHolder.getLevel1Cache(region).get(key)); + obj.setValue(holder.getLevel1Cache(region).get(key)); if(obj.rawValue() != null) return obj; String lock_key = key + '%' + region; synchronized (_g_keyLocks.computeIfAbsent(lock_key, v -> new Object())) { - obj.setValue(CacheProviderHolder.getLevel1Cache(region).get(key)); + obj.setValue(holder.getLevel1Cache(region).get(key)); if(obj.rawValue() != null) return obj; try { obj.setLevel(CacheObject.LEVEL_2); - obj.setValue(CacheProviderHolder.getLevel2Cache(region).get(key)); - if (obj.rawValue() != null) - CacheProviderHolder.getLevel1Cache(region).put(key, obj.rawValue()); - else { - boolean cacheNull = (cacheNullObject.length>0)?cacheNullObject[0]: defaultCacheNullObject; - if(cacheNull) - set(region, key, newNullObject(), true); - } + obj.setValue(holder.getLevel2Cache(region).get(key)); + if (obj.rawValue() != null) { + holder.getLevel1Cache(region).put(key, obj.rawValue()); + }else { + boolean cacheNull = (cacheNullObject.length > 0) ? cacheNullObject[0] : defaultCacheNullObject; + if (cacheNull) + set(region, key, newNullObject(), true); + } } finally { _g_keyLocks.remove(lock_key); } @@ -107,6 +118,9 @@ public abstract class CacheChannel implements Closeable , AutoCloseable { * @return cache object */ public CacheObject get(String region, String key, Function