diff --git a/README.md b/README.md index edc10abb8..69b580b35 100644 --- a/README.md +++ b/README.md @@ -53,24 +53,25 @@ Features Used by ================================ +[![S&P Global](https://redisson.org/assets/logos/client20.png "S&P Global")](https://www.spglobal.com/)     [![SAP](https://redisson.org/assets/logos/client12.png "SAP")](http://www.sap.com/)     [![EA](https://redisson.org/assets/logos/client1.png "EA")](http://ea.com/)     [![BROOKHAVEN](https://redisson.org/assets/logos/client6.png "Brookhaven National Laboratory")](http://bnl.gov/)     [![New Relic Synthetics](https://redisson.org/assets/logos/client3.png "New Relic Synthetics")](http://newrelic.com/synthetics)     [![Singtel](https://redisson.org/assets/logos/client5.png "New Relic Synthetics")](http://singtel.com/)     -[![Netflix](https://redisson.org/assets/logos/client10.png "Netflix")](https://netflix.com/)     -[![Baidu](https://redisson.org/assets/logos/client2.png "Baidu")](http://baidu.com/) +[![Netflix](https://redisson.org/assets/logos/client10.png "Netflix")](https://netflix.com/) +[![Baidu](https://redisson.org/assets/logos/client2.png "Baidu")](http://baidu.com/)     [![Infor](https://redisson.org/assets/logos/client4.png "Infor")](http://www.infor.com/)     [![Crimson Hexagon](https://redisson.org/assets/logos/client7.png "Crimson Hexagon")](https://www.crimsonhexagon.com/)     -[![Datorama](https://redisson.org/assets/logos/client8.png "Datorama")](https://datorama.com/)     -[![OptionsHouse](https://redisson.org/assets/logos/client9.png "OptionsHouse")](https://www.optionshouse.com/)     -[![Invaluable](https://redisson.org/assets/logos/client13.png "Invaluable")](http://www.invaluable.com/) -[![Ticketmaster](https://redisson.org/assets/logos/client14.png "Ticketmaster")](http://www.ticketmaster.com/)    +[![Datorama](https://redisson.org/assets/logos/client8.png "Datorama")](https://datorama.com/)    +[![Invaluable](https://redisson.org/assets/logos/client13.png "Invaluable")](http://www.invaluable.com/)    +[![Ticketmaster](https://redisson.org/assets/logos/client14.png "Ticketmaster")](http://www.ticketmaster.com/) [![PANDORA](https://redisson.org/assets/logos/client15.png "PANDORA")](http://www.pandora.com/)    [![ContaAzul](https://redisson.org/assets/logos/client18.png "ContaAzul")](https://contaazul.com/)    -[![NAB](https://redisson.org/assets/logos/client11.png "NAB")](https://www.nab.com.au/) +[![NAB](https://redisson.org/assets/logos/client11.png "NAB")](https://www.nab.com.au/)    [![Alibaba](https://redisson.org/assets/logos/client19.png "Alibaba")](http://www.alibaba-inc.com)    -[![SULAKE](https://redisson.org/assets/logos/client17.png "SULAKE")](http://www.sulake.com/) +[![Flipkart](https://redisson.org/assets/logos/client21.png "Flipkart")](https://www.flipkart.com/)    +[![SULAKE](https://redisson.org/assets/logos/client17.png "SULAKE")](http://www.sulake.com/)    Success stories 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/LocalCachedMapOptions.java b/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java index 1ac7d5136..010341458 100644 --- a/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java +++ b/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java @@ -65,12 +65,12 @@ public class LocalCachedMapOptions extends MapOptions { NONE, /** - * Invalidate cache entry across all LocalCachedMap instances on map entry change. + * Invalidate cache entry across all LocalCachedMap instances on map entry change. Broadcasts map entry hash (16 bytes) to all instances. */ INVALIDATE, /** - * Update cache entry across all LocalCachedMap instances on map entry change. + * Update cache entry across all LocalCachedMap instances on map entry change. Broadcasts full map entry state (Key and Value objects) to all instances. */ UPDATE 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/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java b/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java index de10668a5..866927673 100644 --- a/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java +++ b/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java @@ -34,7 +34,7 @@ public class BaseMasterSlaveServersConfigeach slave node */ - private int slaveConnectionMinimumIdleSize = 10; + private int slaveConnectionMinimumIdleSize = 32; /** * Redis 'slave' node maximum connection pool size for each slave node @@ -44,7 +44,7 @@ public class BaseMasterSlaveServersConfigeach slave node */ - private int masterConnectionMinimumIdleSize = 10; + private int masterConnectionMinimumIdleSize = 32; /** * Redis 'master' node maximum connection pool size diff --git a/redisson/src/main/java/org/redisson/config/ReplicatedServersConfig.java b/redisson/src/main/java/org/redisson/config/ReplicatedServersConfig.java index dd6923f1d..3f250f770 100644 --- a/redisson/src/main/java/org/redisson/config/ReplicatedServersConfig.java +++ b/redisson/src/main/java/org/redisson/config/ReplicatedServersConfig.java @@ -77,7 +77,7 @@ public class ReplicatedServersConfig extends BaseMasterSlaveServersConfig { /** * Minimum idle Redis connection amount */ - private int connectionMinimumIdleSize = 10; + private int connectionMinimumIdleSize = 32; /** * Redis connection maximum pool size 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()