You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by do...@apache.org on 2021/12/09 23:34:44 UTC
[geode-examples] branch develop updated: GEODE-9814: Add geode-for-redis example (#110)
This is an automated email from the ASF dual-hosted git repository.
donalevans pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-examples.git
The following commit(s) were added to refs/heads/develop by this push:
new 380669b GEODE-9814: Add geode-for-redis example (#110)
380669b is described below
commit 380669b16f8b0d40fd265be2e1fcb41f016166fe
Author: Donal Evans <do...@vmware.com>
AuthorDate: Thu Dec 9 15:34:37 2021 -0800
GEODE-9814: Add geode-for-redis example (#110)
Authored-by: Donal Evans <do...@vmware.com>
Co-authored-by: Dave Barnes <db...@apache.org>
---
.gitignore | 4 +-
README.md | 4 +-
build.gradle | 2 +
geodeForRedis/README.md | 88 ++++++++++++++++++++++
geodeForRedis/build.gradle | 20 +++++
geodeForRedis/scripts/start.gfsh | 28 +++++++
geodeForRedis/scripts/stop.gfsh | 17 +++++
.../geode_examples/geodeForRedis/Example.java | 69 +++++++++++++++++
gradle/rat.gradle | 2 +
settings.gradle | 1 +
10 files changed, 231 insertions(+), 4 deletions(-)
diff --git a/.gitignore b/.gitignore
index f34a209..b6156c8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,8 +18,8 @@ locator
locator1
l1
server
-server1
-server2
+*server1
+*server2
*.iml
*.ipr
diff --git a/README.md b/README.md
index bc97af5..937dbbe 100644
--- a/README.md
+++ b/README.md
@@ -110,7 +110,7 @@ an integration with other projects.
* SpringBoot Application
* HTTP Session replication
-* Redis
+* [Geode for Redis](geodeForRedis/README.md)
* Memcached
* Spark Connector
@@ -118,7 +118,7 @@ an integration with other projects.
Follow this approach to add a new example:
-* Create a subdirectory with a descriptive name like `cache-writer`
+* Create a subdirectory with a descriptive name like `cacheWriter`
* Create a `README.md` file in the example subproject to walk the user through the tutorial
* Create a Java class with a main method in the `org.apache.geode_examples.$name.Example` class
* Create a cluster initialization script in `scripts/start.gfsh`
diff --git a/build.gradle b/build.gradle
index 77acecf..4feaa5d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -102,6 +102,8 @@ subprojects {
delete 'server-ln-2'
delete 'server-ny-1'
delete 'server-ny-2'
+ delete 'redisServer1'
+ delete 'redisServer2'
}
}
clean.finalizedBy cleanServer
diff --git a/geodeForRedis/README.md b/geodeForRedis/README.md
new file mode 100644
index 0000000..58c885a
--- /dev/null
+++ b/geodeForRedis/README.md
@@ -0,0 +1,88 @@
+<!--
+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.
+-->
+
+# Geode for Redis Example using Jedis Client
+
+This example demonstrates simple operations on a Geode for Redis cluster using the Jedis Client.
+For more information on starting and configuring a Geode for Redis cluster, please refer to the
+Geode documentation for [Geode for Redis](http://geode.apache.org/docs/guide/tools_modules/geode_for_redis.html).
+
+In this example, two servers are started with geode-for-redis enabled, some data is added to the
+cluster using the Jedis client.
+
+This example assumes that Java and Geode are installed.
+
+## Set up the cluster
+1. Set directory `geode-examples/geodeForRedis` to be the current working directory.
+Each step in this example specifies paths relative to that directory.
+
+2. Build the example
+
+ $ ../gradlew build
+
+3. Run a script that starts a locator and two servers with geode-for-redis enabled.
+
+ $ ../gradlew start
+
+## Run the example program
+Run the example to populate the cluster with some initial leaderboard data, increment
+the scores associated with each member, then remove the lowest scoring member, printing the
+contents of the leaderboard at each step.
+
+ $ ../gradlew run
+
+## Optionally use the redis-cli to issue additional commands
+
+1. If you do not have `redis-cli` installed, follow the "Installing Redis" instructions
+at: https://redis.io/topics/quickstart
+
+2. Start the `redis-cli` in cluster mode, specifying the port used to start the geode-for-redis
+server:
+
+ $ redis-cli -c -p 6379
+
+3. Experiment with other commands:
+
+ $ set stringKey aString
+ OK
+
+ $ get stringKey
+ "aString"
+
+ $ append stringKey WithAppendedData
+ (integer) 23
+
+ $ get stringKey
+ "aStringWithAppendedData"
+
+ $ del stringKey
+ (integer) 1
+
+ $ get stringKey
+ (nil)
+
+Other supported commands can be listed using the `COMMAND` command.
+
+## Shut down the cluster and (optionally) clean up the directory
+1. Shut down the cluster:
+
+ $ ../gradlew stop
+
+2. If desired, clean up the generated directories containing
+logs:
+
+ $ ../gradlew cleanServer
diff --git a/geodeForRedis/build.gradle b/geodeForRedis/build.gradle
new file mode 100644
index 0000000..d413773
--- /dev/null
+++ b/geodeForRedis/build.gradle
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+dependencies {
+ implementation("redis.clients:jedis")
+}
diff --git a/geodeForRedis/scripts/start.gfsh b/geodeForRedis/scripts/start.gfsh
new file mode 100644
index 0000000..0dd9d41
--- /dev/null
+++ b/geodeForRedis/scripts/start.gfsh
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+start locator --name=locator --bind-address=localhost
+
+start server --name=redisServer1 --locators=localhost[10334] --server-port=0 \
+ --J=-Dgemfire.geode-for-redis-enabled=true \
+ --J=-Dgemfire.geode-for-redis-port=6379 \
+ --J=-Dgemfire.geode-for-redis-bind-address=127.0.0.1 \
+ --J=-Dgemfire.geode-for-redis-redundant-copies=1
+
+start server --name=redisServer2 --locators=localhost[10334] --server-port=0 \
+ --J=-Dgemfire.geode-for-redis-enabled=true \
+ --J=-Dgemfire.geode-for-redis-port=6380 \
+ --J=-Dgemfire.geode-for-redis-bind-address=127.0.0.1 \
+ --J=-Dgemfire.geode-for-redis-redundant-copies=1
diff --git a/geodeForRedis/scripts/stop.gfsh b/geodeForRedis/scripts/stop.gfsh
new file mode 100644
index 0000000..9755688
--- /dev/null
+++ b/geodeForRedis/scripts/stop.gfsh
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+connect --locator=127.0.0.1[10334]
+shutdown --include-locators=true
diff --git a/geodeForRedis/src/main/java/org/apache/geode_examples/geodeForRedis/Example.java b/geodeForRedis/src/main/java/org/apache/geode_examples/geodeForRedis/Example.java
new file mode 100644
index 0000000..956343d
--- /dev/null
+++ b/geodeForRedis/src/main/java/org/apache/geode_examples/geodeForRedis/Example.java
@@ -0,0 +1,69 @@
+/*
+ * 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_examples.geodeForRedis;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import redis.clients.jedis.HostAndPort;
+import redis.clients.jedis.JedisCluster;
+
+public class Example {
+ public static final String SORTED_SET_KEY = "{tag}leaderboard";
+
+ public static void main(String[] args) {
+ JedisCluster jedis = new JedisCluster(new HostAndPort("127.0.0.1", 6379));
+
+ populateSortedSet(jedis);
+
+ printSortedSetContents("Initial leaderboard with key '" + SORTED_SET_KEY + "': ", jedis);
+
+ System.out.println("Updating scores...");
+ modifyScores(jedis);
+
+ printSortedSetContents("Updated leaderboard with key '" + SORTED_SET_KEY + "': ", jedis);
+
+ System.out.println("Removing lowest scoring member...");
+ jedis.zpopmin(SORTED_SET_KEY);
+
+ printSortedSetContents("Updated leaderboard with key '" + SORTED_SET_KEY + "': ", jedis);
+ }
+
+ private static void populateSortedSet(JedisCluster jedis) {
+ Map<String, Double> memberScoreMap = new HashMap<>();
+ memberScoreMap.put("John", 0.0);
+ memberScoreMap.put("Maria", 0.0);
+ memberScoreMap.put("Jose", 0.0);
+ memberScoreMap.put("Wei", 0.0);
+ memberScoreMap.put("Ahmed", 0.0);
+
+ jedis.zadd(SORTED_SET_KEY, memberScoreMap);
+ }
+
+ private static void printSortedSetContents(String baseMessage, JedisCluster jedis) {
+ System.out
+ .println(baseMessage + jedis.zrevrangeWithScores(SORTED_SET_KEY, 0, Integer.MAX_VALUE));
+ }
+
+ private static void modifyScores(JedisCluster jedis) {
+ Random random = new Random();
+ jedis.zincrby(SORTED_SET_KEY, random.nextInt(10_000) / 100.0, "John");
+ jedis.zincrby(SORTED_SET_KEY, random.nextInt(10_000) / 100.0, "Maria");
+ jedis.zincrby(SORTED_SET_KEY, random.nextInt(10_000) / 100.0, "Jose");
+ jedis.zincrby(SORTED_SET_KEY, random.nextInt(10_000) / 100.0, "Wei");
+ jedis.zincrby(SORTED_SET_KEY, random.nextInt(10_000) / 100.0, "Ahmed");
+ }
+}
diff --git a/gradle/rat.gradle b/gradle/rat.gradle
index 2aedfe0..0485ff9 100644
--- a/gradle/rat.gradle
+++ b/gradle/rat.gradle
@@ -75,6 +75,8 @@ rat {
'**/locator-ny/**',
'**/server-ny-1/**',
'**/server-ny-2/**',
+ '**/redisServer1/**',
+ '**/redisServer2/**',
'**/META-INF/**'
]
diff --git a/settings.gradle b/settings.gradle
index a2165fa..fc595ce 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -43,6 +43,7 @@ include 'colocation'
include 'micrometerMetrics'
include 'compression'
include 'rest'
+include 'geodeForRedis'
// Logic for defining a custom Geode clone for integration with this project
// Define `-PgeodeCompositeDirectory` to your geode root, default `../geode`