Skip to content

docs(memorystore): added valkey caching demo application #9988

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions memorystore/valkey/caching/demo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# Caching Demo Application

This demo shows how to use Valkey as an in-memory cache to accelerate data retrieval in a Spring Boot application. By storing hot data in Valkey, you can reduce the number of queries to your PostgreSQL database, improving performance and scalability.

## Running locally

## Run locally using Docker

You can use [docker compose](https://docs.docker.com/compose/install/) to run the application locally. Run the following:

```bash
cd api
docker-compose up --build
```

You can also run with sample data. Run the following:

```bash
cd sample-data
docker-compose up --build
```

You can also run with a web application. Run the following:

```bash
cd web
docker-compose up --build
```

Once the application is running, you can access it at [http://localhost:8080](http://localhost:8080) for local development, or the URL provided by Cloud Run for production.

## How to deploy the application to Google Cloud (Solo API)

1. You can use [Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli) to deploy the infrastructure to Google Cloud. Run the following:

```bash
cd api
terraform init
terraform apply
```

It should fail to ceate the Google Cloud Run service, but don't worry, we'll fix that in the next series of steps. The message you get might look like this:

```bash
Error waiting to create Service: Error waiting for Creating Service: Error code 13, message: Revision 'caching-app-service-00001-9zj' is not ready and cannot serve traffic. Image 'gcr.io/cloudannot serve traffic. Image 'gcr.io/cloud-memorystore-demos/caching-app:latest' not found.
```

2. Once the infrastructure is created, you'll need to run the `init.sql` script in the Cloud SQL instance to create the necessary tables. You can use the Cloud Shell to do this. Run the following command in the Cloud Shell:

```bash
gcloud sql connect <instance_name> --database=caching-app-db --user=admin # The admin and database were created in the Terraform script
```

Note: Ensure that the instance name is the same as the one you used in the Terraform script.

a. When prompted to enable the Cloud SQL Admin API, type `Y` and press `Enter`.
b. When prompted to enter the password, type the password you set in the Terraform script and press `Enter`.
c. Once you're connected to the Cloud SQL instance, run the following command to run the `init.sql` script:

```sql
\i init.sql
```

3. Finally, redeploy the Cloud Run service using the local source code. Run the following command:

```bash
gcloud run deploy <instance_name> \
--source=. \
--region=<region>
```

Note: Ensure that the instance name and region are the same as the ones you used in the Terraform script.

Now you should have the application running on Google Cloud.

## How to deploy the application to Google Cloud (Web App + API)

1. Push your Docker images for the Web App and API to Google Container Registry. Run the following:

```bash
cd web
docker build -t gcr.io/<project_id>/caching-app-web .
docker push gcr.io/<project_id>/caching-app-web

cd ../api
docker build -t gcr.io/<project_id>/caching-app-api .
docker push gcr.io/<project_id>/caching-app-api
```

2. You can use [Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli) to deploy the infrastructure to Google Cloud. Run the following:

```bash
cd web
terraform init
terraform apply
```

3. Once the infrastructure is created, you'll need to run the `init.sql` script in the Cloud SQL instance to create the necessary tables. You can use the Cloud Shell to do this. Run the following command in the Cloud Shell:

```bash
gcloud sql connect <instance_name> --database=caching-app-db --user=admin # The admin and database were created in the Terraform script
```

Note: Ensure that the instance name is the same as the one you used in the Terraform script.

a. When prompted to enable the Cloud SQL Admin API, type `Y` and press `Enter`.
b. When prompted to enter the password, type the password you set in the Terraform script and press `Enter`.
c. Once you're connected to the Cloud SQL instance, run the following command to run the `init.sql` script:

```sql
\i init.sql
```

Now you should have the application running on Google Cloud.

### Endpoints

- `GET /item/{id}`: Get an item by ID
- `POST /item/create`: Create a new item
- `DELETE /item/delete/{id}`: Delete an item by ID
92 changes: 92 additions & 0 deletions memorystore/valkey/caching/demo/app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
##############################
## Java
##############################
.mtj.tmp/
*.class
*.jar
*.war
*.ear
*.nar
hs_err_pid*

##############################
## Maven
##############################
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
pom.xml.bak
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar

##############################
## Gradle
##############################
bin/
build/
.gradle
.gradletasknamecache
gradle-app.setting
!gradle-wrapper.jar

##############################
## IntelliJ
##############################
out/
.idea/
.idea_modules/
*.iml
*.ipr
*.iws

##############################
## Eclipse
##############################
.settings/
bin/
tmp/
.metadata
.classpath
.project
*.tmp
*.bak
*.swp
*~.nib
local.properties
.loadpath
.factorypath

##############################
## NetBeans
##############################
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml

##############################
## Visual Studio Code
##############################
.vscode/
.code-workspace

##############################
## OS X
##############################
.DS_Store

##############################
## Terraform
##############################
.terraform/
.terraform.lock.hcl
terraform.tfstate
terraform.tfstate.backup
24 changes: 24 additions & 0 deletions memorystore/valkey/caching/demo/app/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Use an OpenJDK base image
FROM openjdk:17-jdk-slim

# Install Maven for building the project
RUN apt-get update && apt-get install -y maven

# Set the working directory
WORKDIR /app

# Copy Maven project files
COPY pom.xml ./
COPY src ./src

# Build the project
RUN mvn clean package -DskipTests

# Copy the built JAR file to the container
RUN cp target/app-1.0-SNAPSHOT.jar app.jar

# Expose the application port
EXPOSE 8080

# Run the application
CMD ["java", "-jar", "app.jar"]
37 changes: 37 additions & 0 deletions memorystore/valkey/caching/demo/app/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: caching-app

services:
valkey:
image: valkey/valkey:latest
ports:
- "6379:6379"
command: ["valkey-server", "--save", "60", "1", "--loglevel", "warning"]

postgres:
image: postgres:latest
container_name: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql

app:
build:
context: .
dockerfile: Dockerfile
container_name: app
ports:
- "8080:8080"
depends_on:
- postgres
- valkey
environment:
- VALKEY_HOST=valkey
- VALKEY_PORT=6379
- DB_URL=jdbc:postgresql://postgres:5432/postgres
- DB_USERNAME=admin
- DB_PASSWORD=password
6 changes: 6 additions & 0 deletions memorystore/valkey/caching/demo/app/init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS items (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT NOT NULL,
price DOUBLE PRECISION NOT NULL
);
Loading