diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCache.java b/src/main/java/org/springframework/data/redis/cache/RedisCache.java index 8a8bc2405..9b82d35de 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCache.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCache.java @@ -43,6 +43,7 @@ class RedisCache implements Cache { private final byte[] setName; private final byte[] cacheLockName; private long WAIT_FOR_LOCK = 300; + private final long expire; /** * @@ -50,22 +51,23 @@ class RedisCache implements Cache { * * @param name cache name * @param prefix - * @param cachePrefix - */ - RedisCache(String name, byte[] prefix, RedisTemplate template) { + * @param template + * @param expire + */ + RedisCache(String name, byte[] prefix, RedisTemplate template, long expire) { Assert.hasText(name, "non-empty cache name is required"); this.name = name; this.template = template; this.prefix = prefix; + this.expire = expire; StringRedisSerializer stringSerializer = new StringRedisSerializer(); // name of the set holding the keys - String sName = name + "~keys"; - this.setName = stringSerializer.serialize(sName); - this.cacheLockName = stringSerializer.serialize(name + "~lock"); - } + this.setName = stringSerializer.serialize(name + "~keys"); + this.cacheLockName = stringSerializer.serialize(name + "~lock"); + } public String getName() { return name; @@ -102,6 +104,9 @@ class RedisCache implements Cache { waitForLock(connection); connection.multi(); connection.set(k, template.getValueSerializer().serialize(value)); + if (expire > 0) { + connection.expire(k, expire); + } connection.zAdd(setName, 0, k); connection.exec(); diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java b/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java index 73c37cb96..8de28c475 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java @@ -18,6 +18,8 @@ package org.springframework.data.redis.cache; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -42,6 +44,10 @@ public class RedisCacheManager implements CacheManager { private boolean usePrefix; private RedisCachePrefix cachePrefix = new DefaultRedisCachePrefix(); + // 0 - never expire + private long defaultExpireTime = 0; + private Mapexpires = new HashMap(); + public RedisCacheManager(RedisTemplate template) { this.template = template; } @@ -49,7 +55,8 @@ public class RedisCacheManager implements CacheManager { public Cache getCache(String name) { Cache c = caches.get(name); if (c == null) { - c = new RedisCache(name, (usePrefix ? cachePrefix.prefix(name) : null), template); + long expire = (expires.containsKey(name)) ? expires.get(name) : defaultExpireTime; + c = new RedisCache(name, (usePrefix ? cachePrefix.prefix(name) : null), template, expire); caches.put(name, c); } @@ -60,7 +67,11 @@ public class RedisCacheManager implements CacheManager { return names; } - /** + public void setUsePrefix(boolean usePrefix) { + this.usePrefix = usePrefix; + } + + /** * Sets the cachePrefix. * * @param cachePrefix the cachePrefix to set @@ -68,4 +79,22 @@ public class RedisCacheManager implements CacheManager { public void setCachePrefix(RedisCachePrefix cachePrefix) { this.cachePrefix = cachePrefix; } + + /** + * Set default expire time. + * + * @param defaultExpireTime time in ms + */ + public void setDefaultExpireTime(long defaultExpireTime) { + this.defaultExpireTime = defaultExpireTime; + } + + /** + * Set expire time for caches + * + * @param expires time in ms + */ + public void setExpires(Map expires) { + this.expires = expires; + } } \ No newline at end of file