Skip to content

Commit 5f51688

Browse files
theigleleftherias
authored andcommitted
Delay allocating Strings for message channel and body
1 parent 55502f3 commit 5f51688

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.time.Duration;
2020
import java.time.Instant;
21+
import java.util.Arrays;
2122
import java.util.Collections;
2223
import java.util.HashMap;
2324
import java.util.Map;
@@ -36,6 +37,7 @@
3637
import org.springframework.data.redis.core.RedisOperations;
3738
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
3839
import org.springframework.data.redis.serializer.RedisSerializer;
40+
import org.springframework.data.redis.util.ByteUtils;
3941
import org.springframework.session.DelegatingIndexResolver;
4042
import org.springframework.session.FindByIndexNameSessionRepository;
4143
import org.springframework.session.FlushMode;
@@ -272,10 +274,20 @@ public class RedisIndexedSessionRepository
272274

273275
private String sessionCreatedChannelPrefix;
274276

277+
private byte[] sessionCreatedChannelPrefixBytes;
278+
275279
private String sessionDeletedChannel;
276280

281+
private byte[] sessionDeletedChannelBytes;
282+
277283
private String sessionExpiredChannel;
278284

285+
private byte[] sessionExpiredChannelBytes;
286+
287+
private String expiredKeyPrefix;
288+
289+
private byte[] expiredKeyPrefixBytes;
290+
279291
private final RedisOperations<Object, Object> sessionRedisOperations;
280292

281293
private final RedisSessionExpirationPolicy expirationPolicy;
@@ -381,8 +393,13 @@ public void setDatabase(int database) {
381393

382394
private void configureSessionChannels() {
383395
this.sessionCreatedChannelPrefix = this.namespace + "event:" + this.database + ":created:";
396+
this.sessionCreatedChannelPrefixBytes = this.sessionCreatedChannelPrefix.getBytes();
384397
this.sessionDeletedChannel = "__keyevent@" + this.database + "__:del";
398+
this.sessionDeletedChannelBytes = this.sessionDeletedChannel.getBytes();
385399
this.sessionExpiredChannel = "__keyevent@" + this.database + "__:expired";
400+
this.sessionExpiredChannelBytes = this.sessionExpiredChannel.getBytes();
401+
this.expiredKeyPrefix = this.namespace + "sessions:expires:";
402+
this.expiredKeyPrefixBytes = this.expiredKeyPrefix.getBytes();
386403
}
387404

388405
/**
@@ -501,25 +518,24 @@ public RedisSession createSession() {
501518
@Override
502519
public void onMessage(Message message, byte[] pattern) {
503520
byte[] messageChannel = message.getChannel();
504-
byte[] messageBody = message.getBody();
505-
506-
String channel = new String(messageChannel);
507521

508-
if (channel.startsWith(this.sessionCreatedChannelPrefix)) {
522+
if (ByteUtils.startsWith(messageChannel, this.sessionCreatedChannelPrefixBytes)) {
509523
// TODO: is this thread safe?
510524
@SuppressWarnings("unchecked")
511525
Map<Object, Object> loaded = (Map<Object, Object>) this.defaultSerializer.deserialize(message.getBody());
512-
handleCreated(loaded, channel);
526+
handleCreated(loaded, new String(messageChannel));
513527
return;
514528
}
515529

516-
String body = new String(messageBody);
517-
if (!body.startsWith(getExpiredKeyPrefix())) {
530+
byte[] messageBody = message.getBody();
531+
532+
if (!ByteUtils.startsWith(messageBody, this.expiredKeyPrefixBytes)) {
518533
return;
519534
}
520535

521-
boolean isDeleted = channel.equals(this.sessionDeletedChannel);
522-
if (isDeleted || channel.equals(this.sessionExpiredChannel)) {
536+
boolean isDeleted = Arrays.equals(messageChannel, this.sessionDeletedChannelBytes);
537+
if (isDeleted || Arrays.equals(messageChannel, this.sessionExpiredChannelBytes)) {
538+
String body = new String(messageBody);
523539
int beginIndex = body.lastIndexOf(":") + 1;
524540
int endIndex = body.length();
525541
String sessionId = body.substring(beginIndex, endIndex);
@@ -611,7 +627,7 @@ private String getSessionCreatedChannel(String sessionId) {
611627
}
612628

613629
private String getExpiredKeyPrefix() {
614-
return this.namespace + "sessions:expires:";
630+
return this.expiredKeyPrefix;
615631
}
616632

617633
/**

0 commit comments

Comments
 (0)