High performance scalable web applications often use a distributed in-memory data cache in front of or in place of robust persistent storage for some tasks. We recommend using Memorystore for Redis as your caching service. Note that Memorystore for Redis does not provide a free tier. See Memorystore Pricing for details.
Before getting started, make sure your app will stay within the Memorystore for Redis quotas.
When to use a memory cache
Session data, user preferences, and other data returned by queries for web pages are good candidates for caching. In general, if a frequently run query returns a set of results that do not need to appear in your app immediately, you can cache the results. Subsequent requests can check the cache and only query the database if the results are absent or have expired.
If you store a value only in Memorystore without backing it up in persistent storage, be sure that your application behaves acceptably if the value expires and is removed from the cache. For example, if the sudden absence of a user's session data would cause the session to malfunction, that data should probably be stored in the database in addition to Memorystore.
Understanding Memorystore permissions
Every interaction with a Google Cloud service needs to be authorized. For example, to interact with a Redis database hosted by Memorystore, your app needs to supply the credentials of an account that is authorized to access Memorystore.
By default your app supplies the credentials of the App Engine default service account, which is authorized to access databases in the same project as your app.
If any of the following conditions are true, you need to use an alternative authentication technique that explicitly provides credentials:
Your app and the Memorystore database are in different Google Cloud projects.
You have changed the roles assigned to the default App Engine service account.
For information about alternative authentication techniques, see Setting up Authentication for Server to Server Production Applications.
Overview of using Memorystore
To use Memorystore in your app:
Set up Memorystore for Redis, which requires you to create a Redis instance on Memorystore and create a Serverless VPC Access that your app uses to communicate with the Redis instance.
Install a client library for Redis and use Redis commands to cache data.
Memorystore for Redis is compatible with any client library for Redis.
Go
This guide describes using the redigo client library to send Redis commands from your app.
Java
This guide describes using the Jedis client library to send Redis commands from your app. For details about using Jedis, see the Jedis wiki.
Node.js
This guide describes using the node_redis client library to send Redis commands from your app.
PHP
This guide describes using the PHPRedis client library to send Redis commands from your app.
Python
This guide describes using the redis-py 3.0 client library to send Redis commands from your app.
Ruby
This guide describes using the redis-rb client library to send Redis commands from your app.
Setting up Memorystore for Redis
To set up Memorystore for Redis:
Create a Redis instance in Memorystore.
When prompted to select a region for your Redis instance, select the same region in which your App Engine app is located.
Note the IP address and port number of the Redis instance you create. You will use this information when you create a Redis client in your code.
Connect your App Engine to a VPC network. Your app can only communicate with Memorystore through a VPC connector.
Be sure to add the VPC connection information to your
app.yaml
file as described in Configuring your app use the connector.
Installing dependencies
Go
To make the redigo client library available to your app when
it runs in App Engine, add the library to your app's dependencies. For
example, if you use a go.mod
file to declare dependencies, add the following
line to your go.mod
file:
module github.com/GoogleCloudPlatform/golang-samples/tree/master/memorystore/redis
Learn more about specifying dependencies for your Go app.
Java
To make the Jedis client library available to your app when it runs
in App Engine, add the library to your app's dependencies. For example,
if you use Maven add the following dependency in your pom.xml
file:
Node.js
To make the node_redis client library available to your app when it runs
in App Engine, add the library to your app's package.json
file.
For example:
Learn more about specifying dependencies for your Node.js app.
PHP
To make the PHPRedis client library available to your app when it runs
in App Engine, add the redis.so
extension to your app's php.ini
file.
For example:
For more information about enabling PHP extensions in App Engine, see Dynamically loadable extensions.
Python
To make the redis-py client library available to your app when it runs
in App Engine, add the following line to your app's
requirements.txt
file:
redis
The App Engine Python 3 runtime will automatically upload all libraries
your app's requirements.txt
file when you
deploy the app.
For local development, we recommend that you install dependencies in a virtual environment such as venv.
Ruby
To make the redis-rb client library available to your app when it runs
in App Engine, add the library to your app's Gemfile
file.
source "https://cloud.google.com/memorystore"
gem "redis-rb"
Creating a Redis client
To interact with a Redis database, your code needs to create a Redis client to manage the connection to your Redis database. The following sections describe creating a Redis client using the Redis client library.
Specifying environment variables
The Redis client library uses two environment variables to assemble the URL for your Redis database:
- A variable to identify the IP address of the Redis database you created in Memorystore.
- A variable to identify the port number of the Redis database you created in Memorystore.
We recommend you define these variables in your app's app.yaml
file instead of
defining them directly in your code. This makes it easier to run your app in
different environments, such as a local environment and App Engine. Learn more about environment variables in the app.yaml
reference page.
Go
For example, add the following lines to your app.yaml
file:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
Java
For example, add the following lines to your app.yaml
file:
env_variables:
redis.host: '10.112.12.112'
redis.port: '6379'
Node.js
For example, add the following lines to your app.yaml
file:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
PHP
For example, add the following lines to your app.yaml
file:
env_variables:
REDIS_HOST: '10.112.12.112'
REDIS_PORT: '6379'
Python
For example, add the following lines to your app.yaml
file:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
Ruby
For example, add the following lines to your app.yaml
file:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
Importing Redis and creating the client
Go
After you define the REDISHOST
and REDISPORT
environment variables,
use the following lines to import the redigo library, create a connection pool,
and then retrieve a Redis client from the pool:
Java
When you use the Jedis library, we recommend that you create a
JedisPool, and then use the pool to create a client.
The following lines of code use the redis.host
and redis.port
environment
variables you defined earlier to create a pool:
To create a client from the pool, use the JedisPool.getResource()
method.
For example:
Node.js
After you've defined the REDISHOST
and REDISPORT
environment variables,
you can use the following lines to import the node_redis library and
create a Redis client:
PHP
After you've defined the REDIS_HOST
and REDIS_PORT
environment variables,
you can use the following lines to create a Redis client:
Python
After you define the REDISHOST
and REDISPORT
environment variables,
use the following lines to import the redis-py library and
create a client:
import redis
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.Redis(host=redis_host, port=redis_port)
If you've used an older version of redis-py for other apps, you might have used
the StrictClient
class instead of Client
. However, redis-py now
recommends Client
instead of StrictClient
.
Ruby
No additional information for this runtime.
Using Redis commands to store and retrieve data in the cache
While the Memorystore Redis database supports most Redis commands, you only need to use a few commands to store and retrieve data from the cache. The following table suggests Redis commands you can use to cache data. To see how to call these commands from your app, view your client library's documentation.
Task | Redis command |
---|---|
Create an entry in the data cache and set an expiration time for the entry |
SETNX MSETNX |
Retrieve data from the cache | GET MGET |
Replace existing cache values | SET MSET |
Increment or decrement numeric cache values | INCR INCRBY DECR DECRBY |
Delete entries from the cache | DEL UNLINK |
Support concurrent interactions with the cache | See details about Redis transactions.
For Python, the redis-py client library requires all transactions to occur in a pipeline. |
Testing your updates
When you test your app locally, consider running a local instance of Redis to avoid interacting with production data (Memorystore doesn't provide an emulator). To install and run Redis locally, follow the directions in the Redis documentation. Note that it currently isn't possible to run Redis locally on Windows.
For more information about testing your apps, see Testing and deploying your application.
Deploying your app
Once your app is running in the local development server without errors:
If the app runs without errors, use traffic splitting to slowly ramp up traffic for your updated app. Monitor the app closely for any database issues before routing more traffic to the updated app.