提交 640e40e4 编写于 作者: N Nikita Koksharov

Fixed - RMapCache element expiration doesn't work with map size = 1 #1808

上级 3d3d24b2
...@@ -360,7 +360,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -360,7 +360,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize >= maxSize then " + " if cacheSize >= maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[5] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -390,7 +390,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -390,7 +390,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "return val; " + "return val; "
+ "end; ", + "end; ",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value));
if (hasNoWriter()) { if (hasNoWriter()) {
return future; return future;
...@@ -448,7 +448,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -448,7 +448,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "return 0; " + "return 0; "
+ "end", + "end",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getRemovedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getRemovedChannelNameByKey(key),
getLastAccessTimeSetNameByKey(key), getOptionsName(key)), getLastAccessTimeSetNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value));
} }
...@@ -482,7 +482,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -482,7 +482,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" redis.call('zadd', KEYS[4], tonumber(ARGV[1]), ARGV[2]); " + " redis.call('zadd', KEYS[4], tonumber(ARGV[1]), ARGV[2]); " +
"end; " "end; "
+ "return val; ", + "return val; ",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getLastAccessTimeSetNameByKey(key), getOptionsName(key)), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getLastAccessTimeSetNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), encodeMapKey(key)); System.currentTimeMillis(), encodeMapKey(key));
} }
...@@ -526,7 +526,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -526,7 +526,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then" + " if cacheSize > maxSize then" +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1);" + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1);" +
" for index, lruItem in ipairs(lruItems) do" + " for index, lruItem in ipairs(lruItems) do" +
" if lruItem then" + " if lruItem and lruItem ~= ARGV[2] then" +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem);" + " local lruItemValue = redis.call('hget', KEYS[1], lruItem);" +
" redis.call('hdel', KEYS[1], lruItem);" + " redis.call('hdel', KEYS[1], lruItem);" +
" redis.call('zrem', KEYS[2], lruItem);" + " redis.call('zrem', KEYS[2], lruItem);" +
...@@ -555,7 +555,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -555,7 +555,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
"redis.call('publish', KEYS[5], msg);" + "redis.call('publish', KEYS[5], msg);" +
"return val;", "return val;",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value));
} }
...@@ -597,7 +597,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -597,7 +597,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then " + " if cacheSize > maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[2] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -617,7 +617,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -617,7 +617,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "redis.call('publish', KEYS[4], msg); " + "redis.call('publish', KEYS[4], msg); "
+ "return nil;", + "return nil;",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value));
} }
...@@ -700,7 +700,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -700,7 +700,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then " + " if cacheSize > maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[2] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -718,7 +718,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -718,7 +718,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "return tostring(newValue); ", + "return tostring(newValue); ",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), keyState, new BigDecimal(value.toString()).toPlainString()); System.currentTimeMillis(), keyState, new BigDecimal(value.toString()).toPlainString());
} }
...@@ -834,7 +834,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -834,7 +834,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize >= maxSize then " + " if cacheSize >= maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[5] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -862,7 +862,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -862,7 +862,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "return 0;" + "return 0;"
+ "end;", + "end;",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value));
return future; return future;
} }
...@@ -972,7 +972,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -972,7 +972,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize >= maxSize then " + " if cacheSize >= maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[5] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -1004,7 +1004,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1004,7 +1004,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "return val", + "return val",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value));
return future; return future;
} }
...@@ -1085,8 +1085,12 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1085,8 +1085,12 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
String getOptionsName() { String getOptionsName() {
return suffixName(getName(), "redisson_options"); return suffixName(getName(), "redisson_options");
} }
String getOptionsName(String name) {
return suffixName(name, "redisson_options");
}
String getOptionsName(Object key) { String getOptionsNameByKey(Object key) {
return suffixName(getName(key), "redisson_options"); return suffixName(getName(key), "redisson_options");
} }
...@@ -1336,7 +1340,6 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1336,7 +1340,6 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
return (RFuture<MapScanResult<Object, Object>>)(Object)f; return (RFuture<MapScanResult<Object, Object>>)(Object)f;
} }
@Override @Override
protected RFuture<Boolean> fastPutOperationAsync(K key, V value) { protected RFuture<Boolean> fastPutOperationAsync(K key, V value) {
return commandExecutor.evalWriteAsync(getName(key), codec, RedisCommands.EVAL_BOOLEAN, return commandExecutor.evalWriteAsync(getName(key), codec, RedisCommands.EVAL_BOOLEAN,
...@@ -1375,7 +1378,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1375,7 +1378,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then " + " if cacheSize > maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[2] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -1402,7 +1405,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1402,7 +1405,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "return 0;" + "return 0;"
+ "end;", + "end;",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getUpdatedChannelNameByKey(key), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value));
} }
...@@ -1427,7 +1430,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1427,7 +1430,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then " + " if cacheSize > maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[2] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -1477,7 +1480,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1477,7 +1480,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
+ "redis.call('publish', KEYS[4], msg); " + "redis.call('publish', KEYS[4], msg); "
+ "return 1; ", + "return 1; ",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), encodeMapKey(key), encodeMapValue(value));
} }
...@@ -1573,7 +1576,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1573,7 +1576,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize >= maxSize then " + " if cacheSize >= maxSize then " +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize); " +
" for index, lruItem in ipairs(lruItems) do " + " for index, lruItem in ipairs(lruItems) do " +
" if lruItem then " + " if lruItem and lruItem ~= ARGV[5] then " +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem); " + " local lruItemValue = redis.call('hget', KEYS[1], lruItem); " +
" redis.call('hdel', KEYS[1], lruItem); " + " redis.call('hdel', KEYS[1], lruItem); " +
" redis.call('zrem', KEYS[2], lruItem); " + " redis.call('zrem', KEYS[2], lruItem); " +
...@@ -1598,7 +1601,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1598,7 +1601,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" return 0; " + " return 0; " +
"end; ", "end; ",
Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key), Arrays.<Object>asList(getName(key), getTimeoutSetNameByKey(key), getIdleSetNameByKey(key), getCreatedChannelNameByKey(key),
getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsName(key)), getLastAccessTimeSetNameByKey(key), getRemovedChannelNameByKey(key), getOptionsNameByKey(key)),
System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value)); System.currentTimeMillis(), ttlTimeout, maxIdleTimeout, maxIdleDelta, encodeMapKey(key), encodeMapValue(value));
if (hasNoWriter()) { if (hasNoWriter()) {
return future; return future;
...@@ -1766,7 +1769,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1766,7 +1769,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then" + " if cacheSize > maxSize then" +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1);" + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1);" +
" for index, lruItem in ipairs(lruItems) do" + " for index, lruItem in ipairs(lruItems) do" +
" if lruItem then" + " if lruItem and lruItem ~= key then" +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem);" + " local lruItemValue = redis.call('hget', KEYS[1], lruItem);" +
" redis.call('hdel', KEYS[1], lruItem);" + " redis.call('hdel', KEYS[1], lruItem);" +
" redis.call('zrem', KEYS[2], lruItem);" + " redis.call('zrem', KEYS[2], lruItem);" +
...@@ -1865,7 +1868,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac ...@@ -1865,7 +1868,7 @@ public class RedissonMapCache<K, V> extends RedissonMap<K, V> implements RMapCac
" if cacheSize > maxSize then" + " if cacheSize > maxSize then" +
" local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1);" + " local lruItems = redis.call('zrange', lastAccessTimeSetName, 0, cacheSize - maxSize - 1);" +
" for index, lruItem in ipairs(lruItems) do" + " for index, lruItem in ipairs(lruItems) do" +
" if lruItem then" + " if lruItem and lruItem ~= key then" +
" local lruItemValue = redis.call('hget', KEYS[1], lruItem);" + " local lruItemValue = redis.call('hget', KEYS[1], lruItem);" +
" redis.call('hdel', KEYS[1], lruItem);" + " redis.call('hdel', KEYS[1], lruItem);" +
" redis.call('zrem', KEYS[2], lruItem);" + " redis.call('zrem', KEYS[2], lruItem);" +
......
...@@ -94,6 +94,19 @@ public class RedissonMapCacheTest extends BaseMapTest { ...@@ -94,6 +94,19 @@ public class RedissonMapCacheTest extends BaseMapTest {
map.destroy(); map.destroy();
} }
@Test
public void testFastPutTTL() throws InterruptedException {
RMapCache<SimpleKey, SimpleValue> map = redisson.getMapCache("getAll");
map.trySetMaxSize(1);
map.fastPut(new SimpleKey("1"), new SimpleValue("3"), 5, TimeUnit.SECONDS, 0, TimeUnit.SECONDS);
Thread.sleep(5000);
assertThat(map.get(new SimpleKey("1"))).isNull();
map.fastPut(new SimpleKey("1"), new SimpleValue("4"), 5, TimeUnit.SECONDS, 0, TimeUnit.SECONDS);
Thread.sleep(10000);
assertThat(map.get(new SimpleKey("1"))).isNull();
}
@Test @Test
public void testWriterPutIfAbsentTTL() { public void testWriterPutIfAbsentTTL() {
Map<String, String> store = new HashMap<>(); Map<String, String> store = new HashMap<>();
...@@ -179,6 +192,7 @@ public class RedissonMapCacheTest extends BaseMapTest { ...@@ -179,6 +192,7 @@ public class RedissonMapCacheTest extends BaseMapTest {
assertThat(map.put("03", "00")).isNull(); assertThat(map.put("03", "00")).isNull();
assertThat(map.fastPutIfAbsent("04", "00", 10, TimeUnit.SECONDS)).isTrue(); assertThat(map.fastPutIfAbsent("04", "00", 10, TimeUnit.SECONDS)).isTrue();
assertThat(map.fastPut("1", "11", 10, TimeUnit.SECONDS)).isTrue(); assertThat(map.fastPut("1", "11", 10, TimeUnit.SECONDS)).isTrue();
assertThat(map.size()).isEqualTo(2);
assertThat(map.fastPut("2", "22", 10, TimeUnit.SECONDS)).isTrue(); assertThat(map.fastPut("2", "22", 10, TimeUnit.SECONDS)).isTrue();
assertThat(map.fastPut("3", "33", 10, TimeUnit.SECONDS)).isTrue(); assertThat(map.fastPut("3", "33", 10, TimeUnit.SECONDS)).isTrue();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册