From a56da0517aaf3036c6f8eef6dde78e4dd5bd203c Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 14 Feb 2018 07:01:23 +0300 Subject: [PATCH] RLocalCachedMap.clearLocalCache method added #1297 --- .../org/redisson/RedissonLocalCachedMap.java | 24 ++++++++++++++ .../org/redisson/api/RLocalCachedMap.java | 15 ++++++++- .../redisson/RedissonLocalCachedMapTest.java | 31 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java b/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java index 5c5ad5a11..2d3e70b04 100644 --- a/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java +++ b/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java @@ -949,6 +949,30 @@ public class RedissonLocalCachedMap extends RedissonMap implements R cache.put(cacheKey, new CacheValue(entry.getKey(), entry.getValue())); } } + + @Override + public void clearLocalCache() { + get(clearLocalCacheAsync()); + } + + @Override + public RFuture clearLocalCacheAsync() { + final RPromise result = new RedissonPromise(); + RFuture future = invalidationTopic.publishAsync(new LocalCachedMapClear()); + future.addListener(new FutureListener() { + @Override + public void operationComplete(Future future) throws Exception { + if (!future.isSuccess()) { + result.tryFailure(future.cause()); + return; + } + + result.trySuccess(null); + } + }); + + return result; + } @Override public RFuture>> readAllEntrySetAsync() { diff --git a/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java b/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java index 43223cd1f..63d63abc2 100644 --- a/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java +++ b/redisson/src/main/java/org/redisson/api/RLocalCachedMap.java @@ -27,10 +27,23 @@ package org.redisson.api; * @param map value */ public interface RLocalCachedMap extends RMap, RDestroyable { + /** * Pre-warm the cached values. Not guaranteed to load ALL values, but statistically * will preload approximately all (all if no concurrent mutating activity) * Intended for use with no-eviction caches where entire maps are locally cached */ - public void preloadCache(); + void preloadCache(); + + /** + * Clears local cache across all instances + * + * @return void + */ + RFuture clearLocalCacheAsync(); + + /** + * Clears local cache across all instances + */ + void clearLocalCache(); } diff --git a/redisson/src/test/java/org/redisson/RedissonLocalCachedMapTest.java b/redisson/src/test/java/org/redisson/RedissonLocalCachedMapTest.java index 1b1f2ef6c..65ead14bc 100644 --- a/redisson/src/test/java/org/redisson/RedissonLocalCachedMapTest.java +++ b/redisson/src/test/java/org/redisson/RedissonLocalCachedMapTest.java @@ -290,6 +290,37 @@ public class RedissonLocalCachedMapTest extends BaseMapTest { assertThat(cache2.size()).isEqualTo(2); } + @Test + public void testLocalCacheClear() throws InterruptedException { + LocalCachedMapOptions options = LocalCachedMapOptions.defaults() + .evictionPolicy(EvictionPolicy.LFU) + .cacheSize(5) + .syncStrategy(SyncStrategy.INVALIDATE); + + RLocalCachedMap map1 = redisson.getLocalCachedMap("test", options); + Cache cache1 = Deencapsulation.getField(map1, "cache"); + + RLocalCachedMap map2 = redisson.getLocalCachedMap("test", options); + Cache cache2 = Deencapsulation.getField(map2, "cache"); + + map1.put("1", 1); + map1.put("2", 2); + + assertThat(map2.get("1")).isEqualTo(1); + assertThat(map2.get("2")).isEqualTo(2); + + assertThat(cache1.size()).isEqualTo(2); + assertThat(cache2.size()).isEqualTo(2); + + map1.clearLocalCache(); + + Thread.sleep(50); + + assertThat(cache1.size()).isZero(); + assertThat(cache2.size()).isZero(); + } + + @Test public void testNoInvalidationOnRemove() throws InterruptedException { LocalCachedMapOptions options = LocalCachedMapOptions.defaults()