From 95200fc0762384bc6c6286de60181b0904ba5c35 Mon Sep 17 00:00:00 2001 From: "zhaolong@sunlands.com" <815438426@qq.com> Date: Thu, 21 May 2020 14:07:51 +0800 Subject: [PATCH 1/3] change clean method `keys` command to `scan` --- .../redis/cache/DefaultRedisCacheWriter.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java index 698f147788..6a4e867c40 100644 --- a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java +++ b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java @@ -17,19 +17,19 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; -import java.util.Collections; -import java.util.Optional; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Function; -import org.springframework.dao.PessimisticLockingFailureException; +import com.sun.istack.internal.Nullable; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.types.Expiration; -import org.springframework.lang.Nullable; -import org.springframework.util.Assert; /** * {@link RedisCacheWriter} implementation capable of reading/writing binary data from/to Redis in {@literal standalone} @@ -179,11 +179,14 @@ public void clean(String name, byte[] pattern) { wasLocked = true; } - byte[][] keys = Optional.ofNullable(connection.keys(pattern)).orElse(Collections.emptySet()) - .toArray(new byte[0][]); - - if (keys.length > 0) { - connection.del(keys); + List keys = new ArrayList(); + Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(new String(pattern)).build()); + while (cursor.hasNext()) { + byte[] bytes = cursor.next(); + keys.add(bytes); + } + if (!keys.isEmpty()) { + connection.del(keys.toArray(new byte[][]{})); } } finally { From 80604624bad39e0f4236dd9c63582ee830ed8891 Mon Sep 17 00:00:00 2001 From: "zhaolong@sunlands.com" <815438426@qq.com> Date: Wed, 17 Jun 2020 19:46:58 +0800 Subject: [PATCH 2/3] batch delete directly --- .../data/redis/cache/DefaultRedisCacheWriter.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java index 6a4e867c40..3a9f4bd64b 100644 --- a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java +++ b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java @@ -24,12 +24,14 @@ import java.util.function.Function; import com.sun.istack.internal.Nullable; +import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.types.Expiration; +import org.springframework.util.Assert; /** * {@link RedisCacheWriter} implementation capable of reading/writing binary data from/to Redis in {@literal standalone} @@ -45,6 +47,7 @@ * * @author Christoph Strobl * @author Mark Paluch + * @author zhaolong * @since 2.0 */ class DefaultRedisCacheWriter implements RedisCacheWriter { @@ -179,14 +182,9 @@ public void clean(String name, byte[] pattern) { wasLocked = true; } - List keys = new ArrayList(); Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(new String(pattern)).build()); while (cursor.hasNext()) { - byte[] bytes = cursor.next(); - keys.add(bytes); - } - if (!keys.isEmpty()) { - connection.del(keys.toArray(new byte[][]{})); + connection.del(cursor.next()); } } finally { From c2aafdaec6692de8034916157259e3c058a736b5 Mon Sep 17 00:00:00 2001 From: "zhaolong@sunlands.com" <815438426@qq.com> Date: Thu, 21 May 2020 14:07:51 +0800 Subject: [PATCH 3/3] change clean method `keys` command to `scan`,and batch delete directly --- .../redis/cache/DefaultRedisCacheWriter.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java index 698f147788..3a9f4bd64b 100644 --- a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java +++ b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java @@ -17,18 +17,20 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; -import java.util.Collections; -import java.util.Optional; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Function; +import com.sun.istack.internal.Nullable; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.types.Expiration; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -45,6 +47,7 @@ * * @author Christoph Strobl * @author Mark Paluch + * @author zhaolong * @since 2.0 */ class DefaultRedisCacheWriter implements RedisCacheWriter { @@ -179,11 +182,9 @@ public void clean(String name, byte[] pattern) { wasLocked = true; } - byte[][] keys = Optional.ofNullable(connection.keys(pattern)).orElse(Collections.emptySet()) - .toArray(new byte[0][]); - - if (keys.length > 0) { - connection.del(keys); + Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(new String(pattern)).build()); + while (cursor.hasNext()) { + connection.del(cursor.next()); } } finally {