diff --git a/README.md b/README.md
index 149d796..b373c21 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,81 @@
# redis2asp
High-performance Aerospike proxy for the Redis protocol
+### Performance Test Report
+aerospike 3.x 2c4g redispike-proxy 2c4g:
+
+`./redis-benchmark -h xxxx -p 6379 -n 2000000 -c 200 -t get`
+```
+WARNING: Could not fetch server CONFIG
+====== GET ======
+2000000 requests completed in 44.94 seconds
+200 parallel clients
+3 bytes payload
+keep alive: 1
+multi-thread: no
+
+Latency by percentile distribution:
+0.000% <= 1.975 milliseconds (cumulative count 1)
+50.000% <= 3.879 milliseconds (cumulative count 1001535)
+75.000% <= 4.919 milliseconds (cumulative count 1501029)
+87.500% <= 5.999 milliseconds (cumulative count 1750484)
+93.750% <= 7.247 milliseconds (cumulative count 1875200)
+96.875% <= 8.599 milliseconds (cumulative count 1937780)
+98.438% <= 10.071 milliseconds (cumulative count 1968821)
+99.219% <= 12.023 milliseconds (cumulative count 1984401)
+99.609% <= 13.967 milliseconds (cumulative count 1992202)
+99.805% <= 16.071 milliseconds (cumulative count 1996100)
+99.902% <= 19.199 milliseconds (cumulative count 1998053)
+99.951% <= 22.271 milliseconds (cumulative count 1999027)
+99.976% <= 24.847 milliseconds (cumulative count 1999515)
+99.988% <= 26.831 milliseconds (cumulative count 1999756)
+99.994% <= 30.527 milliseconds (cumulative count 1999879)
+99.997% <= 31.231 milliseconds (cumulative count 1999942)
+99.998% <= 31.535 milliseconds (cumulative count 1999971)
+99.999% <= 31.663 milliseconds (cumulative count 1999988)
+100.000% <= 31.743 milliseconds (cumulative count 1999993)
+100.000% <= 31.807 milliseconds (cumulative count 1999997)
+100.000% <= 31.871 milliseconds (cumulative count 1999999)
+100.000% <= 31.919 milliseconds (cumulative count 2000000)
+100.000% <= 31.919 milliseconds (cumulative count 2000000)
+
+Cumulative distribution of latencies:
+0.000% <= 0.103 milliseconds (cumulative count 0)
+0.001% <= 2.007 milliseconds (cumulative count 10)
+0.051% <= 2.103 milliseconds (cumulative count 1012)
+22.646% <= 3.103 milliseconds (cumulative count 452915)
+56.697% <= 4.103 milliseconds (cumulative count 1133935)
+78.001% <= 5.103 milliseconds (cumulative count 1560018)
+88.276% <= 6.103 milliseconds (cumulative count 1765529)
+93.275% <= 7.103 milliseconds (cumulative count 1865499)
+95.983% <= 8.103 milliseconds (cumulative count 1919661)
+97.593% <= 9.103 milliseconds (cumulative count 1951867)
+98.460% <= 10.103 milliseconds (cumulative count 1969205)
+98.949% <= 11.103 milliseconds (cumulative count 1978987)
+99.238% <= 12.103 milliseconds (cumulative count 1984763)
+99.451% <= 13.103 milliseconds (cumulative count 1989027)
+99.629% <= 14.103 milliseconds (cumulative count 1992578)
+99.732% <= 15.103 milliseconds (cumulative count 1994648)
+99.808% <= 16.103 milliseconds (cumulative count 1996153)
+99.853% <= 17.103 milliseconds (cumulative count 1997051)
+99.878% <= 18.111 milliseconds (cumulative count 1997563)
+99.899% <= 19.103 milliseconds (cumulative count 1997985)
+99.918% <= 20.111 milliseconds (cumulative count 1998363)
+99.936% <= 21.103 milliseconds (cumulative count 1998710)
+99.949% <= 22.111 milliseconds (cumulative count 1998981)
+99.962% <= 23.103 milliseconds (cumulative count 1999237)
+99.969% <= 24.111 milliseconds (cumulative count 1999375)
+99.979% <= 25.103 milliseconds (cumulative count 1999573)
+99.984% <= 26.111 milliseconds (cumulative count 1999674)
+99.990% <= 27.103 milliseconds (cumulative count 1999795)
+99.991% <= 28.111 milliseconds (cumulative count 1999828)
+99.993% <= 29.103 milliseconds (cumulative count 1999854)
+99.993% <= 30.111 milliseconds (cumulative count 1999862)
+99.997% <= 31.103 milliseconds (cumulative count 1999932)
+100.000% <= 32.111 milliseconds (cumulative count 2000000)
+
+Summary:
+throughput summary: 44501.80 requests per second
+latency summary (msec):
+avg min p50 p95 p99 max
+4.337 1.968 3.879 7.679 11.255 31.919
+```
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 21976a7..cbc3a3a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,11 +4,12 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.example
- redis2asp
+ icu.funkye
+ redispike-proxy
1.0-SNAPSHOT
+ icu.funkye.redispike.ProxyMain
1.8
1.8
UTF-8
@@ -19,6 +20,7 @@
1.2.9
1.3.6
3.8
+ 7.2.1
@@ -39,7 +41,7 @@
com.aerospike
aerospike-client
- 7.2.1
+ ${asp-client.version}
commons-cli
@@ -69,12 +71,38 @@
+ ${artifactId}
org.apache.maven.plugins
maven-surefire-plugin
2.22.0
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.3.0
+
+
+
+ ${start-class}
+
+
+
+ jar-with-dependencies
+
+ false
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
org.apache.maven.plugins
maven-compiler-plugin
diff --git a/src/main/java/org/redis2asp/ProxyMain.java b/src/main/java/icu/funkye/redispike/ProxyMain.java
similarity index 97%
rename from src/main/java/org/redis2asp/ProxyMain.java
rename to src/main/java/icu/funkye/redispike/ProxyMain.java
index 15f62ae..554b10b 100644
--- a/src/main/java/org/redis2asp/ProxyMain.java
+++ b/src/main/java/icu/funkye/redispike/ProxyMain.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp;
+package icu.funkye.redispike;
import org.apache.commons.cli.ParseException;
diff --git a/src/main/java/org/redis2asp/Server.java b/src/main/java/icu/funkye/redispike/Server.java
similarity index 80%
rename from src/main/java/org/redis2asp/Server.java
rename to src/main/java/icu/funkye/redispike/Server.java
index 134c90f..bc506a0 100644
--- a/src/main/java/org/redis2asp/Server.java
+++ b/src/main/java/icu/funkye/redispike/Server.java
@@ -14,8 +14,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp;
+package icu.funkye.redispike;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Optional;
import com.aerospike.client.Host;
import com.aerospike.client.policy.ClientPolicy;
import com.alipay.remoting.ConnectionEventType;
@@ -23,13 +26,14 @@
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
-import org.redis2asp.common.BoltServer;
-import org.redis2asp.common.CONNECTEventProcessor;
-import org.redis2asp.common.DISCONNECTEventProcessor;
-import org.redis2asp.factory.AeroSpikeClientFactory;
-import org.redis2asp.protocol.RedisProtocol;
+import icu.funkye.redispike.common.BoltServer;
+import icu.funkye.redispike.common.CONNECTEventProcessor;
+import icu.funkye.redispike.common.DISCONNECTEventProcessor;
+import icu.funkye.redispike.factory.AeroSpikeClientFactory;
+import icu.funkye.redispike.protocol.RedisProtocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,8 +65,14 @@ public void start(String... args) throws ParseException {
+ "for single record and batch commands.");
options.addOption("s", "set", true, "Set name. Use 'empty' for empty set (default: demoset)");
options.addOption("n", "namespace", true, "Namespace (default: test)");
+ options.addOption("u", "help", false, "Print usage.");
+
CommandLineParser parser = new DefaultParser();
CommandLine cl = parser.parse(options, args, false);
+ if (cl.hasOption("u")) {
+ logUsage(options);
+ throw new RuntimeException("Terminate after displaying usage");
+ }
port = Integer.parseInt(cl.getOptionValue("p", "6379"));
String host = cl.getOptionValue("th", "127.0.0.1");
int targetPort = Integer.parseInt(cl.getOptionValue("tp", "3000"));
@@ -86,8 +96,16 @@ public void start(String... args) throws ParseException {
}
}
- public void shutdown() {
- server.stop();
+ private void logUsage(Options options) {
+ HelpFormatter formatter = new HelpFormatter();
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ String syntax = "java -jar redispike-proxy.jar -options";
+ formatter.printHelp(pw, 100, syntax, "options:", options, 0, 2, null);
+ System.out.println(sw);
}
+ public void shutdown() {
+ Optional.ofNullable(server).ifPresent(BoltServer::stop);
+ }
}
diff --git a/src/main/java/org/redis2asp/common/BoltServer.java b/src/main/java/icu/funkye/redispike/common/BoltServer.java
similarity index 98%
rename from src/main/java/org/redis2asp/common/BoltServer.java
rename to src/main/java/icu/funkye/redispike/common/BoltServer.java
index ba25a0e..52fd8ac 100644
--- a/src/main/java/org/redis2asp/common/BoltServer.java
+++ b/src/main/java/icu/funkye/redispike/common/BoltServer.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp.common;
+package icu.funkye.redispike.common;
import com.alipay.remoting.ConnectionEventProcessor;
import com.alipay.remoting.ConnectionEventType;
diff --git a/src/main/java/org/redis2asp/common/CONNECTEventProcessor.java b/src/main/java/icu/funkye/redispike/common/CONNECTEventProcessor.java
similarity index 98%
rename from src/main/java/org/redis2asp/common/CONNECTEventProcessor.java
rename to src/main/java/icu/funkye/redispike/common/CONNECTEventProcessor.java
index c1737a7..64c936c 100644
--- a/src/main/java/org/redis2asp/common/CONNECTEventProcessor.java
+++ b/src/main/java/icu/funkye/redispike/common/CONNECTEventProcessor.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp.common;
+package icu.funkye.redispike.common;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/src/main/java/org/redis2asp/common/DISCONNECTEventProcessor.java b/src/main/java/icu/funkye/redispike/common/DISCONNECTEventProcessor.java
similarity index 98%
rename from src/main/java/org/redis2asp/common/DISCONNECTEventProcessor.java
rename to src/main/java/icu/funkye/redispike/common/DISCONNECTEventProcessor.java
index 71eeaae..00991c6 100644
--- a/src/main/java/org/redis2asp/common/DISCONNECTEventProcessor.java
+++ b/src/main/java/icu/funkye/redispike/common/DISCONNECTEventProcessor.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp.common;
+package icu.funkye.redispike.common;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
diff --git a/src/main/java/org/redis2asp/factory/AeroSpikeClientFactory.java b/src/main/java/icu/funkye/redispike/factory/AeroSpikeClientFactory.java
similarity index 96%
rename from src/main/java/org/redis2asp/factory/AeroSpikeClientFactory.java
rename to src/main/java/icu/funkye/redispike/factory/AeroSpikeClientFactory.java
index 6bee1f8..93ee11a 100644
--- a/src/main/java/org/redis2asp/factory/AeroSpikeClientFactory.java
+++ b/src/main/java/icu/funkye/redispike/factory/AeroSpikeClientFactory.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp.factory;
+package icu.funkye.redispike.factory;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -61,6 +61,7 @@ public static void createInstance(ClientPolicy clientPolicy, Host... hosts) {
LOCK.lock();
try {
if (client == null) {
+ clientPolicy.maxConnsPerNode = 65535;
clientPolicy.eventLoops = eventLoops;
client = new AerospikeClient(clientPolicy, hosts);
}
diff --git a/src/main/java/org/redis2asp/protocol/RedisCommandDecoder.java b/src/main/java/icu/funkye/redispike/protocol/RedisCommandDecoder.java
similarity index 92%
rename from src/main/java/org/redis2asp/protocol/RedisCommandDecoder.java
rename to src/main/java/icu/funkye/redispike/protocol/RedisCommandDecoder.java
index ddbb464..c37e3e0 100644
--- a/src/main/java/org/redis2asp/protocol/RedisCommandDecoder.java
+++ b/src/main/java/icu/funkye/redispike/protocol/RedisCommandDecoder.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.redis2asp.protocol;
+package icu.funkye.redispike.protocol;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -23,10 +23,10 @@
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.DecoderException;
-import org.redis2asp.protocol.request.CommandRequest;
-import org.redis2asp.protocol.request.DelRequest;
-import org.redis2asp.protocol.request.GetRequest;
-import org.redis2asp.protocol.request.SetRequest;
+import icu.funkye.redispike.protocol.request.CommandRequest;
+import icu.funkye.redispike.protocol.request.DelRequest;
+import icu.funkye.redispike.protocol.request.GetRequest;
+import icu.funkye.redispike.protocol.request.SetRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,7 +53,9 @@ public void decode(ChannelHandlerContext ctx, ByteBuf in, List