Skip to content

Commit

Permalink
feat: Using CRC32 hashes of SQL queries for Redis keys
Browse files Browse the repository at this point in the history
  • Loading branch information
Julien Ruaux committed May 27, 2022
1 parent c5ea67b commit 504d419
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,15 @@ public class SidecarCallableStatement extends SidecarPreparedStatement implement
private final SortedMap<String, String> parameters = new TreeMap<>();
private final CallableStatement statement;

public SidecarCallableStatement(SidecarConnection connection, CallableStatement statement, String sql)
throws SQLException {
public SidecarCallableStatement(SidecarConnection connection, CallableStatement statement, String sql) {
super(connection, statement, sql);
this.statement = statement;
}

@Override
protected String executedSQL(String sql) {
StringBuilder stringBuilder = new StringBuilder(sql);
for (String parameter : parameters.keySet()) {
stringBuilder.append(connection.getConfig().getKeySeparator()).append(parameter).append("=")
.append(parameters.get(parameter));
}
return stringBuilder.toString();
protected StringBuilder appendParameters(StringBuilder stringBuilder) {
parameters.forEach((k, v) -> appendParameter(stringBuilder, k + "=" + v));
return stringBuilder;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,23 @@ public class SidecarPreparedStatement extends SidecarStatement implements Prepar
private final SortedMap<Integer, String> parameters = new TreeMap<>();
private final PreparedStatement statement;

public SidecarPreparedStatement(SidecarConnection connection, PreparedStatement statement, String sql)
throws SQLException {
public SidecarPreparedStatement(SidecarConnection connection, PreparedStatement statement, String sql) {
super(connection, statement, sql);
this.statement = statement;
}

@Override
protected String executedSQL(String sql) {
StringBuilder stringBuilder = new StringBuilder(sql);
for (String parameter : parameters.values()) {
stringBuilder.append(connection.getConfig().getKeySeparator()).append(parameter);
}
return stringBuilder.toString();
protected String key() {
return appendParameters(new StringBuilder(super.key())).toString();
}

protected StringBuilder appendParameters(StringBuilder stringBuilder) {
parameters.forEach((k, v) -> appendParameter(stringBuilder, v));
return stringBuilder;
}

protected final StringBuilder appendParameter(StringBuilder stringBuilder, String parameter) {
return stringBuilder.append(connection.getConfig().getKeySeparator()).append(parameter);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.redis.sidecar.jdbc;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.zip.CRC32;

import javax.sql.rowset.CachedRowSet;

Expand All @@ -28,25 +27,19 @@ public class SidecarStatement implements Statement {
private static final String KEY_PREFIX = "cache";
protected final SidecarConnection connection;
private final Statement statement;
private final MessageDigest digest;
private final Timer requestTimer = Metrics.timer("requests");
private final Timer queryTimer = Metrics.timer("queries");

protected String sql;
private long ttl;
protected ResultSet resultSet;

public SidecarStatement(SidecarConnection connection, Statement statement) throws SQLException {
public SidecarStatement(SidecarConnection connection, Statement statement) {
this.connection = connection;
this.statement = statement;
try {
this.digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new SQLException("Could not initialize digest", e);
}
}

protected SidecarStatement(SidecarConnection connection, Statement statement, String sql) throws SQLException {
protected SidecarStatement(SidecarConnection connection, Statement statement, String sql) {
this(connection, statement);
setSQL(sql);
}
Expand Down Expand Up @@ -98,20 +91,17 @@ protected ResultSet get() throws SQLException {
if (ttl == Config.TTL_NO_CACHE) {
return null;
}
return connection.getCache().get(key(sql));
return connection.getCache().get(key());
}

protected final String key(String sql) {
byte[] hash = digest.digest(executedSQL(sql).getBytes(StandardCharsets.UTF_8));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
sb.append(Integer.toString((hash[i] & 0xff) + 0x100, 16).substring(1));
}
return connection.getConfig().key(KEY_PREFIX, sb.toString());
protected String key() {
return connection.getConfig().key(KEY_PREFIX, crc(sql));
}

protected String executedSQL(String sql) {
return sql;
protected final String crc(String string) {
CRC32 crc = new CRC32();
crc.update(string.getBytes(StandardCharsets.UTF_8));
return String.valueOf(crc.getValue());
}

protected ResultSet cache(ResultSet resultSet) throws SQLException {
Expand All @@ -120,7 +110,7 @@ protected ResultSet cache(ResultSet resultSet) throws SQLException {
}
CachedRowSet rowSet = connection.createCachedRowSet();
rowSet.populate(resultSet);
connection.getCache().put(key(sql), ttl, rowSet);
connection.getCache().put(key(), ttl, rowSet);
rowSet.beforeFirst();
return rowSet;
}
Expand Down

0 comments on commit 504d419

Please sign in to comment.