diff --git a/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java b/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java index 667fa3e28..880bc6cc9 100644 --- a/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java +++ b/redisson/src/main/java/org/redisson/api/LocalCachedMapOptions.java @@ -207,9 +207,13 @@ public class LocalCachedMapOptions extends MapOptions { } /** - * Defines local cache size. If size is 0 then local cache is unbounded. + * Defines local cache size. + *

+ * If size is 0 then local cache is unbounded. + *

+ * If size is -1 then local cache is always empty and doesn't store data. * - * @param cacheSize - size of cache + * @param cacheSize size of cache * @return LocalCachedMapOptions instance */ public LocalCachedMapOptions cacheSize(int cacheSize) { diff --git a/redisson/src/main/java/org/redisson/cache/LocalCacheListener.java b/redisson/src/main/java/org/redisson/cache/LocalCacheListener.java index b12137b7f..7b1069ba8 100644 --- a/redisson/src/main/java/org/redisson/cache/LocalCacheListener.java +++ b/redisson/src/main/java/org/redisson/cache/LocalCacheListener.java @@ -211,6 +211,9 @@ public abstract class LocalCacheListener { for (byte[] keyHash : invalidateMsg.getKeyHashes()) { CacheKey key = new CacheKey(keyHash); CacheValue value = cache.remove(key); + if (value == null) { + continue; + } notifyInvalidate(value); } } diff --git a/redisson/src/main/java/org/redisson/cache/LocalCacheView.java b/redisson/src/main/java/org/redisson/cache/LocalCacheView.java index c0843e2b8..2b87ccdb2 100644 --- a/redisson/src/main/java/org/redisson/cache/LocalCacheView.java +++ b/redisson/src/main/java/org/redisson/cache/LocalCacheView.java @@ -15,14 +15,8 @@ */ package org.redisson.cache; -import java.util.AbstractCollection; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; @@ -265,6 +259,10 @@ public class LocalCacheView { } public ConcurrentMap createCache(LocalCachedMapOptions options) { + if (options.getCacheSize() == -1) { + return new NoOpCacheMap(); + } + if (options.getCacheProvider() == LocalCachedMapOptions.CacheProvider.CAFFEINE) { Caffeine caffeineBuilder = Caffeine.newBuilder(); if (options.getTimeToLiveInMillis() > 0) { diff --git a/redisson/src/main/java/org/redisson/cache/NoOpCacheMap.java b/redisson/src/main/java/org/redisson/cache/NoOpCacheMap.java new file mode 100644 index 000000000..a36165126 --- /dev/null +++ b/redisson/src/main/java/org/redisson/cache/NoOpCacheMap.java @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2013-2022 Nikita Koksharov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.redisson.cache; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; + +/** + * + * @author Nikita Koksharov + * + * @param key type + * @param value type + */ +public class NoOpCacheMap implements ConcurrentMap { + + @Override + public int size() { + return 0; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public boolean containsKey(Object key) { + return false; + } + + @Override + public boolean containsValue(Object value) { + return false; + } + + @Override + public V get(Object key) { + return null; + } + + @Override + public V put(K key, V value) { + return null; + } + + @Override + public V remove(Object key) { + return null; + } + + @Override + public void putAll(Map m) { + + } + + @Override + public void clear() { + + } + + @Override + public Set keySet() { + return Collections.emptySet(); + } + + @Override + public Collection values() { + return Collections.emptyList(); + } + + @Override + public Set> entrySet() { + return Collections.emptySet(); + } + @Override + public V putIfAbsent(K key, V value) { + return null; + } + + @Override + public boolean remove(Object key, Object value) { + return false; + } + + @Override + public boolean replace(K key, V oldValue, V newValue) { + return false; + } + + @Override + public V replace(K key, V value) { + return null; + } +}