Connect to Redis (Upstash)
In this tutorial, you will learn how to integrate a Redis database using Upstash in a genezio project.
Common use cases of Redis
Out-of-the-box caching system
Redis is often used as a caching layer to store frequently accessed data in memory, reducing the need to fetch data from slower disk-based databases. This can significantly improve application performance.
Session storage
Storing session data in Redis is a common practice. Because of its speed, Redis is well-suited for managing user sessions in web applications. It allows for quick and efficient retrieval of user-specific information.
Rate limiting
Redis can be used to implement rate-limiting mechanisms. By tracking and controlling access rates for different operations, Redis helps prevent abuse and ensures the stability and performance of an application.
Prerequisites
If you don't already have them, you'll need to install the following tools:
You need to have a genezio project. Use an existing one, or create a new one.
1. Initialize an Upstash Redis database
Go to the Integrations
sidebar and select to install the Upstash Redis integration:
Connect with an Upstash account using the preferred login method:
Create a Redis database or select an already existing database:
Hit the Save
button to set the database credentials as environment variables in your genezio project:
2. Connect your backend to the Redis database
We will use ioredis
to connect our code to the Redis Database:
npm install ioredis
To connect to the Redis database from your NodeJs backend, create a new file called redis.ts
in the root folder of your project.
The following code snippet creates a new class that will be a minimal Redis service. In the constructor, we initialize the Redis client using the UPSTASH_REDIS_URL
environment variable. This variable is already set remotely in your project by the Upstash Redis integration.
import { GenezioDeploy } from "@genezio/types";
import Redis from "ioredis";
@GenezioDeploy()
export class ShoppingCartService {
client: Redis;
constructor() {
if (!process.env.UPSTASH_REDIS_URL) {
throw new Error("UPSTASH_REDIS_URL is not set in the `.env` file.");
}
this.client = new Redis(process.env.UPSTASH_REDIS_URL);
}
}
3. Store and retrieve data from Redis
Implement two methods to store and retrieve <key, value> pairs in the Redis database:
addItemToCart(cartId: string, productId: string, quantity: number): Promise<boolean> {
const cartKey = `cart:${cartId}`;
await this.client.set(`${cartKey}:${productId}`, quantity);
// the rest of the implementation goes here
}
getCartContents(cartId: string): Promise<Map<string, number> | null> {
const cartKey = `cart:${cartId}`;
const cartItems = await this.client.keys(`${cartKey}:*`);
// the rest of the implementation goes here
}
4. Test your Redis service
To locally test your Redis service, you have to use the copy button to add the environment variables to your clipboard. Using the copy button will disclose the sensitive information from the environment variables. Paste them in a .env
file in the root folder of your project.
You can find the environment variables in the Integrations
tab of your project page in the dashboard.
The .env
file should look similar to the following snippet:
UPSTASH_REDIS_URL="redis://default:sensitivepassword@cute-capybara-33897.upstash.io:33897"
UPSTASH_REDIS_REST_URL="https://cute-capybara-33897.upstash.io"
UPSTASH_REDIS_REST_TOKEN="sensitivetoken"
After setting the environment variables, you can test your Redis service by running the following command in your terminal:
genezio local
Open the testing page in your browser by navigating to http://localhost:8083/explore
.
Here you can create and send a request to your backend to test if it works as expected.
5. Deploy your application
After you tested your application, you can deploy it by running the following command in your terminal:
genezio deploy
Next Steps
Other things that do not depend on connecting to a database are scheduling the execution of a function as a cron job, or implementing HTTP Webhooks:
Also, you can find more details on deploying the backend and frontend here:
Now you are ready for some more advanced use cases:
Support
We invite you to join our community on Discord for further information and help.
Happy Learning!