How-To: Setup a customized Redis store

Configure Redis for Dapr state management or Pub/Sub

Dapr can use Redis in two ways:

  1. As state store component (state.redis) for persistence and restoration
  2. As pub/sub component (pubsub.redis) for async style message delivery

Create a Redis store

Dapr can use any Redis instance - containerized, running on your local dev machine, or a managed cloud service. If you already have a Redis store, move on to the configuration section.


Redis is automatically installed in self-hosted environments by the Dapr CLI as part of the initialization process.


You can use Helm to quickly create a Redis instance in our Kubernetes cluster. This approach requires Installing Helm v3.

  1. Install Redis into your cluster:

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm repo update
    helm install redis bitnami/redis
    

    Note that you will need a Redis version greater than 5, which is what Dapr’s pub/sub functionality requires. If you’re intending on using Redis as just a state store (and not for pub/sub) a lower version can be used.

  2. Run kubectl get pods to see the Redis containers now running in your cluster:

    $ kubectl get pods 
    NAME             READY   STATUS    RESTARTS   AGE
    redis-master-0   1/1     Running   0          69s
    redis-slave-0    1/1     Running   0          69s
    redis-slave-1    1/1     Running   0          22s
    
  3. Add redis-master.default.svc.cluster.local:6379 as the redisHost in your redis.yaml file. For example:

    metadata:
    - name: redisHost
      value: redis-master.default.svc.cluster.local:6379
    
  4. Securely reference the redis passoword in your redis.yaml file. For example:

    - name: redisPassword
      secretKeyRef:
        name: redis
        key: redis-password
    
  5. (Alternative) It is not recommended, but you can use a hard code a password instead of using secretKeyRef. First you’ll get the Redis password, which is slightly different depending on the OS you’re using:

    • Windows: In Powershell run:
      PS C:\> $base64pwd=kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}"
      PS C:\> $redispassword=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($base64pwd))
      PS C:\> $base64pwd=""
      PS C:\> $redispassword
      
    • Linux/MacOS: Run:
      kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode
      

    Add this password as the redisPassword value in your redis.yaml file. For example:

    metadata:
    - name: redisPassword
      value: lhDOkwTlp0
    

This method requires having an Azure Subscription.

  1. Open the Azure Portal to start the Azure Redis Cache creation flow. Log in if necessary.

  2. Fill out the necessary information

  3. Click “Create” to kickoff deployment of your Redis instance.

  4. Once your instance is created, you’ll need to grab your access key. Navigate to “Access Keys” under “Settings” and copy your key.

  5. You’ll need the hostname of your Redis instance, which you can retrieve from the “Overview” in Azure. It should look like xxxxxx.redis.cache.windows.net:6380.

  6. Finally, you’ll need to add our key and our host to a redis.yaml file that Dapr can apply to our cluster. If you’re running a sample, you’ll add the host and key to the provided redis.yaml. If you’re creating a project from the ground up, you’ll create a redis.yaml file as specified in Configuration.

    As the connection to Azure is encrypted, make sure to add the following block to the metadata section of your redis.yaml file.

    metadata:
    - name: enableTLS
      value: "true"
    

NOTE: Dapr pub/sub uses Redis streams that was introduced by Redis 5.0, which isn’t currently available on Azure Cache for Redis. Consequently, you can use Azure Cache for Redis only for state persistence.


Visit AWS Redis.

Configure Dapr components

Dapr can use Redis as a statestore component for state persistence (state.redis) or as a pubsub component (pubsub.redis). The following yaml files demonstrates how to define each component using either a secretKey reference (which is preferred) or a plain text password.

Create component files

State store component with secret reference

Create a file called redis-state.yaml, and paste the following:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST e.g. redis-master.default.svc.cluster.local:6379>
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password

Pub/sub component with secret reference

Create a file called redis-pubsub.yaml, and paste the following:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST e.g. redis-master.default.svc.cluster.local:6379>
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password

For development purposes only, create a file called redis-state.yaml, and paste the following:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword
    value: <PASSWORD>

For development purposes only, create a file called redis-pubsub.yaml, and paste the following:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword
    value: <PASSWORD>

Apply the configuration


By default the Dapr CLI creates a local Redis instance when you run dapr init. However, if you want to configure a different Redis instance, create a components dir containing the YAML file and provide the path to the dapr run command with the flag --components-path.

If you initialized Dapr using dapr init --slim, the Dapr CLI did not create a Redis instance or a default configuration file for it. Follow the instructions above to create a Redis store. Create the redis.yaml following the configuration instructions in a components dir and provide the path to the dapr run command with the flag --components-path.


Run kubectl apply -f <FILENAME> for both state and pubsub files:

kubectl apply -f redis-state.yaml
kubectl apply -f redis-pubsub.yaml