polish REDIS-102
This commit is contained in:
@@ -43,7 +43,7 @@ class RedisCache implements Cache {
|
|||||||
private final byte[] setName;
|
private final byte[] setName;
|
||||||
private final byte[] cacheLockName;
|
private final byte[] cacheLockName;
|
||||||
private long WAIT_FOR_LOCK = 300;
|
private long WAIT_FOR_LOCK = 300;
|
||||||
private final long expire;
|
private final long expiration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -52,22 +52,22 @@ class RedisCache implements Cache {
|
|||||||
* @param name cache name
|
* @param name cache name
|
||||||
* @param prefix
|
* @param prefix
|
||||||
* @param template
|
* @param template
|
||||||
* @param expire
|
* @param expiration
|
||||||
*/
|
*/
|
||||||
RedisCache(String name, byte[] prefix, RedisTemplate<? extends Object, ? extends Object> template, long expire) {
|
RedisCache(String name, byte[] prefix, RedisTemplate<? extends Object, ? extends Object> template, long expiration) {
|
||||||
|
|
||||||
Assert.hasText(name, "non-empty cache name is required");
|
Assert.hasText(name, "non-empty cache name is required");
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.template = template;
|
this.template = template;
|
||||||
this.prefix = prefix;
|
this.prefix = prefix;
|
||||||
this.expire = expire;
|
this.expiration = expiration;
|
||||||
|
|
||||||
StringRedisSerializer stringSerializer = new StringRedisSerializer();
|
StringRedisSerializer stringSerializer = new StringRedisSerializer();
|
||||||
|
|
||||||
// name of the set holding the keys
|
// name of the set holding the keys
|
||||||
this.setName = stringSerializer.serialize(name + "~keys");
|
this.setName = stringSerializer.serialize(name + "~keys");
|
||||||
this.cacheLockName = stringSerializer.serialize(name + "~lock");
|
this.cacheLockName = stringSerializer.serialize(name + "~lock");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
@@ -104,10 +104,13 @@ class RedisCache implements Cache {
|
|||||||
waitForLock(connection);
|
waitForLock(connection);
|
||||||
connection.multi();
|
connection.multi();
|
||||||
connection.set(k, template.getValueSerializer().serialize(value));
|
connection.set(k, template.getValueSerializer().serialize(value));
|
||||||
if (expire > 0) {
|
|
||||||
connection.expire(k, expire);
|
|
||||||
}
|
|
||||||
connection.zAdd(setName, 0, k);
|
connection.zAdd(setName, 0, k);
|
||||||
|
|
||||||
|
if (expiration > 0) {
|
||||||
|
connection.expire(k, expiration);
|
||||||
|
// update the expiration of the set of keys as well
|
||||||
|
connection.expire(setName, expiration);
|
||||||
|
}
|
||||||
connection.exec();
|
connection.exec();
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ package org.springframework.data.redis.cache;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
@@ -44,9 +43,9 @@ public class RedisCacheManager implements CacheManager {
|
|||||||
private boolean usePrefix;
|
private boolean usePrefix;
|
||||||
private RedisCachePrefix cachePrefix = new DefaultRedisCachePrefix();
|
private RedisCachePrefix cachePrefix = new DefaultRedisCachePrefix();
|
||||||
|
|
||||||
// 0 - never expire
|
// 0 - never expire
|
||||||
private long defaultExpireTime = 0;
|
private long defaultExpiration = 0;
|
||||||
private Map<String, Long>expires = new HashMap<String, Long>();
|
private Map<String, Long> expires = null;
|
||||||
|
|
||||||
public RedisCacheManager(RedisTemplate template) {
|
public RedisCacheManager(RedisTemplate template) {
|
||||||
this.template = template;
|
this.template = template;
|
||||||
@@ -55,23 +54,31 @@ public class RedisCacheManager implements CacheManager {
|
|||||||
public Cache getCache(String name) {
|
public Cache getCache(String name) {
|
||||||
Cache c = caches.get(name);
|
Cache c = caches.get(name);
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
long expire = (expires.containsKey(name)) ? expires.get(name) : defaultExpireTime;
|
long expiration = computeExpiration(name);
|
||||||
c = new RedisCache(name, (usePrefix ? cachePrefix.prefix(name) : null), template, expire);
|
c = new RedisCache(name, (usePrefix ? cachePrefix.prefix(name) : null), template, expiration);
|
||||||
caches.put(name, c);
|
caches.put(name, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private long computeExpiration(String name) {
|
||||||
|
Long expiration = null;
|
||||||
|
if (expires != null) {
|
||||||
|
expiration = expires.get(name);
|
||||||
|
}
|
||||||
|
return (expiration != null ? expiration.longValue() : defaultExpiration);
|
||||||
|
}
|
||||||
|
|
||||||
public Collection<String> getCacheNames() {
|
public Collection<String> getCacheNames() {
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUsePrefix(boolean usePrefix) {
|
public void setUsePrefix(boolean usePrefix) {
|
||||||
this.usePrefix = usePrefix;
|
this.usePrefix = usePrefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the cachePrefix.
|
* Sets the cachePrefix.
|
||||||
*
|
*
|
||||||
* @param cachePrefix the cachePrefix to set
|
* @param cachePrefix the cachePrefix to set
|
||||||
@@ -80,21 +87,21 @@ public class RedisCacheManager implements CacheManager {
|
|||||||
this.cachePrefix = cachePrefix;
|
this.cachePrefix = cachePrefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set default expire time.
|
* Sets the default expire time (in seconds).
|
||||||
*
|
*
|
||||||
* @param defaultExpireTime time in ms
|
* @param defaultExpireTime time in seconds.
|
||||||
*/
|
*/
|
||||||
public void setDefaultExpireTime(long defaultExpireTime) {
|
public void setDefaultExpiration(long defaultExpireTime) {
|
||||||
this.defaultExpireTime = defaultExpireTime;
|
this.defaultExpiration = defaultExpireTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set expire time for caches
|
* Sets the expire time (in seconds) for cache regions (by key).
|
||||||
*
|
*
|
||||||
* @param expires time in ms
|
* @param expires time in seconds
|
||||||
*/
|
*/
|
||||||
public void setExpires(Map<String, Long> expires) {
|
public void setExpires(Map<String, Long> expires) {
|
||||||
this.expires = expires;
|
this.expires = (expires != null ? new ConcurrentHashMap<String, Long>(expires) : null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ public class RedisCacheTest extends AbstractNativeCacheTest<RedisTemplate> {
|
|||||||
|
|
||||||
|
|
||||||
protected Cache createCache(RedisTemplate nativeCache) {
|
protected Cache createCache(RedisTemplate nativeCache) {
|
||||||
return new RedisCache(CACHE_NAME, CACHE_NAME.concat(":").getBytes(), nativeCache);
|
return new RedisCache(CACHE_NAME, CACHE_NAME.concat(":").getBytes(), nativeCache, TimeUnit.MINUTES.toSeconds(5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user