Skip to content

Commit a3fc217

Browse files
committed
feat(resp):优化BulkStrings解析逻辑与SET命令性能
- 在BulkStrings解析完成时增加对空输出流的判断,避免不必要的toString调用 - 将SetCommand中的固定HEADER替换为预构建的FAST_HEADER数组,提升写入效率- 根据键长度动态选择FAST_HEADER模板,减少运行时字节拼接操作 - 当键长度超出预设范围时,回退到通用写入方式并保留原有兼容性处理
1 parent 99a9791 commit a3fc217

2 files changed

Lines changed: 25 additions & 4 deletions

File tree

src/main/java/tech/smartboot/redisun/cmd/SetCommand.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,19 @@ public class SetCommand extends Command {
4545
private static final BulkStrings CONSTANTS_EX = BulkStrings.of("EX");
4646
private static final BulkStrings CONSTANTS_PX = BulkStrings.of("PX");
4747
private static final BulkStrings CONSTANTS_PXAT = BulkStrings.of("PXAT");
48-
private static final byte[] HEADER = new byte[]{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK};
48+
// private static final byte[] HEADER = new byte[]{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK};
49+
private static final byte[][] FAST_HEADER = new byte[][]{
50+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '0', '\r', '\n'},
51+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '1', '\r', '\n'},
52+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '2', '\r', '\n'},
53+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n'},
54+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '4', '\r', '\n'},
55+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '5', '\r', '\n'},
56+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '6', '\r', '\n'},
57+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '7', '\r', '\n'},
58+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '8', '\r', '\n'},
59+
{RESP.RESP_DATA_TYPE_ARRAY, '3', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '3', '\r', '\n', 'S', 'E', 'T', '\r', '\n', RESP.RESP_DATA_TYPE_BULK, '9', '\r', '\n'},
60+
};
4961
private static final byte[] PART = new byte[]{'\r', '\n', RESP.RESP_DATA_TYPE_BULK};
5062
// 要设置的键
5163
private final String key;
@@ -102,8 +114,15 @@ public void writeTo(WriteBuffer writeBuffer) throws IOException {
102114
}
103115
byte[] keyBytes = key.getBytes();
104116
byte[] valBytes = value.getBytes();
105-
writeBuffer.write(HEADER);
106-
RESP.writeInt(writeBuffer, keyBytes.length);
117+
if (keyBytes.length < FAST_HEADER.length) {
118+
writeBuffer.write(FAST_HEADER[keyBytes.length]);
119+
} else {
120+
byte[] header = FAST_HEADER[0];
121+
writeBuffer.write(header, 0, header.length - 3);
122+
RESP.writeInt(writeBuffer, keyBytes.length);
123+
}
124+
// writeBuffer.write(HEADER);
125+
// RESP.writeInt(writeBuffer, keyBytes.length);
107126
writeBuffer.write(keyBytes);
108127
writeBuffer.write(PART);
109128
RESP.writeInt(writeBuffer, valBytes.length);

src/main/java/tech/smartboot/redisun/resp/BulkStrings.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ public boolean decode(ByteBuffer readBuffer) {
121121
if (readBuffer.remaining() >= 2) {
122122
if (readBuffer.get() == CR && readBuffer.get() == LF) {
123123
// 解析完成,设置字符串值
124-
value = out.toString();
124+
if (out != EMPTY_OUTPUT_STREAM) {
125+
value = out.toString();
126+
}
125127
return true;
126128
}
127129
throw new RedisunException("数据格式错误");

0 commit comments

Comments
 (0)