diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HgetRedisTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HgetRedisTask.java index 84e434e3d..544b1012e 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HgetRedisTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HgetRedisTask.java @@ -17,8 +17,8 @@ package org.apache.geode.benchmark.redis.tasks; -import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toKey; +import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import static org.assertj.core.api.Assertions.assertThat; import java.io.Serializable; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HsetRedisTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HsetRedisTask.java index 96b3a21d9..570bf8eaa 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HsetRedisTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/HsetRedisTask.java @@ -18,8 +18,8 @@ package org.apache.geode.benchmark.redis.tasks; -import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toKey; +import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import java.io.Serializable; import java.util.Map; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/JedisClientManager.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/JedisClientManager.java index bb6af11d6..e193dbfa3 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/JedisClientManager.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/JedisClientManager.java @@ -58,7 +58,7 @@ public boolean hset(final String key, final String field, final String value) { } @Override - public long zadd(String key, double score, String value) { + public long zadd(String key, double score, String value) { return jedisCluster.zadd(key, score, value); } @@ -67,6 +67,11 @@ public Set zrange(String key, long start, long stop) { return jedisCluster.zrange(key, start, stop); } + @Override + public Set zrangeByScore(String key, long start, long stop) { + return jedisCluster.zrangeByScore(key, start, stop); + } + @Override public void flushdb() { Set seen = new HashSet<>(); diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/LettuceClientManager.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/LettuceClientManager.java index 028b430f0..93bae98d3 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/LettuceClientManager.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/LettuceClientManager.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.stream.Collectors; +import io.lettuce.core.Range; import io.lettuce.core.ReadFrom; import io.lettuce.core.RedisURI; import io.lettuce.core.cluster.RedisClusterClient; @@ -79,6 +80,12 @@ public Set zrange(String key, long start, long stop) { return new HashSet<>(redisAdvancedClusterCommands.get().zrange(key, start, stop)); } + @Override + public Set zrangeByScore(String key, long start, long stop) { + return new HashSet<>( + redisAdvancedClusterCommands.get().zrangebyscore(key, Range.create(start, stop))); + } + @Override public void flushdb() { redisAdvancedClusterCommands.get().flushdb(); diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisHash.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisHash.java index 14299e415..63caa0355 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisHash.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisHash.java @@ -18,8 +18,8 @@ package org.apache.geode.benchmark.redis.tasks; import static java.lang.String.valueOf; -import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toKey; +import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import org.apache.geode.benchmark.LongRange; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisSortedSet.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisSortedSet.java index 9de9ff6e3..293ae92be 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisSortedSet.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/PrePopulateRedisSortedSet.java @@ -18,8 +18,8 @@ package org.apache.geode.benchmark.redis.tasks; import static java.lang.String.valueOf; -import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toKey; +import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import org.apache.geode.benchmark.LongRange; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/RedisClient.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/RedisClient.java index 732a33247..bbd188ffc 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/RedisClient.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/RedisClient.java @@ -31,4 +31,6 @@ public interface RedisClient { long zadd(String key, double score, String value); Set zrange(String key, long start, long stop); + + Set zrangeByScore(String key, long start, long stop); } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZaddRedisTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZaddRedisTask.java index 5016c66e5..646cfd511 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZaddRedisTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZaddRedisTask.java @@ -18,8 +18,8 @@ package org.apache.geode.benchmark.redis.tasks; -import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toKey; +import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toPart; import java.io.Serializable; import java.util.Map; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeByScoreRedisTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeByScoreRedisTask.java new file mode 100644 index 000000000..7eeb702d6 --- /dev/null +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeByScoreRedisTask.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geode.benchmark.redis.tasks; + +import static org.apache.geode.benchmark.redis.tasks.RedisSplitKey.toKey; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; +import java.util.stream.LongStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.yardstickframework.BenchmarkConfiguration; +import org.yardstickframework.BenchmarkDriverAdapter; + +import org.apache.geode.benchmark.LongRange; + +public class ZrangeByScoreRedisTask extends BenchmarkDriverAdapter implements Serializable { + private static final Logger logger = LoggerFactory.getLogger(ZrangeByScoreRedisTask.class); + + private final RedisClientManager redisClientManager; + private final LongRange keyRange; + private final boolean validate; + + private transient LongStringCache keyCache; + private transient RedisClient redisClient; + + public ZrangeByScoreRedisTask(final RedisClientManager redisClientManager, + final LongRange keyRange, + final boolean validate) { + logger.info("Initialized: keyRange={}, validate={}", keyRange, validate); + this.redisClientManager = redisClientManager; + this.keyRange = keyRange; + this.validate = validate; + } + + @Override + public void setUp(final BenchmarkConfiguration cfg) throws Exception { + super.setUp(cfg); + + keyCache = new LongStringCache(keyRange); + redisClient = redisClientManager.get(); + } + + @Override + public boolean test(final Map ctx) throws Exception { + final long k = keyRange.random(); + + final String key = keyCache.valueOf(toKey(k)); + + final long start = ThreadLocalRandom.current() + .nextLong(0, RedisSplitKey.NUM_PARTS_PER_KEY); + final long len = ThreadLocalRandom.current() + .nextLong(0, RedisSplitKey.NUM_PARTS_PER_KEY - start); + final long stop = start + len; + + final Set values = redisClient.zrangeByScore(key, start, stop); + if (validate) { + final LongRange range = + new LongRange(start, stop); + + final Set expectedValues = + LongStream.range(range.getMin(), range.getMax()) + .boxed() + .map(keyCache::valueOf) + .collect(Collectors.toSet()); + + assertThat(values).isEqualTo(expectedValues); + } + return true; + } + +} diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeRedisTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeRedisTask.java index 641388b8e..dea41a597 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeRedisTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tasks/ZrangeRedisTask.java @@ -45,7 +45,7 @@ public class ZrangeRedisTask extends BenchmarkDriverAdapter implements Serializa private transient RedisClient redisClient; public ZrangeRedisTask(final RedisClientManager redisClientManager, final LongRange keyRange, - final boolean validate) { + final boolean validate) { logger.info("Initialized: keyRange={}, validate={}", keyRange, validate); this.redisClientManager = redisClientManager; this.keyRange = keyRange; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisWeightedZaddAndZrangeBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisWeightedZaddAndZrangeBenchmark.java new file mode 100644 index 000000000..3f1da6d5e --- /dev/null +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisWeightedZaddAndZrangeBenchmark.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geode.benchmark.redis.tests; + +import static org.apache.geode.benchmark.Config.before; +import static org.apache.geode.benchmark.Config.workload; +import static org.apache.geode.benchmark.topology.Roles.CLIENT; + +import org.apache.geode.benchmark.redis.tasks.PrePopulateRedisHash; +import org.apache.geode.benchmark.redis.tasks.PrePopulateRedisSortedSet; +import org.apache.geode.benchmark.redis.tasks.ZaddRedisTask; +import org.apache.geode.benchmark.redis.tasks.ZrangeRedisTask; +import org.apache.geode.benchmark.tasks.WeightedTasks; +import org.apache.geode.benchmark.tasks.WeightedTasks.WeightedTask; +import org.apache.geode.perftest.TestConfig; + +public class RedisWeightedZaddAndZrangeBenchmark extends RedisBenchmark { + + @Override + public TestConfig configure() { + final TestConfig config = super.configure(); + + before(config, new PrePopulateRedisSortedSet(redisClientManager, keyRange), CLIENT); + + workload(config, new WeightedTasks( + new WeightedTask(20, new ZaddRedisTask(redisClientManager, keyRange)), + new WeightedTask(80, new ZrangeRedisTask(redisClientManager, keyRange, false))), CLIENT); + + return config; + } +} diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZaddBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZaddBenchmark.java index a4ea71331..6d3bd1f84 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZaddBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZaddBenchmark.java @@ -21,8 +21,6 @@ import static org.apache.geode.benchmark.Config.workload; import static org.apache.geode.benchmark.topology.Roles.CLIENT; -import org.apache.geode.benchmark.redis.tasks.HsetRedisTask; -import org.apache.geode.benchmark.redis.tasks.PrePopulateRedisHash; import org.apache.geode.benchmark.redis.tasks.PrePopulateRedisSortedSet; import org.apache.geode.benchmark.redis.tasks.ZaddRedisTask; import org.apache.geode.perftest.TestConfig; diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZrangeByScoreBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZrangeByScoreBenchmark.java new file mode 100644 index 000000000..8ec26ecbd --- /dev/null +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/redis/tests/RedisZrangeByScoreBenchmark.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geode.benchmark.redis.tests; + +import static org.apache.geode.benchmark.Config.before; +import static org.apache.geode.benchmark.Config.workload; +import static org.apache.geode.benchmark.topology.Roles.CLIENT; + +import org.apache.geode.benchmark.redis.tasks.PrePopulateRedisSortedSet; +import org.apache.geode.benchmark.redis.tasks.ZrangeByScoreRedisTask; +import org.apache.geode.perftest.TestConfig; + +public class RedisZrangeByScoreBenchmark extends RedisBenchmark { + + @Override + public TestConfig configure() { + final TestConfig config = super.configure(); + + before(config, new PrePopulateRedisSortedSet(redisClientManager, keyRange), CLIENT); + workload(config, + new ZrangeByScoreRedisTask(redisClientManager, keyRange, isValidationEnabled()), + CLIENT); + return config; + } +}