diff --git a/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java b/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java index 1cfea6077..7f4dd9ba9 100644 --- a/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java +++ b/redisson/src/main/java/org/redisson/spring/cache/RedissonSpringCacheManager.java @@ -18,8 +18,8 @@ package org.redisson.spring.cache; import java.io.IOException; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.redisson.api.RMap; import org.redisson.api.RMapCache; @@ -48,7 +48,8 @@ public class RedissonSpringCacheManager implements CacheManager, ResourceLoaderA private RedissonClient redisson; - private Map configMap = new HashMap(); + private Map configMap = new ConcurrentHashMap(); + private Map instanceMap = new ConcurrentHashMap(); private String configLocation; @@ -159,34 +160,56 @@ public class RedissonSpringCacheManager implements CacheManager, ResourceLoaderA @Override public Cache getCache(String name) { + Cache cache = instanceMap.get(name); + if (cache != null) { + return cache; + } + CacheConfig config = configMap.get(name); if (config == null) { config = new CacheConfig(); configMap.put(name, config); - RMap map = createMap(name); - return new RedissonCache(redisson, map); + return createMap(name); } + if (config.getMaxIdleTime() == 0 && config.getTTL() == 0) { - RMap map = createMap(name); - return new RedissonCache(redisson, map); + return createMap(name); } - RMapCache map = createMapCache(name); - return new RedissonCache(redisson, map, config); + + return createMapCache(name, config); } - private RMap createMap(String name) { + private Cache createMap(String name) { + RMap map; if (codec != null) { - return redisson.getMap(name, codec); + map = redisson.getMap(name, codec); + } else { + map = redisson.getMap(name); + } + + Cache cache = new RedissonCache(redisson, map); + Cache oldCache = instanceMap.putIfAbsent(name, cache); + if (oldCache != null) { + cache = oldCache; } - return redisson.getMap(name); + return cache; } - private RMapCache createMapCache(String name) { + private Cache createMapCache(String name, CacheConfig config) { + RMapCache map; if (codec != null) { - return redisson.getMapCache(name, codec); + map = redisson.getMapCache(name, codec); + } else { + map = redisson.getMapCache(name); + } + + Cache cache = new RedissonCache(redisson, map, config); + Cache oldCache = instanceMap.putIfAbsent(name, cache); + if (oldCache != null) { + cache = oldCache; } - return redisson.getMapCache(name); + return cache; } @Override