From 221bca75936cec6eb84f4c7ecb4f958986bc3a5e Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 19 Sep 2017 17:18:15 +0300 Subject: [PATCH] Make MapCacheEvictionTask execution only once in period of time. #1064 --- .../eviction/MapCacheEvictionTask.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/redisson/src/main/java/org/redisson/eviction/MapCacheEvictionTask.java b/redisson/src/main/java/org/redisson/eviction/MapCacheEvictionTask.java index 081fabc7d..2568436a3 100644 --- a/redisson/src/main/java/org/redisson/eviction/MapCacheEvictionTask.java +++ b/redisson/src/main/java/org/redisson/eviction/MapCacheEvictionTask.java @@ -34,6 +34,7 @@ public class MapCacheEvictionTask extends EvictionTask { private final String maxIdleSetName; private final String expiredChannelName; private final String lastAccessTimeSetName; + private final String executeTaskOnceLatchName; public MapCacheEvictionTask(String name, String timeoutSetName, String maxIdleSetName, String expiredChannelName, String lastAccessTimeSetName, CommandAsyncExecutor executor) { @@ -43,12 +44,24 @@ public class MapCacheEvictionTask extends EvictionTask { this.maxIdleSetName = maxIdleSetName; this.expiredChannelName = expiredChannelName; this.lastAccessTimeSetName = lastAccessTimeSetName; + this.executeTaskOnceLatchName = prefixName("redisson__execute_task_once_latch", name); } + protected String prefixName(String prefix, String name) { + if (name.contains("{")) { + return prefix + ":" + name; + } + return prefix + ":{" + name + "}"; + } + @Override RFuture execute() { return executor.evalWriteAsync(name, LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, - "local expiredKeys1 = redis.call('zrangebyscore', KEYS[2], 0, ARGV[1], 'limit', 0, ARGV[2]); " + "if redis.call('setnx', KEYS[6], ARGV[4]) == 0 then " + + "return 0;" + + "end;" + + "redis.call('expire', KEYS[6], ARGV[3]); " + +"local expiredKeys1 = redis.call('zrangebyscore', KEYS[2], 0, ARGV[1], 'limit', 0, ARGV[2]); " + "for i, key in ipairs(expiredKeys1) do " + "local v = redis.call('hget', KEYS[1], key); " + "if v ~= false then " @@ -85,8 +98,8 @@ public class MapCacheEvictionTask extends EvictionTask { + "redis.call('hdel', KEYS[1], unpack(expiredKeys2)); " + "end; " + "return #expiredKeys1 + #expiredKeys2;", - Arrays.asList(name, timeoutSetName, maxIdleSetName, expiredChannelName, lastAccessTimeSetName), - System.currentTimeMillis(), keysLimit); + Arrays.asList(name, timeoutSetName, maxIdleSetName, expiredChannelName, lastAccessTimeSetName, executeTaskOnceLatchName), + System.currentTimeMillis(), keysLimit, delay, 1); } }