From 084d1416cf9a07c78f4548add1537494d79fbe97 Mon Sep 17 00:00:00 2001 From: Thomas Heigl Date: Sat, 26 Sep 2020 16:43:59 +0200 Subject: [PATCH] Delay allocating Strings for message channel and body --- .../redis/RedisIndexedSessionRepository.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java index c30790e3b..240b93468 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java @@ -18,6 +18,7 @@ import java.time.Duration; import java.time.Instant; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -36,6 +37,7 @@ import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.util.ByteUtils; import org.springframework.session.DelegatingIndexResolver; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.FlushMode; @@ -272,10 +274,20 @@ public class RedisIndexedSessionRepository private String sessionCreatedChannelPrefix; + private byte[] sessionCreatedChannelPrefixBytes; + private String sessionDeletedChannel; + private byte[] sessionDeletedChannelBytes; + private String sessionExpiredChannel; + private byte[] sessionExpiredChannelBytes; + + private String expiredKeyPrefix; + + private byte[] expiredKeyPrefixBytes; + private final RedisOperations sessionRedisOperations; private final RedisSessionExpirationPolicy expirationPolicy; @@ -381,8 +393,13 @@ public void setDatabase(int database) { private void configureSessionChannels() { this.sessionCreatedChannelPrefix = this.namespace + "event:" + this.database + ":created:"; + this.sessionCreatedChannelPrefixBytes = this.sessionCreatedChannelPrefix.getBytes(); this.sessionDeletedChannel = "__keyevent@" + this.database + "__:del"; + this.sessionDeletedChannelBytes = this.sessionDeletedChannel.getBytes(); this.sessionExpiredChannel = "__keyevent@" + this.database + "__:expired"; + this.sessionExpiredChannelBytes = this.sessionExpiredChannel.getBytes(); + this.expiredKeyPrefix = this.namespace + "sessions:expires:"; + this.expiredKeyPrefixBytes = this.expiredKeyPrefix.getBytes(); } /** @@ -503,23 +520,21 @@ public void onMessage(Message message, byte[] pattern) { byte[] messageChannel = message.getChannel(); byte[] messageBody = message.getBody(); - String channel = new String(messageChannel); - - if (channel.startsWith(this.sessionCreatedChannelPrefix)) { + if (ByteUtils.startsWith(messageChannel, this.sessionCreatedChannelPrefixBytes)) { // TODO: is this thread safe? @SuppressWarnings("unchecked") - Map loaded = (Map) this.defaultSerializer.deserialize(message.getBody()); - handleCreated(loaded, channel); + Map loaded = (Map) this.defaultSerializer.deserialize(messageBody); + handleCreated(loaded, new String(messageChannel)); return; } - String body = new String(messageBody); - if (!body.startsWith(getExpiredKeyPrefix())) { + if (!ByteUtils.startsWith(messageBody, this.expiredKeyPrefixBytes)) { return; } - boolean isDeleted = channel.equals(this.sessionDeletedChannel); - if (isDeleted || channel.equals(this.sessionExpiredChannel)) { + boolean isDeleted = Arrays.equals(messageChannel, this.sessionDeletedChannelBytes); + if (isDeleted || Arrays.equals(messageChannel, this.sessionExpiredChannelBytes)) { + String body = new String(messageBody); int beginIndex = body.lastIndexOf(":") + 1; int endIndex = body.length(); String sessionId = body.substring(beginIndex, endIndex); @@ -611,7 +626,7 @@ private String getSessionCreatedChannel(String sessionId) { } private String getExpiredKeyPrefix() { - return this.namespace + "sessions:expires:"; + return expiredKeyPrefix; } /**