@Experimental public class MultiDbClient extends UnifiedJedis
This client extends UnifiedJedis to support resilient operations with:
Usage Example:
// Create multi-db client with multiple endpoints
HostAndPort primary = new HostAndPort("localhost", 29379);
HostAndPort secondary = new HostAndPort("localhost", 29380);
MultiDbClient client = MultiDbClient.builder()
.multiDbConfig(
MultiDbConfig.builder()
.database(
DatabaseConfig.builder(
primary,
DefaultJedisClientConfig.builder().build())
.weight(100.0f)
.build())
.database(DatabaseConfig.builder(
secondary,
DefaultJedisClientConfig.builder().build())
.weight(50.0f).build())
.failureDetector(MultiDbConfig.CircuitBreakerConfig.builder()
.failureRateThreshold(50.0f)
.build())
.commandRetry(MultiDbConfig.RetryConfig.builder()
.maxAttempts(3)
.build())
.build()
)
.databaseSwitchListener(event ->
System.out.println("Switched to: " + event.getEndpoint()))
.build();
// Use like any other Jedis client
client.set("key", "value");
String value = client.get("key");
// Automatic failover happens transparently
client.close();
The client automatically handles endpoint failures and recoveries, providing transparent high availability for Redis operations. All standard Jedis operations are supported with the added resilience features.
MultiDbConnectionProvider,
MultiDbCommandExecutor,
MultiDbConfig| Modifier and Type | Class and Description |
|---|---|
static class |
MultiDbClient.Builder
Fluent builder for
MultiDbClient. |
commandObjects, executor, protocol, provider| Modifier and Type | Method and Description |
|---|---|
void |
addDatabase(Endpoint endpoint,
float weight,
JedisClientConfig clientConfig)
Dynamically adds a new database endpoint to the multi-database client.
|
void |
addDatabase(MultiDbConfig.DatabaseConfig databaseConfig)
Adds a pre-configured database configuration.
|
static MultiDbClient.Builder |
builder()
Create a new builder for configuring MultiDbClient instances.
|
void |
forceActiveDatabase(Endpoint endpoint,
long forcedActiveDurationMs)
Forces the client to switch to a specific database for a duration.
|
Endpoint |
getActiveDatabaseEndpoint()
Returns the currently active database endpoint.
|
java.util.Set<Endpoint> |
getDatabaseEndpoints()
Returns the set of all configured database endpoints.
|
boolean |
isHealthy(Endpoint endpoint)
Returns the health status of the specified database.
|
MultiDbTransaction |
multi()
Creates a new transaction with multi-database support.
|
MultiDbPipeline |
pipelined()
Creates a new pipeline for batch operations with multi-db support.
|
void |
removeDatabase(Endpoint endpoint)
Dynamically removes a database endpoint from the multi-database client.
|
void |
setActiveDatabase(Endpoint endpoint)
Manually switches to the specified endpoint.
|
MultiDbTransaction |
transaction(boolean doMulti) |
append, append, bfAdd, bfCard, bfExists, bfInfo, bfInsert, bfInsert, bfLoadChunk, bfMAdd, bfMExists, bfReserve, bfReserve, bfScanDump, bitcount, bitcount, bitcount, bitcount, bitcount, bitcount, bitfield, bitfield, bitfieldReadonly, bitfieldReadonly, bitop, bitop, bitpos, bitpos, bitpos, bitpos, blmove, blmove, blmpop, blmpop, blmpop, blmpop, blpop, blpop, blpop, blpop, blpop, blpop, broadcastCommand, brpop, brpop, brpop, brpop, brpop, brpop, brpoplpush, brpoplpush, bzmpop, bzmpop, bzmpop, bzmpop, bzpopmax, bzpopmax, bzpopmin, bzpopmin, cfAdd, cfAddNx, cfCount, cfDel, cfExists, cfInfo, cfInsert, cfInsert, cfInsertNx, cfInsertNx, cfLoadChunk, cfMExists, cfReserve, cfReserve, cfScanDump, close, cmsIncrBy, cmsInfo, cmsInitByDim, cmsInitByProb, cmsMerge, cmsMerge, cmsQuery, configSet, copy, copy, dbSize, decr, decr, decrBy, decrBy, del, del, del, del, dump, dump, echo, eval, eval, eval, eval, eval, eval, eval, eval, evalReadonly, evalReadonly, evalsha, evalsha, evalsha, evalsha, evalsha, evalsha, evalsha, evalsha, evalshaReadonly, evalshaReadonly, executeCommand, executeCommand, exists, exists, exists, exists, expire, expire, expire, expire, expireAt, expireAt, expireAt, expireAt, expireTime, expireTime, fcall, fcall, fcallReadonly, fcallReadonly, flushAll, flushDB, ftAggregate, ftAggregateIteration, ftAliasAdd, ftAliasDel, ftAliasUpdate, ftAlter, ftAlter, ftConfigGet, ftConfigGet, ftConfigSet, ftConfigSet, ftCreate, ftCreate, ftCursorDel, ftCursorRead, ftDictAdd, ftDictAddBySampleKey, ftDictDel, ftDictDelBySampleKey, ftDictDump, ftDictDumpBySampleKey, ftDropIndex, ftDropIndexDD, ftExplain, ftExplainCLI, ftInfo, ftList, ftProfileAggregate, ftProfileSearch, ftProfileSearch, ftSearch, ftSearch, ftSearch, ftSearch, ftSearchIteration, ftSearchIteration, ftSpellCheck, ftSpellCheck, ftSugAdd, ftSugAddIncr, ftSugDel, ftSugGet, ftSugGet, ftSugGetWithScores, ftSugGetWithScores, ftSugLen, ftSynDump, ftSynUpdate, ftTagVals, functionDelete, functionDelete, functionDump, functionFlush, functionFlush, functionKill, functionList, functionList, functionList, functionListBinary, functionListWithCode, functionListWithCode, functionListWithCode, functionListWithCodeBinary, functionLoad, functionLoad, functionLoadReplace, functionLoadReplace, functionRestore, functionRestore, functionStats, functionStatsBinary, geoadd, geoadd, geoadd, geoadd, geoadd, geoadd, geodist, geodist, geodist, geodist, geohash, geohash, geopos, geopos, georadius, georadius, georadius, georadius, georadiusByMember, georadiusByMember, georadiusByMember, georadiusByMember, georadiusByMemberReadonly, georadiusByMemberReadonly, georadiusByMemberReadonly, georadiusByMemberReadonly, georadiusByMemberStore, georadiusByMemberStore, georadiusReadonly, georadiusReadonly, georadiusReadonly, georadiusReadonly, georadiusStore, georadiusStore, geosearch, geosearch, geosearch, geosearch, geosearch, geosearch, geosearch, geosearch, geosearch, geosearch, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStore, geosearchStoreStoreDist, geosearchStoreStoreDist, get, get, getbit, getbit, getCache, getDel, getDel, getEx, getEx, getrange, getrange, getSet, getSet, hdel, hdel, hexists, hexists, hexpire, hexpire, hexpire, hexpire, hexpireAt, hexpireAt, hexpireAt, hexpireAt, hexpireTime, hexpireTime, hget, hget, hgetAll, hgetAll, hgetdel, hgetdel, hgetex, hgetex, hincrBy, hincrBy, hincrByFloat, hincrByFloat, hkeys, hkeys, hlen, hlen, hmget, hmget, hmset, hmset, hpersist, hpersist, hpexpire, hpexpire, hpexpire, hpexpire, hpexpireAt, hpexpireAt, hpexpireAt, hpexpireAt, hpexpireTime, hpexpireTime, hpttl, hpttl, hrandfield, hrandfield, hrandfield, hrandfield, hrandfieldWithValues, hrandfieldWithValues, hscan, hscan, hscanNoValues, hscanNoValues, hset, hset, hset, hset, hsetex, hsetex, hsetex, hsetex, hsetnx, hsetnx, hsetObject, hsetObject, hstrlen, hstrlen, httl, httl, hvals, hvals, incr, incr, incrBy, incrBy, incrByFloat, incrByFloat, info, info, jsonArrAppend, jsonArrAppend, jsonArrAppendWithEscape, jsonArrIndex, jsonArrIndex, jsonArrIndexWithEscape, jsonArrInsert, jsonArrInsert, jsonArrInsertWithEscape, jsonArrLen, jsonArrLen, jsonArrLen, jsonArrPop, jsonArrPop, jsonArrPop, jsonArrPop, jsonArrPop, jsonArrPop, jsonArrPop, jsonArrPop, jsonArrTrim, jsonArrTrim, jsonClear, jsonClear, jsonClear, jsonDebugMemory, jsonDebugMemory, jsonDebugMemory, jsonDel, jsonDel, jsonDel, jsonGet, jsonGet, jsonGet, jsonGet, jsonGet, jsonGetAsPlainString, jsonMerge, jsonMerge, jsonMGet, jsonMGet, jsonNumIncrBy, jsonNumIncrBy, jsonObjKeys, jsonObjKeys, jsonObjKeys, jsonObjLen, jsonObjLen, jsonObjLen, jsonSet, jsonSet, jsonSet, jsonSet, jsonSetWithEscape, jsonSetWithEscape, jsonSetWithPlainString, jsonStrAppend, jsonStrAppend, jsonStrAppend, jsonStrLen, jsonStrLen, jsonStrLen, jsonToggle, jsonToggle, jsonType, jsonType, jsonType, keys, keys, lcs, lcs, lindex, lindex, linsert, linsert, llen, llen, lmove, lmove, lmpop, lmpop, lmpop, lmpop, lpop, lpop, lpop, lpop, lpos, lpos, lpos, lpos, lpos, lpos, lpush, lpush, lpushx, lpushx, lrange, lrange, lrem, lrem, lset, lset, ltrim, ltrim, memoryUsage, memoryUsage, memoryUsage, memoryUsage, mget, mget, migrate, migrate, migrate, migrate, mset, mset, msetnx, msetnx, objectEncoding, objectEncoding, objectFreq, objectFreq, objectIdletime, objectIdletime, objectRefcount, objectRefcount, persist, persist, pexpire, pexpire, pexpire, pexpire, pexpireAt, pexpireAt, pexpireAt, pexpireAt, pexpireTime, pexpireTime, pfadd, pfadd, pfcount, pfcount, pfcount, pfcount, pfmerge, pfmerge, ping, psetex, psetex, psubscribe, psubscribe, pttl, pttl, publish, publish, randomBinaryKey, randomKey, rename, rename, renamenx, renamenx, restore, restore, restore, restore, rpop, rpop, rpop, rpop, rpoplpush, rpoplpush, rpush, rpush, rpushx, rpushx, sadd, sadd, scan, scan, scan, scan, scan, scan, scanIteration, scanIteration, scard, scard, scriptExists, scriptExists, scriptExists, scriptExists, scriptExists, scriptFlush, scriptFlush, scriptFlush, scriptFlush, scriptFlush, scriptKill, scriptKill, scriptKill, scriptLoad, scriptLoad, scriptLoad, sdiff, sdiff, sdiffstore, sdiffstore, sendBlockingCommand, sendBlockingCommand, sendBlockingCommand, sendBlockingCommand, sendCommand, sendCommand, sendCommand, sendCommand, sendCommand, set, set, set, set, setbit, setbit, setBroadcastAndRoundRobinConfig, setDefaultSearchDialect, setex, setex, setGet, setGet, setGet, setGet, setJsonObjectMapper, setKeyArgumentPreProcessor, setnx, setnx, setProtocol, setrange, setrange, sinter, sinter, sintercard, sintercard, sintercard, sintercard, sinterstore, sinterstore, sismember, sismember, slowlogReset, smembers, smembers, smismember, smismember, smove, smove, sort, sort, sort, sort, sort, sort, sort, sort, sortReadonly, sortReadonly, spop, spop, spop, spop, srandmember, srandmember, srandmember, srandmember, srem, srem, sscan, sscan, strlen, strlen, subscribe, subscribe, substr, substr, sunion, sunion, sunionstore, sunionstore, tdigestAdd, tdigestByRank, tdigestByRevRank, tdigestCDF, tdigestCreate, tdigestCreate, tdigestInfo, tdigestMax, tdigestMerge, tdigestMerge, tdigestMin, tdigestQuantile, tdigestRank, tdigestReset, tdigestRevRank, tdigestTrimmedMean, topkAdd, topkIncrBy, topkInfo, topkList, topkListWithCount, topkQuery, topkReserve, topkReserve, touch, touch, touch, touch, tsAdd, tsAdd, tsAdd, tsAdd, tsAlter, tsCreate, tsCreate, tsCreateRule, tsCreateRule, tsDecrBy, tsDecrBy, tsDecrBy, tsDel, tsDeleteRule, tsGet, tsGet, tsIncrBy, tsIncrBy, tsIncrBy, tsInfo, tsInfoDebug, tsMAdd, tsMGet, tsMRange, tsMRange, tsMRevRange, tsMRevRange, tsQueryIndex, tsRange, tsRange, tsRevRange, tsRevRange, ttl, ttl, type, type, unlink, unlink, unlink, unlink, vadd, vadd, vadd, vadd, vadd, vadd, vaddFP32, vaddFP32, vaddFP32, vaddFP32, vaddFP32, vaddFP32, vcard, vcard, vdim, vdim, vemb, vemb, vembRaw, vembRaw, vgetattr, vgetattr, vinfo, vlinks, vlinks, vlinksWithScores, vlinksWithScores, vrandmember, vrandmember, vrandmember, vrandmember, vrem, vrem, vsetattr, vsetattr, vsim, vsim, vsim, vsim, vsimByElement, vsimByElement, vsimByElement, vsimByElement, vsimByElementWithScores, vsimByElementWithScores, vsimByElementWithScoresAndAttribs, vsimByElementWithScoresAndAttribs, vsimWithScores, vsimWithScores, vsimWithScoresAndAttribs, vsimWithScoresAndAttribs, waitAOF, waitAOF, waitReplicas, waitReplicas, xack, xack, xackdel, xackdel, xackdel, xackdel, xadd, xadd, xadd, xautoclaim, xautoclaim, xautoclaimJustId, xautoclaimJustId, xclaim, xclaim, xclaimJustId, xclaimJustId, xdel, xdel, xdelex, xdelex, xdelex, xdelex, xgroupCreate, xgroupCreate, xgroupCreateConsumer, xgroupCreateConsumer, xgroupDelConsumer, xgroupDelConsumer, xgroupDestroy, xgroupDestroy, xgroupSetID, xgroupSetID, xinfoConsumers, xinfoConsumers, xinfoConsumers2, xinfoGroups, xinfoGroups, xinfoStream, xinfoStream, xinfoStreamFull, xinfoStreamFull, xinfoStreamFull, xinfoStreamFull, xlen, xlen, xpending, xpending, xpending, xpending, xrange, xrange, xrange, xrange, xrange, xrange, xread, xread, xreadAsMap, xreadBinary, xreadBinaryAsMap, xreadGroup, xreadGroup, xreadGroupAsMap, xreadGroupBinary, xreadGroupBinaryAsMap, xrevrange, xrevrange, xrevrange, xrevrange, xrevrange, xrevrange, xtrim, xtrim, xtrim, xtrim, zadd, zadd, zadd, zadd, zadd, zadd, zadd, zadd, zaddIncr, zaddIncr, zcard, zcard, zcount, zcount, zcount, zcount, zdiff, zdiff, zdiffstore, zdiffStore, zdiffstore, zdiffStore, zdiffWithScores, zdiffWithScores, zincrby, zincrby, zincrby, zincrby, zinter, zinter, zintercard, zintercard, zintercard, zintercard, zinterstore, zinterstore, zinterstore, zinterstore, zinterWithScores, zinterWithScores, zlexcount, zlexcount, zmpop, zmpop, zmpop, zmpop, zmscore, zmscore, zpopmax, zpopmax, zpopmax, zpopmax, zpopmin, zpopmin, zpopmin, zpopmin, zrandmember, zrandmember, zrandmember, zrandmember, zrandmemberWithScores, zrandmemberWithScores, zrange, zrange, zrange, zrange, zrangeByLex, zrangeByLex, zrangeByLex, zrangeByLex, zrangeByScore, zrangeByScore, zrangeByScore, zrangeByScore, zrangeByScore, zrangeByScore, zrangeByScore, zrangeByScore, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangeByScoreWithScores, zrangestore, zrangestore, zrangeWithScores, zrangeWithScores, zrangeWithScores, zrangeWithScores, zrank, zrank, zrankWithScore, zrankWithScore, zrem, zrem, zremrangeByLex, zremrangeByLex, zremrangeByRank, zremrangeByRank, zremrangeByScore, zremrangeByScore, zremrangeByScore, zremrangeByScore, zrevrange, zrevrange, zrevrangeByLex, zrevrangeByLex, zrevrangeByLex, zrevrangeByLex, zrevrangeByScore, zrevrangeByScore, zrevrangeByScore, zrevrangeByScore, zrevrangeByScore, zrevrangeByScore, zrevrangeByScore, zrevrangeByScore, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeByScoreWithScores, zrevrangeWithScores, zrevrangeWithScores, zrevrank, zrevrank, zrevrankWithScore, zrevrankWithScore, zscan, zscan, zscore, zscore, zunion, zunion, zunionstore, zunionstore, zunionstore, zunionstore, zunionWithScores, zunionWithScoresclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waithscan, hscanNoValuessscanzscanxaddhscan, hscanNoValuessscanzscanxaddftAlter, ftAlter, ftCreate, ftCreate, ftCreate, ftSearchjsonMGet, jsonSetLegacy, jsonSetLegacyjsonMGet, jsonSet, jsonSet, jsonSetWithEscape, jsonSetWithEscapecmsIncrBytopkIncrBypublic void setActiveDatabase(Endpoint endpoint)
This method allows manual failover to a specific endpoint, bypassing the automatic weight-based selection. The switch will only succeed if the target endpoint is healthy.
endpoint - the endpoint to switch topublic void addDatabase(MultiDbConfig.DatabaseConfig databaseConfig)
This method allows adding a fully configured DatabaseConfig instance, providing maximum flexibility for advanced configurations including custom health check strategies, connection pool settings, etc.
databaseConfig - the pre-configured database configurationpublic void addDatabase(Endpoint endpoint, float weight, JedisClientConfig clientConfig)
This allows adding new database endpoints at runtime without recreating the client. The new endpoint will be available for failover operations immediately after being added and passing health checks (if configured).
endpoint - the Redis server endpointweight - the weight for this endpoint (higher values = higher priority)clientConfig - the client configuration for this endpointJedisValidationException - if the endpoint already existspublic java.util.Set<Endpoint> getDatabaseEndpoints()
This method provides a view of all database endpoints currently configured in the multi-database client. These are the endpoints that can be used for failover operations.
public boolean isHealthy(Endpoint endpoint)
This method provides the current health status of a specific endpoint.
endpoint - the endpoint to checkpublic void removeDatabase(Endpoint endpoint)
This allows removing database endpoints at runtime. If the removed endpoint is currently active, the client will automatically failover to the next available healthy endpoint based on weight priority.
endpoint - the endpoint to removeJedisValidationException - if the endpoint doesn't existJedisException - if removing the endpoint would leave no
healthy databases availablepublic void forceActiveDatabase(Endpoint endpoint, long forcedActiveDurationMs)
This method forces the client to use the specified database endpoint and puts all other endpoints in a grace period, preventing automatic failover for the specified duration. This is useful for maintenance scenarios or testing specific database endpoints.
endpoint - the endpoint to force as activeforcedActiveDurationMs - the duration in milliseconds to keep this endpoint forcedJedisValidationException - if the endpoint is not healthy
or doesn't existpublic MultiDbPipeline pipelined()
The returned pipeline supports the same resilience features as the main client, including automatic failover during batch execution.
pipelined in class UnifiedJedispublic MultiDbTransaction multi()
The returned transaction supports the same resilience features as the main client, including automatic failover during transaction execution.
multi in class UnifiedJedispublic MultiDbTransaction transaction(boolean doMulti)
transaction in class UnifiedJedisdoMulti - false should be set to enable manual WATCH, UNWATCH and MULTIpublic Endpoint getActiveDatabaseEndpoint()
The active endpoint is the one currently being used for all operations. It can change at any time due to health checks, failover, failback, or manual switching.
public static MultiDbClient.Builder builder()
MultiDbClient.Builder instanceCopyright © 2025. All rights reserved.