Skip to main content
Version: Next

Cache Service

This service lets your plugin interact with a cache. It is bound to your plugin too, so that you will only set and get values in your plugin's private namespace.

Configuration​

The cache service can be configured using the backend.cache section in your app-config.yaml:

In-Memory (default)​

backend:
cache:
store: memory

Memcache​

backend:
cache:
store: memcache
connection: user:pass@cache.example.com:11211

Redis​

backend:
cache:
store: redis
# Connection can be a simple URL string:
connection: redis://localhost:6379
# Or an object with additional options passed to the underlying client
# (only supported for the Redis store):
# connection:
# url: redis://localhost:6379
# pingInterval: 60000

# Store-specific configuration (optional)
redis:
client:
# Global namespace prefix for all cache keys
namespace: 'my-app'
# Separator used between namespace and plugin ID (default: ':')
keyPrefixSeparator: ':'
# Other Redis-specific options...
clearBatchSize: 1000
useUnlink: false

Valkey​

backend:
cache:
store: valkey
connection: redis://localhost:6379

# Store-specific configuration (optional)
valkey:
# Global namespace prefix for all cache keys (including separator used between namespace and plugin ID)
keyPrefix: 'my-app:'

Infinispan​

backend:
cache:
store: infinispan

# Store-specific configuration (optional)
infinispan:
servers:
# IP address or hostname of the server (default: '127.0.0.1')
- host: 127.0.0.1
# Port number of the server (default: '11222')
port: 11222
# Name of the cache (default: 'cache')
cacheName: cache
mediaType: application/json
authentication:
# Whether authentication is enabled (default: 'false')
enabled: true
userName: yourusername
password: yourpassword
saslMechanism: PLAIN

A full list of configuration items is available here, including support for backup clusters.

Namespace Configuration​

For Redis and Valkey stores, you can configure a global namespace that will be prefixed to all cache keys:

  • Without namespace: Cache keys use only the plugin ID (e.g., catalog:some-key)
  • With namespace: Cache keys use the format namespace:pluginId:key (e.g., my-app:catalog:some-key)

For Redis, keyPrefixSeparator controls what character is used between the namespace and plugin ID (defaults to :). For Valkey, you set the full keyPrefix including the separator.

Note: In-memory, Memcache and Infinispan stores do not support namespace configuration and will always use the plugin ID directly.

Using the service​

The following example shows how to get a cache client in your example backend plugin and setting and getting values from the cache.

import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';

createBackendPlugin({
pluginId: 'example',
register(env) {
env.registerInit({
deps: {
cache: coreServices.cache,
},
async init({ cache }) {
const { key, value } = { key: 'test:key', value: 'bob' };
await cache.set(key, value, { ttl: 1000 });

// .. some other stuff.

await cache.get(key); // 'bob'
},
});
},
});