Redis
Read time: 9 minutes
Last edited: Oct 02, 2024
Overview
This topic explains how to use the SDK Redis integration as a persistent feature store.
Many of our server-side SDKs support Redis. The available options are slightly different in each language, but you can always specify the following:
- The Redis host address, which defaults to
localhost:6379
- A prefix string to add to all keys used by the store, to avoid collisions in case the database is also being used for some other purpose
- The length of time that recently read or updated data should be cached in memory
The LaunchDarkly SDKs use third-party open-source libraries to connect to Redis. Not all of these have the same level of support for advanced Redis configurations. Specifically, most of the SDKs and the Relay Proxy do not support connecting to a Redis cluster or using Redis Sentinel for service discovery.
To learn more, read the documentation for the individual SDKs below, or their Redis integration add-on libraries for SDKs that do not have this integration built in.
How the SDKs store data in Redis
The Redis integrations for all LaunchDarkly server-side SDKs use the same conventions, so that SDK instances and Relay Proxy instances sharing a single Redis store can interoperate correctly.
The storage schema is as follows:
- There is always a "prefix" string that provides a namespace for the overall data set. If you do not specify a prefix in your configuration, it is
launchdarkly
. If you are using a persistent store integration, it must be the client-side ID for the environment. - For each type of data that the SDK can store, there is a hash whose key is
PREFIX:TYPE
.PREFIX
is the configured prefix string.TYPE
denotes the type of data such asfeatures
andsegments
. - Within each hash, there is one field per data item. For instance, the hash
PREFIX:features
has one field per feature flag. The field name is the unique key of the item, such as the flag key for a feature flag, and the value is a serialized representation of that item, in a format that is determined by the SDK. - An additional key,
PREFIX:$inited
, is created with an arbitrary value when the SDK stores a full set of feature flag data. This allows a new SDK instance to check whether there is already a valid data set that was stored earlier. - The SDK may use additional keys starting with the
PREFIX
string, so you should not assume that theTYPE
values mentioned above and$inited
are the only possible keys. The SDK never adds, modifies, or removes any keys in Redis other than ones starting with thePREFIX
, so it is safe to share a Redis instance that is also being used for other purposes.
Server-side SDKs
In the following examples, the Redis feature store is set to use a host address of my-redis:6379
, a prefix string of "my-key-prefix"
, and a cache TTL of 15 or 30 seconds, depending on the SDK.
If you are using a persistent store integration, the value of the key prefix for the persistent store must be the client-side ID of your environment.
Your environment's client-side ID is available in the Environments list for your project. To learn more about key types, read Keys.
This feature is available in the following server-side SDKs:
- .NET (server-side)
- C++ (server-side)
- Erlang
- Go
- Haskell
- Java
- Lua
- Node.js (server-side)
- PHP
- Python
- Ruby
.NET (server-side)
Expand .NET (server-side) code sample
To use Redis with the .NET SDK you must install an additional package named LaunchDarkly.ServerSdk.Redis
.
using LaunchDarkly.Sdk.Server;using LaunchDarkly.Sdk.Server.Integrations;var config = Configuration.Builder(sdkKey).DataStore(Components.PersistentDataStore(Redis.DataStore().HostAndPort("my-redis", 6379).Prefix("my-key-prefix")).CacheSeconds(30)).Build();var client = new LDClient(config);
To learn more, read dotnet-server-sdk-redis
.
C++ (server-side)
Expand C++ (server-side) code sample
The C++ integration is part of the main SDK distribution, but is disabled by default in order to avoid bringing in unnecessary dependencies (redis++
, a wrapper for hiredis
).
To ensure the integration header and library are available for your build, set the CMake option LD_BUILD_REDIS_SUPPORT=ON
.
// Make sure to include the redis source's header.#include <launchdarkly/server_side/integrations/redis/redis_source.hpp>using namespace launchdarkly::server_side;using LazyLoad = config::builders::LazyLoadBuilder;ConfigBuilder config_builder(sdk_key);auto redis_source = integrations::RedisDataSource::Create("redis://localhost:6379", "my-key-prefix");if (!redis_source) {/* redis config is invalid, cannot proceed */}config_builder.DataSystem().Method(LazyLoad().Source(*redis_source).CacheRefresh(std::chrono::seconds(15)));auto config = config_builder.Build();if (!config) {/* an error occurred, config is not valid */}
Erlang
The Erlang integration is part of the main SDK distribution.
Expand Erlang code sample
LdOptions = #{redis_host => "redis",redis_port => "6379",redis_prefix => "default",feature_store => ldclient_storage_redis,cache_ttl => 15},ldclient:start_instance("sdk-key-123abc", LdOptions).
Go
Expand Go code sample
The Go integration is in github.com/launchdarkly/go-server-sdk-redis
for 5.0.0 or higher of the SDK. In earlier SDK versions, it is in the main SDK distribution as the subpackage redis
.
import ("time"ld "github.com/launchdarkly/go-server-sdk/v6""github.com/launchdarkly/go-server-sdk/v6/ldcomponents"ldredis "github.com/launchdarkly/go-server-sdk-redis")var config ld.Configconfig.DataStore = ldcomponents.PersistentDataStore(ldredis.DataStore().HostAndPort("my-redis", 6379).Prefix("my-key-prefix"),).CacheSeconds(30)client, _ := ld.MakeCustomClient(sdkKey, config, 5*time.Second)
To learn more, read go-server-sdk-redis
.
Haskell
Expand Haskell code sample
To use Redis with the Haskell SDK, you must install an additional package.
If you are working with version 4.0 of the Haskell SDK, use launchdarkly-server-sdk-redis-hedis
, which is in a separate repository. It is compatible with version 4.0 and higher of the Haskell SDK.
If you are working with versions 3.x and earlier, use launchdarkly-server-sdk-redis
.
import qualified Database.Redis as Rimport LaunchDarkly.Serverimport LaunchDarkly.Server.Store.Redismain = docon <- R.checkedConnect R.defaultConnectInfo { R.connectHost = "my-redis:6379" }backend <- makeRedisStore $ redisConfigSetNamespace "my-key-prefix" $ makeRedisStoreConfig conlet config = configSetStoreBackend backend $ makeConfig "sdk-key-123abc"client <- makeClient config
Java
Expand Java code sample
You must install the additional package com.launchdarkly.launchdarkly-java-server-sdk-redis-store
.
import com.launchdarkly.sdk.server.*;import com.launchdarkly.sdk.server.integrations.*;LDConfig config = new LDConfig.Builder().dataStore(Components.persistentDataStore(Redis.dataStore().uri(URI.create("redis://my-redis:6379")).prefix("my-key-prefix")).cacheSeconds(30)).build();LDClient client = new LDClient(sdkKey, config);
To learn more, read java-server-sdk-redis
.
Lua
Expand Lua code sample
When you use Redis for storing data, you also need to include launchdarkly_server_sdk_redis
:
local l = require("launchdarkly_server_sdk")local r = require("launchdarkly_server_sdk_redis")local redis = r.makeRedisSource("redis://localhost:6379", "your-key-prefix")local config = {dataSystem = {lazyLoad = {source = redis}}}local c = l.clientInit("sdk-key-123abc", 1000, config)
Node.js (server-side)
Expand Node.js (server-side) code sample
In version 8.0.0 and higher of the Node.js SDK, you must install the additional package @launchdarkly/node-server-sdk-redis
. In versions 6.0.0-7.x of the Node.js SDK, you must install the additional package launchdarkly-node-server-sdk-redis
.
In version 3.0 and higher of the Node.js SDK Redis integration, the ioredis
package is used for Redis operations. In versions 2.x of the Node.js SDK Redis integration, the redis
package is used for Redis operations.
const ld = require('@launchdarkly/node-server-sdk');const RedisFeatureStore = require('@launchdarkly/node-server-sdk-redis');const store = RedisFeatureStore({redisOpts: { host: 'redis-host', port: 6379 },prefix: 'your-key-prefix',cacheTTL: 30,});const options = {featureStore: store};const client = ld.init(sdkKey, options);
PHP
Expand PHP code sample
There are two Redis integrations for the PHP SDK. One uses the Predis package, which can be used in any PHP environment. The other uses the more efficient phpredis
extension, which must be installed in PHP itself.
In version 4.0 and higher of the PHP SDK, you must add a package to your application's Composer dependencies to use one of these two integrations:
- For the Predis integration, add
launchdarkly/server-sdk-redis-predis
. - For the
phpredis
integration, addlaunchdarkly/server-sdk-redis-phpredis
.
In versions 3.x and earlier, the Redis integrations are built into the main SDK package, but you must add a package dependency for predis/predis
if you are using Predis.
To use the Predis integration:
$fr = LaunchDarkly\Integrations\Redis::featureRequester(['redis_host' => 'my-redis','redis_port' => 6379,'redis_prefix' => 'my-key-prefix']);$client = new LaunchDarkly\LDClient("sdk-key-123abc", ['feature_requester' => $fr]);
To use the phpredis
integration:
$fr = LaunchDarkly\Integrations\PHPRedis::featureRequester(['redis_host' => 'my-redis','redis_port' => 6379,'redis_prefix' => 'my-key-prefix']);$client = new LaunchDarkly\LDClient("sdk-key-123abc", ['feature_requester' => $fr]);
To learn more, read php-server-sdk-redis-predis
or php-server-sdk-redis-phpredis
.
Python
Expand Python code sample
The Python integration is part of the main SDK distribution, but you must also install the package redis
.
import ldclientfrom ldclient.config import Configfrom ldclient.feature_store import CacheConfigfrom ldclient.integrations import Redisstore = Redis.new_feature_store(url='redis://my-redis:6379',prefix='my-key-prefix', caching=CacheConfig(expiration=30))# Prior to version 6.7.0, use this syntax:# store = RedisFeatureStore(url='redis://my-redis:6379', prefix='my-key-prefix',# expiration=30)config = Config(feature_store=store)ldclient.set_config(config)
Ruby
Expand Ruby code sample
The Ruby integration is part of the main SDK distribution, but you must also install the gems redis
and connection_pool
.
require 'ldclient-rb'store = LaunchDarkly::Integrations::Redis.new_feature_store(redis_url: 'redis://my-redis:6379',prefix: 'my-key-prefix',expiration: 30)# Prior to version 5.5.0, use "LaunchDarkly::RedisFeatureStore.new" instead# of "LaunchDarkly::Integrations::Redis.new_feature_store"config = LaunchDarkly::Config.new(feature_store: store)client = LaunchDarkly::Client.new(sdk_key, config)