Repository: redis/jedis
Branch: master
Commit: 8ba734cf950d
Files: 1030
Total size: 7.5 MB
Directory structure:
gitextract_6u_dou_5/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE
│ ├── actions/
│ │ └── run-tests/
│ │ └── action.yml
│ ├── codecov.yml
│ ├── dependabot.yml
│ ├── release-drafter-config.yml
│ └── workflows/
│ ├── codeql-analysis.yml
│ ├── docs.yml
│ ├── doctests.yml
│ ├── format_check.yml
│ ├── integration.yml
│ ├── release-drafter.yml
│ ├── snapshot.yml
│ ├── stale-issues.yml
│ ├── test-on-docker.yml
│ └── version-and-release.yml
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── docs/
│ ├── Dockerfile
│ ├── README.md
│ ├── advanced-usage.md
│ ├── css/
│ │ └── extra.css
│ ├── failover.md
│ ├── faq.md
│ ├── index.md
│ ├── jedis-maven.md
│ ├── migration-guides/
│ │ ├── v3-to-v4-primitives.md
│ │ ├── v3-to-v4-zset-list.md
│ │ ├── v3-to-v4.md
│ │ ├── v4-to-v5.md
│ │ ├── v5-to-v6.md
│ │ └── v6-to-v7.md
│ ├── redisearch.md
│ ├── redisjson.md
│ ├── requirements.txt
│ ├── transactions-multi.md
│ ├── tutorials_examples.md
│ └── verifying-artifacts.md
├── formatter-pom.xml
├── hbase-formatter.xml
├── mkdocs.yml
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── redis/
│ │ └── clients/
│ │ └── jedis/
│ │ ├── AbstractPipeline.java
│ │ ├── AbstractTransaction.java
│ │ ├── BinaryJedisPubSub.java
│ │ ├── BinaryJedisShardedPubSub.java
│ │ ├── Builder.java
│ │ ├── BuilderFactory.java
│ │ ├── ClientSetInfoConfig.java
│ │ ├── ClusterCommandObjects.java
│ │ ├── ClusterPipeline.java
│ │ ├── CommandArguments.java
│ │ ├── CommandFlagsRegistry.java
│ │ ├── CommandKeyArgumentPreProcessor.java
│ │ ├── CommandObject.java
│ │ ├── CommandObjects.java
│ │ ├── Connection.java
│ │ ├── ConnectionFactory.java
│ │ ├── ConnectionPool.java
│ │ ├── ConnectionPoolConfig.java
│ │ ├── DefaultJedisClientConfig.java
│ │ ├── DefaultJedisSocketFactory.java
│ │ ├── DefaultRedisCredentials.java
│ │ ├── DefaultRedisCredentialsProvider.java
│ │ ├── DriverInfo.java
│ │ ├── Endpoint.java
│ │ ├── GeoCoordinate.java
│ │ ├── HostAndPort.java
│ │ ├── HostAndPortMapper.java
│ │ ├── Jedis.java
│ │ ├── JedisClientConfig.java
│ │ ├── JedisCluster.java
│ │ ├── JedisClusterInfoCache.java
│ │ ├── JedisFactory.java
│ │ ├── JedisMetaInfo.java
│ │ ├── JedisMonitor.java
│ │ ├── JedisPool.java
│ │ ├── JedisPoolConfig.java
│ │ ├── JedisPooled.java
│ │ ├── JedisPubSub.java
│ │ ├── JedisPubSubBase.java
│ │ ├── JedisSafeAuthenticator.java
│ │ ├── JedisSentinelPool.java
│ │ ├── JedisSentineled.java
│ │ ├── JedisShardedPubSub.java
│ │ ├── JedisShardedPubSubBase.java
│ │ ├── JedisSocketFactory.java
│ │ ├── Module.java
│ │ ├── MultiDbClient.java
│ │ ├── MultiDbConfig.java
│ │ ├── MultiNodePipelineBase.java
│ │ ├── Pipeline.java
│ │ ├── PipeliningBase.java
│ │ ├── Protocol.java
│ │ ├── RedisClient.java
│ │ ├── RedisClusterClient.java
│ │ ├── RedisCredentials.java
│ │ ├── RedisCredentialsProvider.java
│ │ ├── RedisProtocol.java
│ │ ├── RedisSentinelClient.java
│ │ ├── ReliableTransaction.java
│ │ ├── Response.java
│ │ ├── SSLSocketWrapper.java
│ │ ├── ScanIteration.java
│ │ ├── SslOptions.java
│ │ ├── SslVerifyMode.java
│ │ ├── StaticCommandFlagsRegistry.java
│ │ ├── StaticCommandFlagsRegistryInitializer.java
│ │ ├── StreamEntryID.java
│ │ ├── Transaction.java
│ │ ├── UnifiedJedis.java
│ │ ├── annots/
│ │ │ ├── Experimental.java
│ │ │ ├── Internal.java
│ │ │ └── VisibleForTesting.java
│ │ ├── args/
│ │ │ ├── BitCountOption.java
│ │ │ ├── BitOP.java
│ │ │ ├── ClientAttributeOption.java
│ │ │ ├── ClientPauseMode.java
│ │ │ ├── ClientType.java
│ │ │ ├── ClusterFailoverOption.java
│ │ │ ├── ClusterResetType.java
│ │ │ ├── ExpiryOption.java
│ │ │ ├── FlushMode.java
│ │ │ ├── FunctionRestorePolicy.java
│ │ │ ├── GeoUnit.java
│ │ │ ├── HotkeysMetric.java
│ │ │ ├── LatencyEvent.java
│ │ │ ├── ListDirection.java
│ │ │ ├── ListPosition.java
│ │ │ ├── Rawable.java
│ │ │ ├── RawableFactory.java
│ │ │ ├── SaveMode.java
│ │ │ ├── SortedSetOption.java
│ │ │ ├── SortingOrder.java
│ │ │ ├── StreamDeletionPolicy.java
│ │ │ ├── UnblockType.java
│ │ │ └── package-info.java
│ │ ├── authentication/
│ │ │ ├── AuthXEventListener.java
│ │ │ ├── AuthXManager.java
│ │ │ ├── JedisAuthenticationException.java
│ │ │ └── TokenCredentials.java
│ │ ├── bloom/
│ │ │ ├── BFInsertParams.java
│ │ │ ├── BFReserveParams.java
│ │ │ ├── CFInsertParams.java
│ │ │ ├── CFReserveParams.java
│ │ │ ├── RedisBloomProtocol.java
│ │ │ ├── TDigestMergeParams.java
│ │ │ ├── commands/
│ │ │ │ ├── BloomFilterCommands.java
│ │ │ │ ├── BloomFilterPipelineCommands.java
│ │ │ │ ├── CountMinSketchCommands.java
│ │ │ │ ├── CountMinSketchPipelineCommands.java
│ │ │ │ ├── CuckooFilterCommands.java
│ │ │ │ ├── CuckooFilterPipelineCommands.java
│ │ │ │ ├── RedisBloomCommands.java
│ │ │ │ ├── RedisBloomPipelineCommands.java
│ │ │ │ ├── TDigestSketchCommands.java
│ │ │ │ ├── TDigestSketchPipelineCommands.java
│ │ │ │ ├── TopKFilterCommands.java
│ │ │ │ ├── TopKFilterPipelineCommands.java
│ │ │ │ └── package-info.java
│ │ │ └── package-info.java
│ │ ├── builders/
│ │ │ ├── AbstractClientBuilder.java
│ │ │ ├── ClusterClientBuilder.java
│ │ │ ├── MultiDbClientBuilder.java
│ │ │ ├── SentinelClientBuilder.java
│ │ │ └── StandaloneClientBuilder.java
│ │ ├── commands/
│ │ │ ├── AccessControlLogBinaryCommands.java
│ │ │ ├── AccessControlLogCommands.java
│ │ │ ├── BitBinaryCommands.java
│ │ │ ├── BitCommands.java
│ │ │ ├── BitPipelineBinaryCommands.java
│ │ │ ├── BitPipelineCommands.java
│ │ │ ├── ClientBinaryCommands.java
│ │ │ ├── ClientCommands.java
│ │ │ ├── ClusterCommands.java
│ │ │ ├── CommandCommands.java
│ │ │ ├── ConfigCommands.java
│ │ │ ├── ControlBinaryCommands.java
│ │ │ ├── ControlCommands.java
│ │ │ ├── DatabaseCommands.java
│ │ │ ├── DatabasePipelineCommands.java
│ │ │ ├── FunctionBinaryCommands.java
│ │ │ ├── FunctionCommands.java
│ │ │ ├── FunctionPipelineBinaryCommands.java
│ │ │ ├── FunctionPipelineCommands.java
│ │ │ ├── GenericControlCommands.java
│ │ │ ├── GeoBinaryCommands.java
│ │ │ ├── GeoCommands.java
│ │ │ ├── GeoPipelineBinaryCommands.java
│ │ │ ├── GeoPipelineCommands.java
│ │ │ ├── HashBinaryCommands.java
│ │ │ ├── HashCommands.java
│ │ │ ├── HashPipelineBinaryCommands.java
│ │ │ ├── HashPipelineCommands.java
│ │ │ ├── HyperLogLogBinaryCommands.java
│ │ │ ├── HyperLogLogCommands.java
│ │ │ ├── HyperLogLogPipelineBinaryCommands.java
│ │ │ ├── HyperLogLogPipelineCommands.java
│ │ │ ├── JedisBinaryCommands.java
│ │ │ ├── JedisCommands.java
│ │ │ ├── KeyBinaryCommands.java
│ │ │ ├── KeyCommands.java
│ │ │ ├── KeyPipelineBinaryCommands.java
│ │ │ ├── KeyPipelineCommands.java
│ │ │ ├── ListBinaryCommands.java
│ │ │ ├── ListCommands.java
│ │ │ ├── ListPipelineBinaryCommands.java
│ │ │ ├── ListPipelineCommands.java
│ │ │ ├── ModuleCommands.java
│ │ │ ├── PipelineBinaryCommands.java
│ │ │ ├── PipelineCommands.java
│ │ │ ├── ProtocolCommand.java
│ │ │ ├── RedisModuleCommands.java
│ │ │ ├── RedisModulePipelineCommands.java
│ │ │ ├── SampleBinaryKeyedCommands.java
│ │ │ ├── SampleBinaryKeyedPipelineCommands.java
│ │ │ ├── SampleKeyedCommands.java
│ │ │ ├── SampleKeyedPipelineCommands.java
│ │ │ ├── ScriptingControlCommands.java
│ │ │ ├── ScriptingKeyBinaryCommands.java
│ │ │ ├── ScriptingKeyCommands.java
│ │ │ ├── ScriptingKeyPipelineBinaryCommands.java
│ │ │ ├── ScriptingKeyPipelineCommands.java
│ │ │ ├── SentinelCommands.java
│ │ │ ├── ServerCommands.java
│ │ │ ├── SetBinaryCommands.java
│ │ │ ├── SetCommands.java
│ │ │ ├── SetPipelineBinaryCommands.java
│ │ │ ├── SetPipelineCommands.java
│ │ │ ├── SlowlogCommands.java
│ │ │ ├── SortedSetBinaryCommands.java
│ │ │ ├── SortedSetCommands.java
│ │ │ ├── SortedSetPipelineBinaryCommands.java
│ │ │ ├── SortedSetPipelineCommands.java
│ │ │ ├── StreamBinaryCommands.java
│ │ │ ├── StreamCommands.java
│ │ │ ├── StreamPipelineBinaryCommands.java
│ │ │ ├── StreamPipelineCommands.java
│ │ │ ├── StringBinaryCommands.java
│ │ │ ├── StringCommands.java
│ │ │ ├── StringPipelineBinaryCommands.java
│ │ │ ├── StringPipelineCommands.java
│ │ │ ├── VectorSetBinaryCommands.java
│ │ │ ├── VectorSetCommands.java
│ │ │ ├── VectorSetPipelineBinaryCommands.java
│ │ │ ├── VectorSetPipelineCommands.java
│ │ │ └── package-info.java
│ │ ├── csc/
│ │ │ ├── AbstractCache.java
│ │ │ ├── Cache.java
│ │ │ ├── CacheConfig.java
│ │ │ ├── CacheConnection.java
│ │ │ ├── CacheEntry.java
│ │ │ ├── CacheFactory.java
│ │ │ ├── CacheKey.java
│ │ │ ├── CacheStats.java
│ │ │ ├── Cacheable.java
│ │ │ ├── DefaultCache.java
│ │ │ ├── DefaultCacheable.java
│ │ │ ├── EvictionPolicy.java
│ │ │ ├── LRUEviction.java
│ │ │ ├── RedisVersion.java
│ │ │ ├── package-info.java
│ │ │ └── util/
│ │ │ ├── AllowAndDenyListWithStringKeys.java
│ │ │ └── package-info.java
│ │ ├── exceptions/
│ │ │ ├── ClusterAggregationException.java
│ │ │ ├── InvalidURIException.java
│ │ │ ├── JedisAccessControlException.java
│ │ │ ├── JedisAskDataException.java
│ │ │ ├── JedisBroadcastException.java
│ │ │ ├── JedisBusyException.java
│ │ │ ├── JedisCacheException.java
│ │ │ ├── JedisClusterException.java
│ │ │ ├── JedisClusterOperationException.java
│ │ │ ├── JedisConnectionException.java
│ │ │ ├── JedisDataException.java
│ │ │ ├── JedisException.java
│ │ │ ├── JedisMovedDataException.java
│ │ │ ├── JedisNoScriptException.java
│ │ │ ├── JedisRedirectionException.java
│ │ │ ├── JedisValidationException.java
│ │ │ ├── UnsupportedAggregationException.java
│ │ │ └── package-info.java
│ │ ├── executors/
│ │ │ ├── ClusterCommandExecutor.java
│ │ │ ├── CommandExecutor.java
│ │ │ ├── ConnectionResolver.java
│ │ │ ├── ConnectionResolverFactory.java
│ │ │ ├── DefaultCommandExecutor.java
│ │ │ ├── ReplicaOnlyConnectionResolver.java
│ │ │ ├── RetryableCommandExecutor.java
│ │ │ ├── RoundRobinConnectionResolver.java
│ │ │ ├── SimpleCommandExecutor.java
│ │ │ ├── SingleConnectionResolver.java
│ │ │ ├── SlotBasedConnectionResolver.java
│ │ │ ├── aggregators/
│ │ │ │ ├── Aggregator.java
│ │ │ │ ├── ClusterReplyAggregator.java
│ │ │ │ ├── DefaultPolicyAggregator.java
│ │ │ │ ├── FirstNonNullAggregator.java
│ │ │ │ ├── JedisByteHashMapAggregator.java
│ │ │ │ ├── JedisByteMapAggregator.java
│ │ │ │ ├── ListAggregator.java
│ │ │ │ ├── LogicalAndAggregator.java
│ │ │ │ ├── LogicalBinaryAggregator.java
│ │ │ │ ├── LogicalOrAggregator.java
│ │ │ │ ├── MapAggregator.java
│ │ │ │ ├── MaxAggregator.java
│ │ │ │ ├── MinAggregator.java
│ │ │ │ ├── MultiNodeResultAggregator.java
│ │ │ │ ├── SetAggregator.java
│ │ │ │ └── SumAggregator.java
│ │ │ └── package-info.java
│ │ ├── json/
│ │ │ ├── DefaultGsonObjectMapper.java
│ │ │ ├── JsonBuilderFactory.java
│ │ │ ├── JsonObjectMapper.java
│ │ │ ├── JsonProtocol.java
│ │ │ ├── JsonSetParams.java
│ │ │ ├── Path.java
│ │ │ ├── Path2.java
│ │ │ ├── commands/
│ │ │ │ ├── RedisJsonCommands.java
│ │ │ │ ├── RedisJsonPipelineCommands.java
│ │ │ │ ├── RedisJsonV1Commands.java
│ │ │ │ ├── RedisJsonV1PipelineCommands.java
│ │ │ │ ├── RedisJsonV2Commands.java
│ │ │ │ └── RedisJsonV2PipelineCommands.java
│ │ │ └── package-info.java
│ │ ├── mcf/
│ │ │ ├── CircuitBreakerThresholdsAdapter.java
│ │ │ ├── ConnectionFailoverException.java
│ │ │ ├── ConnectionInitializationContext.java
│ │ │ ├── DatabaseSwitchEvent.java
│ │ │ ├── HealthCheck.java
│ │ │ ├── HealthCheckCollection.java
│ │ │ ├── HealthCheckImpl.java
│ │ │ ├── HealthCheckStrategy.java
│ │ │ ├── HealthStatus.java
│ │ │ ├── HealthStatusChangeEvent.java
│ │ │ ├── HealthStatusListener.java
│ │ │ ├── HealthStatusManager.java
│ │ │ ├── InitializationPolicy.java
│ │ │ ├── JedisFailoverException.java
│ │ │ ├── LagAwareStrategy.java
│ │ │ ├── MultiDbCommandExecutor.java
│ │ │ ├── MultiDbConnectionProvider.java
│ │ │ ├── MultiDbConnectionSupplier.java
│ │ │ ├── MultiDbFailoverBase.java
│ │ │ ├── MultiDbPipeline.java
│ │ │ ├── MultiDbTransaction.java
│ │ │ ├── PingStrategy.java
│ │ │ ├── ProbingPolicy.java
│ │ │ ├── RedisRestAPI.java
│ │ │ ├── StatusTracker.java
│ │ │ ├── SwitchReason.java
│ │ │ ├── TrackingConnectionPool.java
│ │ │ └── package-info.java
│ │ ├── params/
│ │ │ ├── BaseGetExParams.java
│ │ │ ├── BaseSetExParams.java
│ │ │ ├── BitPosParams.java
│ │ │ ├── ClientKillParams.java
│ │ │ ├── CommandListFilterByParams.java
│ │ │ ├── FailoverParams.java
│ │ │ ├── GeoAddParams.java
│ │ │ ├── GeoRadiusParam.java
│ │ │ ├── GeoRadiusStoreParam.java
│ │ │ ├── GeoSearchParam.java
│ │ │ ├── GetExParams.java
│ │ │ ├── HGetExParams.java
│ │ │ ├── HSetExParams.java
│ │ │ ├── HotkeysParams.java
│ │ │ ├── IParams.java
│ │ │ ├── LCSParams.java
│ │ │ ├── LPosParams.java
│ │ │ ├── LolwutParams.java
│ │ │ ├── MSetExParams.java
│ │ │ ├── MigrateParams.java
│ │ │ ├── ModuleLoadExParams.java
│ │ │ ├── RestoreParams.java
│ │ │ ├── ScanParams.java
│ │ │ ├── SetParams.java
│ │ │ ├── ShutdownParams.java
│ │ │ ├── SortingParams.java
│ │ │ ├── VAddParams.java
│ │ │ ├── VSimParams.java
│ │ │ ├── XAddParams.java
│ │ │ ├── XAutoClaimParams.java
│ │ │ ├── XCfgSetParams.java
│ │ │ ├── XClaimParams.java
│ │ │ ├── XPendingParams.java
│ │ │ ├── XReadGroupParams.java
│ │ │ ├── XReadParams.java
│ │ │ ├── XTrimParams.java
│ │ │ ├── ZAddParams.java
│ │ │ ├── ZIncrByParams.java
│ │ │ ├── ZParams.java
│ │ │ ├── ZRangeParams.java
│ │ │ └── package-info.java
│ │ ├── providers/
│ │ │ ├── ClusterConnectionProvider.java
│ │ │ ├── ConnectionProvider.java
│ │ │ ├── ManagedConnectionProvider.java
│ │ │ ├── PooledConnectionProvider.java
│ │ │ ├── SentineledConnectionProvider.java
│ │ │ └── package-info.java
│ │ ├── resps/
│ │ │ ├── AccessControlLogEntry.java
│ │ │ ├── AccessControlUser.java
│ │ │ ├── ClusterShardInfo.java
│ │ │ ├── ClusterShardNodeInfo.java
│ │ │ ├── CommandDocument.java
│ │ │ ├── CommandInfo.java
│ │ │ ├── FunctionStats.java
│ │ │ ├── GeoRadiusResponse.java
│ │ │ ├── HotkeysInfo.java
│ │ │ ├── LCSMatchResult.java
│ │ │ ├── LatencyHistoryInfo.java
│ │ │ ├── LatencyLatestInfo.java
│ │ │ ├── LibraryInfo.java
│ │ │ ├── RawVector.java
│ │ │ ├── ScanResult.java
│ │ │ ├── Slowlog.java
│ │ │ ├── StreamConsumerFullInfo.java
│ │ │ ├── StreamConsumerInfo.java
│ │ │ ├── StreamConsumersInfo.java
│ │ │ ├── StreamEntry.java
│ │ │ ├── StreamEntryBinary.java
│ │ │ ├── StreamEntryDeletionResult.java
│ │ │ ├── StreamFullInfo.java
│ │ │ ├── StreamGroupFullInfo.java
│ │ │ ├── StreamGroupInfo.java
│ │ │ ├── StreamInfo.java
│ │ │ ├── StreamPendingEntry.java
│ │ │ ├── StreamPendingSummary.java
│ │ │ ├── TrackingInfo.java
│ │ │ ├── Tuple.java
│ │ │ ├── VSimScoreAttribs.java
│ │ │ ├── VectorInfo.java
│ │ │ └── package-info.java
│ │ ├── search/
│ │ │ ├── Apply.java
│ │ │ ├── Combiner.java
│ │ │ ├── Combiners.java
│ │ │ ├── Document.java
│ │ │ ├── FTCreateParams.java
│ │ │ ├── FTProfileParams.java
│ │ │ ├── FTSearchParams.java
│ │ │ ├── FTSpellCheckParams.java
│ │ │ ├── FieldName.java
│ │ │ ├── Filter.java
│ │ │ ├── FtSearchIteration.java
│ │ │ ├── IndexDataType.java
│ │ │ ├── IndexDefinition.java
│ │ │ ├── IndexOptions.java
│ │ │ ├── Limit.java
│ │ │ ├── ProfilingInfo.java
│ │ │ ├── Query.java
│ │ │ ├── RediSearchCommands.java
│ │ │ ├── RediSearchPipelineCommands.java
│ │ │ ├── RediSearchUtil.java
│ │ │ ├── Schema.java
│ │ │ ├── Scorer.java
│ │ │ ├── Scorers.java
│ │ │ ├── SearchBuilderFactory.java
│ │ │ ├── SearchProtocol.java
│ │ │ ├── SearchResult.java
│ │ │ ├── aggr/
│ │ │ │ ├── AggregationBuilder.java
│ │ │ │ ├── AggregationResult.java
│ │ │ │ ├── FtAggregateIteration.java
│ │ │ │ ├── Group.java
│ │ │ │ ├── Reducer.java
│ │ │ │ ├── Reducers.java
│ │ │ │ ├── Row.java
│ │ │ │ ├── SortedField.java
│ │ │ │ └── package-info.java
│ │ │ ├── hybrid/
│ │ │ │ ├── FTHybridParams.java
│ │ │ │ ├── FTHybridPostProcessingParams.java
│ │ │ │ ├── FTHybridSearchParams.java
│ │ │ │ ├── FTHybridVectorParams.java
│ │ │ │ └── HybridResult.java
│ │ │ ├── package-info.java
│ │ │ ├── querybuilder/
│ │ │ │ ├── DisjunctNode.java
│ │ │ │ ├── DisjunctUnionNode.java
│ │ │ │ ├── DoubleRangeValue.java
│ │ │ │ ├── GeoValue.java
│ │ │ │ ├── IntersectNode.java
│ │ │ │ ├── LongRangeValue.java
│ │ │ │ ├── Node.java
│ │ │ │ ├── OptionalNode.java
│ │ │ │ ├── QueryBuilders.java
│ │ │ │ ├── QueryNode.java
│ │ │ │ ├── RangeValue.java
│ │ │ │ ├── UnionNode.java
│ │ │ │ ├── Value.java
│ │ │ │ ├── ValueNode.java
│ │ │ │ └── Values.java
│ │ │ └── schemafields/
│ │ │ ├── GeoField.java
│ │ │ ├── GeoShapeField.java
│ │ │ ├── NumericField.java
│ │ │ ├── SchemaField.java
│ │ │ ├── TagField.java
│ │ │ ├── TextField.java
│ │ │ └── VectorField.java
│ │ ├── timeseries/
│ │ │ ├── AggregationType.java
│ │ │ ├── DuplicatePolicy.java
│ │ │ ├── EncodingFormat.java
│ │ │ ├── RedisTimeSeriesCommands.java
│ │ │ ├── RedisTimeSeriesPipelineCommands.java
│ │ │ ├── TSAddParams.java
│ │ │ ├── TSAlterParams.java
│ │ │ ├── TSArithByParams.java
│ │ │ ├── TSCreateParams.java
│ │ │ ├── TSDecrByParams.java
│ │ │ ├── TSElement.java
│ │ │ ├── TSGetParams.java
│ │ │ ├── TSIncrByParams.java
│ │ │ ├── TSInfo.java
│ │ │ ├── TSMGetElement.java
│ │ │ ├── TSMGetParams.java
│ │ │ ├── TSMRangeElements.java
│ │ │ ├── TSMRangeParams.java
│ │ │ ├── TSRangeParams.java
│ │ │ ├── TimeSeriesBuilderFactory.java
│ │ │ ├── TimeSeriesProtocol.java
│ │ │ └── package-info.java
│ │ └── util/
│ │ ├── ByteArrayComparator.java
│ │ ├── CompareCondition.java
│ │ ├── Delay.java
│ │ ├── DoublePrecision.java
│ │ ├── IOUtils.java
│ │ ├── JedisAsserts.java
│ │ ├── JedisByteHashMap.java
│ │ ├── JedisByteMap.java
│ │ ├── JedisClusterCRC16.java
│ │ ├── JedisClusterHashTag.java
│ │ ├── JedisCommandIterationBase.java
│ │ ├── JedisURIHelper.java
│ │ ├── KeyValue.java
│ │ ├── LazyRawable.java
│ │ ├── Pool.java
│ │ ├── PrefixedKeyArgumentPreProcessor.java
│ │ ├── RedisInputStream.java
│ │ ├── RedisOutputStream.java
│ │ ├── SafeEncoder.java
│ │ └── package-info.java
│ └── resources/
│ └── redis/
│ └── clients/
│ └── jedis/
│ └── pom.properties
└── test/
├── java/
│ ├── io/
│ │ └── redis/
│ │ ├── examples/
│ │ │ ├── BitMapsExample.java
│ │ │ ├── BitfieldExample.java
│ │ │ ├── BloomFilterExample.java
│ │ │ ├── CMSExample.java
│ │ │ ├── CmdsCnxmgmtExample.java
│ │ │ ├── CmdsGenericExample.java
│ │ │ ├── CmdsHashExample.java
│ │ │ ├── CmdsListExample.java
│ │ │ ├── CmdsServerMgmtExample.java
│ │ │ ├── CmdsSetExample.java
│ │ │ ├── CmdsSortedSetExample.java
│ │ │ ├── CmdsStringExample.java
│ │ │ ├── CuckooFilterExample.java
│ │ │ ├── GeoExample.java
│ │ │ ├── GeoIndexExample.java
│ │ │ ├── HashExample.java
│ │ │ ├── HomeJsonExample.java
│ │ │ ├── HomeProbDtsExample.java
│ │ │ ├── HyperLogLogExample.java
│ │ │ ├── JsonExample.java
│ │ │ ├── ListExample.java
│ │ │ ├── PipeTransExample.java
│ │ │ ├── QueryAggExample.java
│ │ │ ├── QueryEmExample.java
│ │ │ ├── QueryFtExample.java
│ │ │ ├── QueryGeoExample.java
│ │ │ ├── QueryRangeExample.java
│ │ │ ├── SearchQuickstartExample.java
│ │ │ ├── SetGetExample.java
│ │ │ ├── SetsExample.java
│ │ │ ├── SortedSetsExample.java
│ │ │ ├── StreamsExample.java
│ │ │ ├── StringExample.java
│ │ │ ├── TDigestExample.java
│ │ │ ├── TimeSeriesTutorialExample.java
│ │ │ ├── TopKExample.java
│ │ │ └── VectorSetExample.java
│ │ └── test/
│ │ ├── annotations/
│ │ │ ├── ConditionalOnEnv.java
│ │ │ ├── EnabledOnCommand.java
│ │ │ └── SinceRedisVersion.java
│ │ └── utils/
│ │ ├── RedisInfo.java
│ │ └── RedisVersion.java
│ └── redis/
│ └── clients/
│ └── jedis/
│ ├── ACLJedisPoolTest.java
│ ├── ACLJedisSentinelPoolTest.java
│ ├── ACLJedisTest.java
│ ├── BuilderTest.java
│ ├── ClusterCommandObjectsTest.java
│ ├── ClusterPipeliningTest.java
│ ├── ConnectionTest.java
│ ├── DefaultJedisClientConfigTest.java
│ ├── EndpointConfig.java
│ ├── Endpoints.java
│ ├── HostAndPortTest.java
│ ├── JedisClusterCommandTest.java
│ ├── JedisClusterInfoCacheTest.java
│ ├── JedisClusterWithoutSetupTest.java
│ ├── JedisPoolTest.java
│ ├── JedisPoolUnitTest.java
│ ├── JedisPubSubBaseTest.java
│ ├── JedisSentinelPoolTest.java
│ ├── JedisSentinelTest.java
│ ├── JedisShardedPubSubBaseTest.java
│ ├── JedisTest.java
│ ├── ManagedConnectionProviderTest.java
│ ├── MigratePipeliningTest.java
│ ├── MultiDbClientTest.java
│ ├── PipeliningTest.java
│ ├── ProtocolTest.java
│ ├── RedisClientTest.java
│ ├── ReliableTransactionTest.java
│ ├── SentineledConnectionProviderTest.java
│ ├── StaticCommandFlagsRegistryTest.java
│ ├── TransactionV2Test.java
│ ├── TupleSortedSetTest.java
│ ├── UdsTest.java
│ ├── UnavailableConnectionTest.java
│ ├── UnboundRedisClusterClientTest.java
│ ├── UnboundRedisClusterClientTestBase.java
│ ├── UnifiedJedisCustomCommandsTest.java
│ ├── authentication/
│ │ ├── EntraIDTestContext.java
│ │ ├── RedisEntraIDClusterIntegrationTests.java
│ │ ├── RedisEntraIDIntegrationTests.java
│ │ ├── RedisEntraIDManagedIdentityIntegrationTests.java
│ │ ├── TokenBasedAuthenticationClusterIntegrationTests.java
│ │ ├── TokenBasedAuthenticationIntegrationTests.java
│ │ └── TokenBasedAuthenticationUnitTests.java
│ ├── benchmark/
│ │ ├── CRC16Benchmark.java
│ │ ├── GetSetBenchmark.java
│ │ ├── PipelinedGetSetBenchmark.java
│ │ ├── PoolBenchmark.java
│ │ ├── ProtocolBenchmark.java
│ │ ├── RedisClientBenchmark.java
│ │ ├── RedisClientCSCBenchmark.java
│ │ └── SafeEncoderBenchmark.java
│ ├── builders/
│ │ ├── ClientBuilderTest.java
│ │ ├── ClusterClientBuilderTest.java
│ │ ├── JedisClusterConstructorReflectionTest.java
│ │ ├── JedisPooledConstructorReflectionTest.java
│ │ ├── JedisSentineledConstructorReflectionTest.java
│ │ ├── RedisClusterClientMigrationIntegrationTest.java
│ │ └── UnifiedJedisConstructorReflectionTest.java
│ ├── codegen/
│ │ ├── CommandFlagsRegistryGenerator.java
│ │ └── README.md
│ ├── collections/
│ │ ├── JedisByteHashMapTest.java
│ │ └── SetFromListTest.java
│ ├── commands/
│ │ ├── CommandsTestsParameters.java
│ │ ├── commandobjects/
│ │ │ ├── CommandObjectsBitmapCommandsTest.java
│ │ │ ├── CommandObjectsBloomFilterCommandsTest.java
│ │ │ ├── CommandObjectsCountMinSketchCommandsTest.java
│ │ │ ├── CommandObjectsCuckooFilterCommandsTest.java
│ │ │ ├── CommandObjectsGenericCommandsTest.java
│ │ │ ├── CommandObjectsGeospatialCommandsTest.java
│ │ │ ├── CommandObjectsHashCommandsTest.java
│ │ │ ├── CommandObjectsHyperloglogCommandsTest.java
│ │ │ ├── CommandObjectsJsonCommandsTest.java
│ │ │ ├── CommandObjectsListCommandsTest.java
│ │ │ ├── CommandObjectsModulesTestBase.java
│ │ │ ├── CommandObjectsScriptingCommandsTest.java
│ │ │ ├── CommandObjectsSearchAndQueryCommandsTest.java
│ │ │ ├── CommandObjectsServerManagementCommandsTest.java
│ │ │ ├── CommandObjectsSetCommandsTest.java
│ │ │ ├── CommandObjectsSortedSetCommandsTest.java
│ │ │ ├── CommandObjectsStandaloneTestBase.java
│ │ │ ├── CommandObjectsStreamCommandsTest.java
│ │ │ ├── CommandObjectsStringCommandsTest.java
│ │ │ ├── CommandObjectsTDigestCommandsTest.java
│ │ │ ├── CommandObjectsTestBase.java
│ │ │ ├── CommandObjectsTimeSeriesCommandsTest.java
│ │ │ ├── CommandObjectsTopkCommandsTest.java
│ │ │ └── Person.java
│ │ ├── jedis/
│ │ │ ├── AccessControlListCommandsTest.java
│ │ │ ├── AllKindOfValuesCommandsTest.java
│ │ │ ├── BinaryValuesCommandsTest.java
│ │ │ ├── BitCommandsTest.java
│ │ │ ├── ClientCommandsTest.java
│ │ │ ├── ClusterBinaryValuesCommandsTest.java
│ │ │ ├── ClusterCommandsTest.java
│ │ │ ├── ClusterHotkeysCommandsTest.java
│ │ │ ├── ClusterJedisCommandsTestBase.java
│ │ │ ├── ClusterScriptingCommandsTest.java
│ │ │ ├── ClusterShardedPublishSubscribeCommandsTest.java
│ │ │ ├── ClusterValuesCommandsTest.java
│ │ │ ├── ControlCommandsTest.java
│ │ │ ├── FailoverCommandsTest.java
│ │ │ ├── GeoCommandsTest.java
│ │ │ ├── HashesCommandsTest.java
│ │ │ ├── HotkeysCommandsTest.java
│ │ │ ├── HyperLogLogCommandsTest.java
│ │ │ ├── JedisCommandsTestBase.java
│ │ │ ├── ListCommandsTest.java
│ │ │ ├── MigrateTest.java
│ │ │ ├── ModuleTest.java
│ │ │ ├── ObjectCommandsTest.java
│ │ │ ├── PublishSubscribeCommandsTest.java
│ │ │ ├── ScriptingCommandsTest.java
│ │ │ ├── SentinelCommandsTest.java
│ │ │ ├── SetCommandsTest.java
│ │ │ ├── SlowlogCommandsTest.java
│ │ │ ├── SortedSetCommandsTest.java
│ │ │ ├── SortingCommandsTest.java
│ │ │ ├── StreamsBinaryCommandsTest.java
│ │ │ ├── StreamsCommandsTest.java
│ │ │ ├── StringValuesCommandsTest.java
│ │ │ ├── TransactionCommandsTest.java
│ │ │ ├── VariadicCommandsTest.java
│ │ │ └── VectorSetCommandsTest.java
│ │ └── unified/
│ │ ├── AllKindOfValuesCommandsTestBase.java
│ │ ├── BinaryValuesCommandsTestBase.java
│ │ ├── BitCommandsTestBase.java
│ │ ├── ExtendedVectorSetCommandsTestBase.java
│ │ ├── FunctionCommandsTestBase.java
│ │ ├── GeoCommandsTestBase.java
│ │ ├── HashesCommandsTestBase.java
│ │ ├── HotkeysCommandsTestBase.java
│ │ ├── HyperLogLogCommandsTestBase.java
│ │ ├── ListCommandsTestBase.java
│ │ ├── SetCommandsTestBase.java
│ │ ├── SortedSetCommandsTestBase.java
│ │ ├── StreamsBinaryCommandsTestBase.java
│ │ ├── StreamsCommandsTestBase.java
│ │ ├── StringValuesCommandsTestBase.java
│ │ ├── UnifiedJedisCommandsTestBase.java
│ │ ├── VectorSetCommandsTestBase.java
│ │ ├── client/
│ │ │ ├── RedisClientAllKindOfValuesCommandsTest.java
│ │ │ ├── RedisClientBinaryValuesCommandsTest.java
│ │ │ ├── RedisClientBitCommandsTest.java
│ │ │ ├── RedisClientCommandsTestHelper.java
│ │ │ ├── RedisClientExtendedVectorSetCommandsTest.java
│ │ │ ├── RedisClientGeoCommandsTest.java
│ │ │ ├── RedisClientHashesCommandsTest.java
│ │ │ ├── RedisClientHotkeysCommandsTest.java
│ │ │ ├── RedisClientHyperLogLogCommandsTest.java
│ │ │ ├── RedisClientListCommandsTest.java
│ │ │ ├── RedisClientMiscellaneousTest.java
│ │ │ ├── RedisClientSetCommandsTest.java
│ │ │ ├── RedisClientSortedSetCommandsTest.java
│ │ │ ├── RedisClientStreamsBinaryCommandsTest.java
│ │ │ ├── RedisClientStreamsCommandsTest.java
│ │ │ ├── RedisClientStringValuesCommandsTest.java
│ │ │ ├── RedisClientTransactionIT.java
│ │ │ ├── RedisClientVectorSetCommandsTest.java
│ │ │ └── search/
│ │ │ └── FTHybridRedisClientCommandsTest.java
│ │ ├── cluster/
│ │ │ ├── ClusterAllKindOfValuesCommandsTest.java
│ │ │ ├── ClusterBinaryValuesCommandsTest.java
│ │ │ ├── ClusterBitCommandsTest.java
│ │ │ ├── ClusterCommandsTestHelper.java
│ │ │ ├── ClusterExtendedVectorSetCommandsTest.java
│ │ │ ├── ClusterFunctionCommandsTest.java
│ │ │ ├── ClusterGeoCommandsTest.java
│ │ │ ├── ClusterHashesCommandsTest.java
│ │ │ ├── ClusterHotkeysCommandsTest.java
│ │ │ ├── ClusterHyperLogLogCommandsTest.java
│ │ │ ├── ClusterListCommandsTest.java
│ │ │ ├── ClusterSetCommandsTest.java
│ │ │ ├── ClusterSortedSetCommandsTest.java
│ │ │ ├── ClusterStreamsBinaryCommandsTest.java
│ │ │ ├── ClusterStreamsCommandsTest.java
│ │ │ ├── ClusterStringValuesCommandsTest.java
│ │ │ ├── ClusterVectorSetCommandsTest.java
│ │ │ └── search/
│ │ │ └── FTHybridCommandsClusterTest.java
│ │ ├── pipeline/
│ │ │ ├── BinaryStreamsPipelineCommandsTest.java
│ │ │ ├── GeoPipelineCommandsTest.java
│ │ │ ├── HashesPipelineCommandsTest.java
│ │ │ ├── ListPipelineCommandsTest.java
│ │ │ ├── PipelineCommandsTestBase.java
│ │ │ ├── SetPipelineCommandsTest.java
│ │ │ ├── SortedSetPipelineCommandsTest.java
│ │ │ └── StreamsPipelineCommandsTest.java
│ │ ├── search/
│ │ │ └── FTHybridCommandsTestBase.java
│ │ └── sentinel/
│ │ └── SentinelAllKindOfValuesCommandsIT.java
│ ├── csc/
│ │ ├── AllowAndDenyListCacheableTest.java
│ │ ├── ClientSideCacheFunctionalityTest.java
│ │ ├── ClientSideCacheTestBase.java
│ │ ├── RedisClientSideCacheTest.java
│ │ ├── RedisClientSideCacheTestBase.java
│ │ ├── RedisClusterClientSideCacheTest.java
│ │ ├── RedisSentinelClientSideCacheTest.java
│ │ ├── SSLRedisClientSideCacheTest.java
│ │ ├── TestCache.java
│ │ ├── UnifiedJedisClientSideCacheTestBase.java
│ │ └── VersionTest.java
│ ├── examples/
│ │ ├── BroadcastCommandsToAllClusterNodes.java
│ │ ├── GeoShapeFieldsUsageInRediSearch.java
│ │ ├── RedisCredentialsProviderUsage.java
│ │ └── RetryableCommandExecution.java
│ ├── exceptions/
│ │ ├── ExceptionsTest.java
│ │ └── FailoverAbortedException.java
│ ├── executors/
│ │ ├── ClusterCommandExecutorTest.java
│ │ ├── RetryableCommandExecutorTest.java
│ │ └── aggregators/
│ │ ├── ClusterReplyAggregatorTest.java
│ │ └── MultiNodeResultAggregatorTest.java
│ ├── failover/
│ │ └── FailoverIntegrationTest.java
│ ├── mcf/
│ │ ├── ActiveActiveLocalFailoverTest.java
│ │ ├── ConnectionInitializationContextTest.java
│ │ ├── DatabaseEvaluateThresholdsTest.java
│ │ ├── DefaultValuesTest.java
│ │ ├── FailbackMechanismIntegrationTest.java
│ │ ├── FailbackMechanismUnitTest.java
│ │ ├── HealthCheckIntegrationTest.java
│ │ ├── HealthCheckTest.java
│ │ ├── InitializationPolicyTest.java
│ │ ├── LagAwareStrategyUnitTest.java
│ │ ├── MultiDbCircuitBreakerThresholdsTest.java
│ │ ├── MultiDbConnectionProviderDynamicEndpointUnitTest.java
│ │ ├── MultiDbConnectionProviderFailoverAttemptsConfigTest.java
│ │ ├── MultiDbConnectionProviderHelper.java
│ │ ├── MultiDbConnectionProviderInitializationTest.java
│ │ ├── MultiDbConnectionProviderTest.java
│ │ ├── PeriodicFailbackTest.java
│ │ ├── PingStrategyIntegrationTest.java
│ │ ├── RedisRestAPIIT.java
│ │ ├── RedisRestAPIUnitTest.java
│ │ ├── StatusTrackerTest.java
│ │ └── TestHealthCheckStrategy.java
│ ├── misc/
│ │ ├── AutomaticFailoverTest.java
│ │ ├── ClientSetInfoConfigTest.java
│ │ ├── ClusterInitErrorTest.java
│ │ ├── ResponsesToStringTest.java
│ │ └── TupleTest.java
│ ├── mocked/
│ │ ├── MockedCommandObjectsTestBase.java
│ │ ├── pipeline/
│ │ │ ├── PipeliningBaseBitmapCommandsTest.java
│ │ │ ├── PipeliningBaseBloomFilterCommandsTest.java
│ │ │ ├── PipeliningBaseCountMinSketchCommandsTest.java
│ │ │ ├── PipeliningBaseCuckooFilterCommandsTest.java
│ │ │ ├── PipeliningBaseGenericCommandsTest.java
│ │ │ ├── PipeliningBaseGeospatialCommandsTest.java
│ │ │ ├── PipeliningBaseHashCommandsTest.java
│ │ │ ├── PipeliningBaseHyperloglogCommandsTest.java
│ │ │ ├── PipeliningBaseJsonCommandsTest.java
│ │ │ ├── PipeliningBaseListCommandsTest.java
│ │ │ ├── PipeliningBaseMiscellaneousTest.java
│ │ │ ├── PipeliningBaseMockedTestBase.java
│ │ │ ├── PipeliningBaseScriptingAndFunctionsCommandsTest.java
│ │ │ ├── PipeliningBaseSearchAndQueryCommandsTest.java
│ │ │ ├── PipeliningBaseServerManagementCommandsTest.java
│ │ │ ├── PipeliningBaseSetCommandsTest.java
│ │ │ ├── PipeliningBaseSortedSetCommandsTest.java
│ │ │ ├── PipeliningBaseStreamCommandsTest.java
│ │ │ ├── PipeliningBaseStringCommandsTest.java
│ │ │ ├── PipeliningBaseTDigestCommandsTest.java
│ │ │ ├── PipeliningBaseTimeSeriesCommandsTest.java
│ │ │ └── PipeliningBaseTopKCommandsTest.java
│ │ └── unified/
│ │ ├── UnifiedJedisBitmapCommandsTest.java
│ │ ├── UnifiedJedisBloomFilterCommandsTest.java
│ │ ├── UnifiedJedisConnectionManagementCommandsTest.java
│ │ ├── UnifiedJedisCountMinSketchCommandsTest.java
│ │ ├── UnifiedJedisCuckooFilterCommandsTest.java
│ │ ├── UnifiedJedisGenericCommandsTest.java
│ │ ├── UnifiedJedisGeospatialCommandsTest.java
│ │ ├── UnifiedJedisHashCommandsTest.java
│ │ ├── UnifiedJedisHyperloglogCommandsTest.java
│ │ ├── UnifiedJedisJsonCommandsTest.java
│ │ ├── UnifiedJedisListCommandsTest.java
│ │ ├── UnifiedJedisMockedTestBase.java
│ │ ├── UnifiedJedisPubSubCommandsTest.java
│ │ ├── UnifiedJedisScriptingAndFunctionsCommandsTest.java
│ │ ├── UnifiedJedisSearchAndQueryCommandsTest.java
│ │ ├── UnifiedJedisServerManagementCommandsTest.java
│ │ ├── UnifiedJedisSetCommandsTest.java
│ │ ├── UnifiedJedisSortedSetCommandsTest.java
│ │ ├── UnifiedJedisStreamCommandsTest.java
│ │ ├── UnifiedJedisStringCommandsTest.java
│ │ ├── UnifiedJedisTDigestCommandsTest.java
│ │ ├── UnifiedJedisTimeSeriesCommandsTest.java
│ │ └── UnifiedJedisTopKCommandsTest.java
│ ├── modules/
│ │ ├── ConsolidatedAccessControlListCommandsTest.java
│ │ ├── ConsolidatedConfigurationCommandsTest.java
│ │ ├── RedisModuleCommandsTestBase.java
│ │ ├── RedisModulesPipelineTest.java
│ │ ├── bloom/
│ │ │ ├── BloomTest.java
│ │ │ ├── CMSTest.java
│ │ │ ├── CuckooTest.java
│ │ │ ├── TDigestTest.java
│ │ │ └── TopKTest.java
│ │ ├── json/
│ │ │ ├── JsonObjects.java
│ │ │ ├── Path2Test.java
│ │ │ ├── PathTest.java
│ │ │ ├── RedisJsonV1Test.java
│ │ │ └── RedisJsonV2Test.java
│ │ ├── search/
│ │ │ ├── AggregationBuilderTest.java
│ │ │ ├── AggregationTest.java
│ │ │ ├── CreateTest.java
│ │ │ ├── DocumentTest.java
│ │ │ ├── JsonSearchTest.java
│ │ │ ├── JsonSearchWithGsonTest.java
│ │ │ ├── QueryBuilderTest.java
│ │ │ ├── QueryTest.java
│ │ │ ├── SchemaTest.java
│ │ │ ├── SearchDefaultDialectTest.java
│ │ │ ├── SearchTest.java
│ │ │ ├── SearchWithParamsTest.java
│ │ │ ├── SpellCheckTest.java
│ │ │ ├── SuggestionTest.java
│ │ │ └── UtilTest.java
│ │ └── timeseries/
│ │ └── TimeSeriesTest.java
│ ├── params/
│ │ ├── BitPosParamsTest.java
│ │ ├── ClientKillParamsTest.java
│ │ ├── CommandListFilterByParamsTest.java
│ │ ├── FailoverParamsTest.java
│ │ ├── GeoAddParamsTest.java
│ │ ├── GetExParamsTest.java
│ │ ├── HotkeysParamsTest.java
│ │ ├── LCSParamsTest.java
│ │ ├── LPosParamsTest.java
│ │ ├── LolwutParamsTest.java
│ │ ├── MigrateParamsTest.java
│ │ ├── ModuleLoadExParamsTest.java
│ │ ├── RestoreParamsTest.java
│ │ ├── ScanParamsTest.java
│ │ ├── SetParamsTest.java
│ │ ├── ShutdownParamsTest.java
│ │ ├── SortingParamsTest.java
│ │ ├── XAddParamsTest.java
│ │ ├── XAutoClaimParamsTest.java
│ │ ├── XCfgSetParamsTest.java
│ │ ├── XClaimParamsTest.java
│ │ ├── XPendingParamsTest.java
│ │ ├── XReadGroupParamsTest.java
│ │ ├── XReadParamsTest.java
│ │ ├── XTrimParamsTest.java
│ │ ├── ZAddParamsTest.java
│ │ ├── ZIncrByParamsTest.java
│ │ ├── ZParamsTest.java
│ │ └── ZRangeParamsTest.java
│ ├── prefix/
│ │ ├── JedisPooledPrefixedKeysTest.java
│ │ ├── PrefixedKeysTest.java
│ │ ├── RedisClusterPrefixedKeysTest.java
│ │ └── RedisSentinelClientPrefixedKeysTest.java
│ ├── providers/
│ │ ├── HealthStatusManagerTest.java
│ │ ├── MultiClusterPooledConnectionProviderTest.java
│ │ ├── MultiDbProviderHealthStatusChangeTest.java
│ │ └── SentineledConnectionProviderReconnectionTest.java
│ ├── resps/
│ │ ├── LibraryInfoTest.java
│ │ └── StreamEntryDeletionResultTest.java
│ ├── scenario/
│ │ ├── ActiveActiveFailoverIT.java
│ │ ├── ClusterTopologyRefreshIT.java
│ │ ├── ConnectionInterruptionIT.java
│ │ ├── FakeApp.java
│ │ ├── FaultInjectionClient.java
│ │ ├── LagAwareStrategySslIT.java
│ │ ├── MultiThreadedFakeApp.java
│ │ ├── RecommendedSettings.java
│ │ └── RestEndpointUtil.java
│ ├── search/
│ │ └── hybrid/
│ │ └── FTHybridPostProcessingParamsTest.java
│ ├── tls/
│ │ ├── ACLJedisIT.java
│ │ ├── ACLRedisClientIT.java
│ │ ├── ACLRedisSentinelClientIT.java
│ │ ├── ClientAuthIT.java
│ │ ├── ClientAuthJedisIT.java
│ │ ├── ClientAuthRedisClientIT.java
│ │ ├── ClientAuthRedisClusterClientIT.java
│ │ ├── ClientAuthTestBase.java
│ │ ├── JedisIT.java
│ │ ├── JedisSentinelPoolIT.java
│ │ ├── JedisTlsTestBase.java
│ │ ├── RedisClientIT.java
│ │ ├── RedisClientTlsTestBase.java
│ │ ├── RedisClusterClientIT.java
│ │ ├── RedisClusterTestBase.java
│ │ ├── RedisSentinelClientIT.java
│ │ ├── RedisSentinelTlsTestBase.java
│ │ ├── SSLOptionsJedisIT.java
│ │ ├── SSLOptionsJedisSentinelPoolIT.java
│ │ ├── SSLOptionsRedisClientIT.java
│ │ └── SSLOptionsRedisSentinelClientIT.java
│ └── util/
│ ├── ACLTestUtil.java
│ ├── AssertUtil.java
│ ├── ByteArrayComparatorTest.java
│ ├── ByteArrayMapMatcher.java
│ ├── ByteArrayUtil.java
│ ├── ClientKillerUtil.java
│ ├── ClientTestUtil.java
│ ├── CommandArgumentsMatchers.java
│ ├── DelayTest.java
│ ├── EnabledOnCommandCondition.java
│ ├── EnvCondition.java
│ ├── FragmentedByteArrayInputStream.java
│ ├── GeoCoordinateMatcher.java
│ ├── GeoRadiusResponseMatcher.java
│ ├── JedisByteMapMatcher.java
│ ├── JedisClusterCRC16Test.java
│ ├── JedisClusterTestUtil.java
│ ├── JedisSentinelTestUtil.java
│ ├── JedisURIHelperTest.java
│ ├── JsonObjectMapperTestUtil.java
│ ├── ProtocolTestUtil.java
│ ├── RedisConditions.java
│ ├── RedisVersionCondition.java
│ ├── RedisVersionUtil.java
│ ├── ReflectionTestUtil.java
│ ├── StreamEntryBinaryListMatcher.java
│ ├── TestDataUtil.java
│ ├── TestEnvUtil.java
│ ├── TlsUtil.java
│ └── VectorTestUtils.java
└── resources/
├── cert.pem
├── endpoints.json
├── endpoints_source.json
├── env/
│ ├── cluster-unbound/
│ │ └── config/
│ │ ├── node-7379-8379/
│ │ │ └── redis.conf
│ │ ├── node-7380-8380/
│ │ │ └── redis.conf
│ │ ├── node-7381-8381/
│ │ │ └── redis.conf
│ │ ├── node-7382-8382/
│ │ │ └── redis.conf
│ │ └── node-7383-8383/
│ │ └── redis.conf
│ ├── config/
│ │ └── redis6-7/
│ │ └── node-sentinel-26381-36381/
│ │ └── redis.conf
│ ├── docker-compose.yml
│ ├── redis-uds/
│ │ └── config/
│ │ └── node-0/
│ │ └── redis.conf
│ ├── redis1-2-5-8-sentinel/
│ │ └── config/
│ │ ├── node-6379-6390/
│ │ │ └── redis.conf
│ │ ├── node-6380/
│ │ │ └── redis.conf
│ │ ├── node-6383-6391/
│ │ │ └── redis.conf
│ │ ├── node-6386/
│ │ │ └── redis.conf
│ │ └── node-sentinel-26379-36379/
│ │ └── redis.conf
│ ├── redis9-10/
│ │ └── config/
│ │ ├── node-6388/
│ │ │ └── redis.conf
│ │ └── node-6389/
│ │ └── redis.conf
│ ├── sentinel-standalone2-failover/
│ │ └── config/
│ │ ├── node-6384/
│ │ │ └── redis.conf
│ │ ├── node-6385/
│ │ │ └── redis.conf
│ │ └── node-sentinel-26381-36381/
│ │ └── redis.conf
│ └── standalone2-sentinel/
│ └── config/
│ ├── node-6381-16381/
│ │ └── redis.conf
│ ├── node-6382-16382/
│ │ └── redis.conf
│ ├── node-sentinel-26380-36380/
│ │ └── redis.conf
│ └── node-sentinel-26382-36382/
│ └── redis.conf
├── functions/
│ ├── keyspaceTriggers.js
│ ├── pingpong.js
│ ├── streamTriggers.js
│ ├── withConfig.js
│ ├── withFlags.js
│ └── workingWIthHashes.js
├── junit-platform.properties
├── logback-test.xml
├── redismodule.h
└── testmodule.c
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CONTRIBUTING.md
================================================
# How to use Jedis Github Issue
* Github issues SHOULD BE USED to report bugs and for DETAILED feature requests. Everything else belongs in the [Jedis Google Group](https://groups.google.com/g/jedis_redis) or [Jedis Github Discussions](https://github.com/redis/jedis/discussions).
Please post general questions to Google Groups or Github discussions. These can be closed without response when posted to Github issues.
# How to contribute by Pull Request
1. Fork Jedis repo on github ([how to fork a repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo))
2. Create a topic branch (`git checkout -b my_branch`)
3. Push to your remote branch (`git push origin my_branch`)
4. Create a pull request on github ([how to create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request))
Create a branch with meaningful name, and do not modify the master branch directly.
Please add unit tests to validate your changes work, then ensure your changes pass all unit tests.
# Jedis Test Environment
Jedis uses a Docker-based test environment as the primary method for running tests. A simplified local environment is also available for basic testing.
Jedis integration tests use many Redis instances, so we use a `Makefile` to prepare the environment.
## Quick Start (Docker - Recommended)
Start tests with `make test`. This will:
1. Start the Docker-based test environment
2. Run all tests
3. Stop and clean up the environment
Set up test environments with `make start`, tear down those environments with `make stop`.
# Jedis Test Environment Using Docker
This guide explains how to bootstrap and manage a test environment for Jedis using Docker Compose.
## Workflow Steps
1. **Start the test environment** by running `make start` (examples below).
2. **Run tests** through your IDE, Maven, or other testing tools as needed.
3. **Stop the test environment** by running `make stop`.
- This will stop and tear down the Docker containers running the Redis service.
# Start the Test Environment Using Docker
You can bootstrap the test environment for supported versions of Redis using the provided `make` targets.
## Option 1: Using `make` Targets
To bring up the test environment for a specific Redis version use the following command:
```bash
make start version=8.0 # Replace with desired version
```
To stop test environment:
```bash
make stop
```
To run tests using the Docker environment:
```bash
make test
```
## Option 2: Using docker compose commands directly
Docker compose file can be found in `src/test/resources/env` folder.
- **Redis 8.4 (or other versions without custom env file)**
```bash
rm -rf /tmp/redis-env-work
export REDIS_VERSION=8.4
docker compose --env-file .env -f src/test/resources/env/docker-compose.yml up
```
- **Redis 7.4, 7.2, 6.2 (versions with custom env files)**
```bash
rm -rf /tmp/redis-env-work
export REDIS_VERSION=6.2
docker compose --env-file .env --env-file .env.v6.2 -f src/test/resources/env/docker-compose.yml up
```
# Local Test Environment (Simplified)
For basic testing with a minimal local Redis setup (requires Redis to be installed locally):
```bash
make start-local # Start local Redis instances (standalone + Unix socket)
make test-local # Run tests against local environment
make stop-local # Stop local Redis instances
```
**Note:** The local environment provides only the `standalone-0` endpoint and a Unix socket instance. For full test coverage, use the Docker-based environment.
# Some rules of Jedis source code
## Code Convention
* Jedis uses HBase Formatter introduced by [HBASE-5961](https://issues.apache.org/jira/browse/HBASE-5961)
* You can import code style file (located to hbase-formatter.xml) to Eclipse, IntelliJ
* line break by column count seems not working with IntelliJ
* You can run ```make format``` anytime to reformat without IDEs
* DO NOT format the source codes within `io.redis.examples` test package.
* A test class name MUST NOT end with `Example`.
## Adding commands
* Jedis uses many interfaces to structure commands
* planned to write documentation about it, contribution is more welcome!
* We need to add commands to all interfaces which have responsibility to expose
* ex) We need to add ping() command to BasicCommands, and provide implementation to all of classes which implemented BasicCommands
## type <-> byte array conversion
* string <-> byte array : use SafeEncoder.encode()
* Caution: use String.toBytes() directly will break GBK support!
* boolean, int, long, double -> byte array : use Protocol.toByteArray()
Thanks!
================================================
FILE: .github/ISSUE_TEMPLATE
================================================
### Expected behavior
Write here what you're expecting ...
### Actual behavior
Write here what happens instead ...
### Steps to reproduce:
Please create a reproducible case of your problem. Make sure
that case repeats consistently and it's not random
1.
2.
3.
### Redis / Jedis Configuration
#### Jedis version:
#### Redis version:
#### Java version:
================================================
FILE: .github/actions/run-tests/action.yml
================================================
# Note: this action is used as a part of redis oss release and test automation in
# redis-developer/redis-oss-release-automation repo
name: 'Run Jedis Tests'
description: 'Run Jedis tests in a containerized environment'
inputs:
redis_version:
description: 'Redis version to test against'
required: false
client_libs_test_image_tag:
description: 'Custom client libs test image tag to use instead of redis_version'
required: false
default: ''
client_libs_test_image:
description: 'Custom client libs test image name to use'
required: false
default: ''
java_version:
description: 'Java version to use'
required: false
default: '8'
java_distribution:
description: 'Java distribution to use'
required: false
default: 'temurin'
specific_test:
description: 'Run specific test(s) (optional)'
required: false
default: ''
codecov_token:
description: 'Codecov token for uploading coverage'
required: false
default: ''
# repository and ref are reqired for correct checkout when using action
# externally (e.g.: in redis-developer/redis-oss-release-automation)
repository:
description: 'Git repository to checkout'
required: false
default: ''
ref:
description: 'Git ref to checkout'
required: false
default: ''
redis_env_work_dir:
description: 'Redis env work directory'
required: false
default: ''
redis_env_conf_dir:
description: 'Redis env conf directory'
required: false
default: ''
runs:
using: 'composite'
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
repository: ${{ inputs.repository }}
ref: ${{ inputs.ref }}
- name: Validate inputs and prepare environment
shell: bash
id: args
env:
REDIS_VERSION: ${{ inputs.redis_version }}
CLIENT_LIBS_TEST_IMAGE: ${{ inputs.client_libs_test_image }}
CLIENT_LIBS_TEST_IMAGE_TAG: ${{ inputs.client_libs_test_image_tag }}
REDIS_ENV_WORK_DIR: ${{ inputs.redis_env_work_dir }}
REDIS_ENV_CONF_DIR: ${{ inputs.redis_env_conf_dir }}
REDIS_VERSION_LABEL: ${{ inputs.client_libs_test_image_tag || inputs.redis_version }}
run: |
make_args=()
if [ -n "$CLIENT_LIBS_TEST_IMAGE" ]; then
make_args+=(CLIENT_LIBS_TEST_IMAGE="$CLIENT_LIBS_TEST_IMAGE")
fi
if [ -n "$CLIENT_LIBS_TEST_IMAGE_TAG" ]; then
make_args+=(CLIENT_LIBS_TEST_IMAGE_TAG="$CLIENT_LIBS_TEST_IMAGE_TAG")
elif [ -n "$REDIS_VERSION" ]; then
make_args+=(version="$REDIS_VERSION")
else
echo "Error: redis_version or client_libs_test_image_tag input is required"
exit 1
fi
echo "make_args=${make_args[*]}" | tee -a ${GITHUB_OUTPUT}
# either custom docker tag name or actual redis version
echo "redis_version_label=$REDIS_VERSION_LABEL" | tee -a ${GITHUB_OUTPUT}
if [ -z "$REDIS_ENV_CONF_DIR" ]; then
REDIS_ENV_CONF_DIR=$(readlink -f "${{ github.action_path }}/../../../src/test/resources/env")
fi
echo "redis_env_conf_dir=$REDIS_ENV_CONF_DIR" | tee -a ${GITHUB_OUTPUT}
if [ -n "$REDIS_ENV_WORK_DIR" ]; then
echo "redis_env_work_dir=$REDIS_ENV_WORK_DIR" | tee -a ${GITHUB_OUTPUT}
else
REDIS_ENV_WORK_DIR=$(mktemp -du)
echo "redis_env_work_dir=$REDIS_ENV_WORK_DIR" | tee -a ${GITHUB_OUTPUT}
fi
- name: Set up Java
uses: actions/setup-java@v4
with:
java-version: ${{ inputs.java_version }}
distribution: ${{ inputs.java_distribution }}
- name: System setup
shell: bash
run: |
sudo apt update
sudo apt install -y make
make compile-module
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.m2/repository
/var/cache/apt
key: jedis-${{hashFiles('**/pom.xml')}}
- name: Set up Docker Compose environment
shell: bash
run: |
mkdir -m 777 $REDIS_ENV_WORK_DIR
make start ${{ steps.args.outputs.make_args }}
env:
REDIS_ENV_CONF_DIR: ${{ steps.args.outputs.redis_env_conf_dir }}
REDIS_ENV_WORK_DIR: ${{ steps.args.outputs.redis_env_work_dir }}
- name: Maven offline
shell: bash
run: |
mvn -q dependency:go-offline
- name: Build docs
shell: bash
run: |
mvn javadoc:jar
- name: Run Maven tests
shell: bash
run: |
export TEST_ENV_PROVIDER=oss-docker
export TEST_WORK_FOLDER=$REDIS_ENV_WORK_DIR
echo $TEST_WORK_FOLDER
if [ -z "$TESTS" ]; then
mvn -B -Dwith-param-names=true clean compile verify
else
mvn -B -Dwith-param-names=true -Dtest=$TESTS clean verify
fi
env:
REDIS_ENV_WORK_DIR: ${{ steps.args.outputs.redis_env_work_dir }}
JVM_OPTS: "-XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=${{ runner.temp }}/heapdump-${{ steps.args.outputs.redis_version_label }}.hprof"
TESTS: ${{ inputs.specific_test }}
- name: Upload Heap Dumps
if: failure()
uses: actions/upload-artifact@v4
with:
name: heap-dumps-${{ steps.args.outputs.redis_version_label }}
path: ${{ runner.temp }}/heapdump-${{ steps.args.outputs.redis_version_label }}.hprof
retention-days: 5
- name: Upload Surefire Dump File
uses: actions/upload-artifact@v4
with:
name: surefire-dumpstream
path: target/surefire-reports/*.dumpstream
- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
if: github.actor != 'dependabot[bot]'
with:
files: |
target/surefire-reports/**/*.xml
target/failsafe-reports/**/*.xml
- name: Collect logs on failure
if: failure()
shell: bash
run: |
echo "Collecting logs from $REDIS_ENV_WORK_DIR..."
ls -la $REDIS_ENV_WORK_DIR
env:
REDIS_ENV_WORK_DIR: ${{ steps.args.outputs.redis_env_work_dir }}
- name: Upload logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: redis-env-work-logs-${{ steps.args.outputs.redis_version_label }}
path: ${{ steps.args.outputs.redis_env_work_dir }}
- name: Tear down Docker Compose environment
if: always()
shell: bash
run: |
make stop
continue-on-error: true
- name: Upload merged coverage to Codecov
if: inputs.codecov_token != ''
uses: codecov/codecov-action@v5
with:
files: ./target/site/jacoco/jacoco.xml
flags: docker-${{ steps.args.outputs.redis_version_label }}
name: merged-coverage
fail_ci_if_error: false
token: ${{ inputs.codecov_token }}
- name: Upload test results to Codecov (unit + IT)
if: inputs.codecov_token != '' && !cancelled() && (github.event_name == 'schedule' || github.event_name == 'push' || github.event_name == 'workflow_dispatch')
uses: codecov/test-results-action@v1
with:
fail_ci_if_error: false
files: ./target/surefire-reports/TEST*,./target/failsafe-reports/TEST*
flags: test-results-docker-${{ steps.args.outputs.redis_version_label }}
token: ${{ inputs.codecov_token }}
================================================
FILE: .github/codecov.yml
================================================
codecov: # see https://docs.codecov.com/docs/codecovyml-reference
branch: master
coverage:
status: # see https://docs.codecov.com/docs/commit-status
project:
default:
target: auto # minimum coverage ratio that the commit must meet to be considered a success
threshold: 5 # Allow the coverage to drop by %, and posting a success status
branches:
- master
- '[0-9].*'
comment: # see https://docs.codecov.com/docs/pull-request-comments
layout: "condensed_header, condensed_files, condensed_footer"
behavior: new
require_changes: true
ignore:
- "**/*.txt"
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "maven"
directory: "/"
schedule:
interval: "weekly"
================================================
FILE: .github/release-drafter-config.yml
================================================
name-template: '$NEXT_MINOR_VERSION'
tag-template: 'v$NEXT_MINOR_VERSION'
filter-by-commitish: true
commitish: master
autolabeler:
- label: 'maintenance'
files:
- '*.md'
- '.github/*'
- label: 'bug'
branch:
- '/bug-.+'
- label: 'maintenance'
branch:
- '/maintenance-.+'
- label: 'feature'
branch:
- '/feature-.+'
categories:
- title: '🔥 Breaking Changes'
labels:
- 'breakingchange'
- title: '🧪 Experimental Features'
labels:
- 'experimental'
- title: '🚀 New Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'fix'
- 'bugfix'
- 'bug'
- 'BUG'
- title: '🧰 Maintenance'
labels:
- 'maintenance'
- 'dependencies'
- 'documentation'
- 'docs'
- 'testing'
change-template: '- $TITLE (#$NUMBER)'
exclude-labels:
- 'skip-changelog'
template: |
# Changes
$CHANGES
## Contributors
We'd like to thank all the contributors who worked on this release!
$CONTRIBUTORS
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"
on:
workflow_dispatch:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '31 4 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: java
dependency-caching: true
build-mode: manual
- name: Set up JDK 8
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '8'
cache: maven
- name: Build
run: mvn -B package
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
================================================
FILE: .github/workflows/docs.yml
================================================
name: Publish Docs
on:
push:
branches: ["master"]
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build-and-deploy:
concurrency: ci-${{ github.ref }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.13
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r docs/requirements.txt
- name: Build docs
run: |
mkdocs build -d docsbuild
- name: Setup Pages
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: 'docsbuild'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
================================================
FILE: .github/workflows/doctests.yml
================================================
name: Documentation Tests
on:
push:
branches:
- master
- 'emb-examples'
pull_request:
workflow_dispatch:
jobs:
doctests:
runs-on: ubuntu-latest
services:
redis:
image: redis:latest
options: >-
--health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
ports:
- 6379:6379
steps:
- uses: actions/checkout@v4
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.m2/repository
/var/cache/apt
key: jedis-${{hashFiles('**/pom.xml')}}
- name: Set up Java
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name: Maven offline
run: |
mvn -q dependency:go-offline
- name: Run doctests
run: |
mvn -Pdoctests clean compile test
================================================
FILE: .github/workflows/format_check.yml
================================================
name: Java Format Check
on:
workflow_dispatch:
pull_request:
paths:
- '**/*.java' # Only trigger for Java file changes
jobs:
check-format:
runs-on: ubuntu-latest
steps:
# Step 1: Checkout the PR code
- name: Checkout code
uses: actions/checkout@v3
# Step 2: Set up Java (if needed for format check tools)
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
# Step 3: Fetch latest changes
- name: Fetch latest changes
run: git fetch origin
- name: Get changed Java files
id: changed_files
run: |
echo "::group::Changed Java Files"
echo Base Branch: ${{ github.event.pull_request.base.ref }}
CHANGED_FILES=$(git diff --name-only --diff-filter=A origin/${{ github.event.pull_request.base.ref }} | grep '\.java$' || true)
echo "$CHANGED_FILES"
echo "::endgroup::"
# Write the multiline content to a file
echo "$CHANGED_FILES" > changed_files.txt
# Step 4: Get a list of changed Java files in the PR
- name: Check Java file format
run: |
# Check if the changed_files.txt exists
if [ ! -f changed_files.txt ]; then
echo "No changed files found."
exit 0
fi
# Read the multiline content from the file
CHANGED_FILES=$(cat changed_files.txt)
# Ensure there are changed files
if [ -z "$CHANGED_FILES" ]; then
echo "No Java files changed."
else
echo "Processing the following changed Java files:"
# Iterate over the CHANGED_FILES variable, assuming files are separated by newlines
while IFS= read -r FILE; do
# Skip empty lines if any
if [ -n "$FILE" ]; then
FILE_NAME=$(basename "$FILE")
echo "Checking for $FILE_NAME"
# Run your formatter validation for each file
mvn formatter:validate -f formatter-pom.xml "-Dformatter.includes=**/$FILE_NAME"
fi
done <<< "$CHANGED_FILES"
fi
================================================
FILE: .github/workflows/integration.yml
================================================
---
name: Build and Test using local environment
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
- '**/*.rst'
branches:
- master
- '[0-9].*'
- 'topic/**'
pull_request:
branches:
- master
- '[0-9].*'
schedule:
- cron: '0 1 * * *' # nightly build
workflow_dispatch:
jobs:
build:
name: Build and Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up publishing to maven central
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
- name: System setup
run: |
sudo apt update
sudo apt install -y make
make system-setup
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.m2/repository
/var/cache/apt
key: jedis-${{hashFiles('**/pom.xml')}}
- name: Maven offline
run: |
mvn -q dependency:go-offline
- name: Build docs
run: |
mvn javadoc:jar
- name: Run tests
run: |
export TEST_ENV_PROVIDER=oss-local
make test-local
env:
JVM_OPTS: -Xmx3200m
TERM: dumb
================================================
FILE: .github/workflows/release-drafter.yml
================================================
name: Release Drafter
on:
push:
# branches to consider in the event; optional, defaults to all
branches:
- master
workflow_dispatch:
jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
# Drafts your next Release notes as Pull Requests are merged into "master"
- uses: release-drafter/release-drafter@v5
with:
# (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml
config-name: release-drafter-config.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/snapshot.yml
================================================
---
name: Publish Snapshot
on:
push:
branches:
- master
- '[0-9].x'
workflow_dispatch:
jobs:
snapshot:
name: Deploy Snapshot
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up publishing to maven central
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
server-id: central
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.m2/repository
/var/cache/apt
key: jedis-${{hashFiles('**/pom.xml')}}
- name: mvn offline
run: |
mvn -q dependency:go-offline
- name: deploy
run: |
mvn --no-transfer-progress \
-DskipTests deploy
env:
MAVEN_USERNAME: ${{secrets.OSSH_USERNAME}}
MAVEN_PASSWORD: ${{secrets.OSSH_TOKEN}}
================================================
FILE: .github/workflows/stale-issues.yml
================================================
name: "Close stale issues"
on:
schedule:
- cron: "0 0 * * *"
permissions: {}
jobs:
stale:
permissions:
issues: write # to close stale issues (actions/stale)
pull-requests: write # to close stale PRs (actions/stale)
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is marked stale. It will be closed in 30 days if it is not updated.'
stale-pr-message: 'This pull request is marked stale. It will be closed in 30 days if it is not updated.'
days-before-stale: 30
days-before-close: 30
stale-issue-label: "stale"
stale-pr-label: "stale"
operations-per-run: 10
remove-stale-when-updated: true
only-labels: 'waiting-for-feedback'
exempt-issue-labels: 'feedback-provided'
exempt-pr-labels: 'feedback-provided'
exempt-all-milestones: true
================================================
FILE: .github/workflows/test-on-docker.yml
================================================
---
name: Build and Test using a containerized environment
run-name: "Build and Test using ${{ github.event.inputs.client_libs_test_image_tag != '' && format('image: {0}', github.event.inputs.client_libs_test_image_tag) || 'a containerized environment' }}"
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
- '**/*.rst'
branches:
- master
- '[0-9].*'
- 'feature/**'
- 'topic/**'
pull_request:
branches:
- master
- '[0-9].*'
- 'feature/**'
schedule:
- cron: '0 1 * * *' # nightly build
workflow_dispatch:
inputs:
specific_test:
description: 'Run specific test(s) (optional)'
required: false
default: ''
client_libs_test_image_tag:
description: 'Custom client libs test image tag to use instead of redis_version'
required: false
default: ''
jobs:
build:
name: Build and Test
if: github.event.inputs.client_libs_test_image_tag == ''
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
redis_version:
- "8.6"
- "8.4"
- "8.2"
- "8.0"
- "7.4"
- "7.2"
# - "6.2"
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: ./.github/actions/run-tests
with:
redis_version: ${{ matrix.redis_version }}
specific_test: ${{ github.event.inputs.specific_test || '' }}
codecov_token: ${{ secrets.CODECOV_TOKEN }}
redis_env_work_dir: ${{ github.workspace }}/redis-env-work
redis_env_conf_dir: ${{ github.workspace }}/src/test/resources/env
build_using_custom_image:
name: Build and Test using custom image
if: github.event.inputs.client_libs_test_image_tag != ''
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: ./.github/actions/run-tests
with:
client_libs_test_image_tag: ${{ github.event.inputs.client_libs_test_image_tag }}
specific_test: ${{ github.event.inputs.specific_test || '' }}
codecov_token: ${{ secrets.CODECOV_TOKEN }}
redis_env_work_dir: ${{ github.workspace }}/redis-env-work
redis_env_conf_dir: ${{ github.workspace }}/src/test/resources/env
================================================
FILE: .github/workflows/version-and-release.yml
================================================
name: Release
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: get version from tag
id: get_version
run: |
realversion="${GITHUB_REF/refs\/tags\//}"
realversion="${realversion//v/}"
echo "VERSION=$realversion" >> $GITHUB_OUTPUT
- name: Set up publishing to maven central
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
server-id: central
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: mvn versions
run: mvn versions:set -DnewVersion=${{ steps.get_version.outputs.VERSION }}
- name: Install gpg key
run: |
cat <(echo -e "${{ secrets.OSSH_GPG_SECRET_KEY }}") | gpg --batch --import
gpg --list-secret-keys --keyid-format LONG
- name: Publish
run: |
mvn --no-transfer-progress \
--batch-mode \
-Dgpg.passphrase='${{ secrets.OSSH_GPG_SECRET_KEY_PASSWORD }}' \
-DskipTests deploy -P release
env:
MAVEN_USERNAME: ${{secrets.OSSH_USERNAME}}
MAVEN_PASSWORD: ${{secrets.OSSH_TOKEN}}
================================================
FILE: .gitignore
================================================
.classpath
*.iml
*.ipr
*.iws
nb*
.project
.settings/
.gradle/
target/
build/
bin/
tags
.idea
.run
*.aof
*.rdb
redis-git
appendonlydir/
.DS_Store
.vscode/settings.json
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2021-2023, Redis, inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Makefile
================================================
PATH := ./redis-git/src:${PATH}
# Supported test env versions
SUPPORTED_TEST_ENV_VERSIONS := 8.6 8.4 8.2 8.0 7.4 7.2 6.2
DEFAULT_TEST_ENV_VERSION := 8.6
REDIS_ENV_WORK_DIR := $(or ${REDIS_ENV_WORK_DIR},/tmp/redis-env-work)
TOXIPROXY_IMAGE := ghcr.io/shopify/toxiproxy:2.8.0
define REDIS1_CONF
daemonize yes
protected-mode no
port 6379
requirepass foobared
user acljedis on allcommands allkeys >fizzbuzz
user deploy on allcommands allkeys >verify
pidfile /tmp/redis1.pid
logfile /tmp/redis1.log
save ""
appendonly no
enable-module-command yes
client-output-buffer-limit pubsub 256k 128k 5
endef
# UDS REDIS NODES
define REDIS_UDS
daemonize yes
protected-mode no
port 0
pidfile /tmp/redis_uds.pid
logfile /tmp/redis_uds.log
unixsocket /tmp/redis_uds.sock
unixsocketperm 777
save ""
appendonly no
endef
# UNAVAILABLE REDIS NODES
define REDIS_UNAVAILABLE_CONF
daemonize yes
protected-mode no
port 6400
pidfile /tmp/redis_unavailable.pid
logfile /tmp/redis_unavailable.log
save ""
appendonly no
endef
export REDIS1_CONF
export REDIS_UDS
export REDIS_UNAVAILABLE_CONF
start-local: cleanup compile-module
# Simple local test env that provides only "standalone-0" endpoint and an instance listening on Unix socket
export TEST_ENV_PROVIDER=oss-source
echo "$$REDIS1_CONF" | redis-server -
echo "$$REDIS_UDS" | redis-server -
echo "$$REDIS_UNAVAILABLE_CONF" | redis-server -
cleanup:
- rm -vf /tmp/redis*.log 2>/dev/null
- rm dump.rdb appendonly.aof - 2>/dev/null
stop-local:
@for pidfile in \
/tmp/redis1.pid \
/tmp/redis_uds.pid; do \
if [ -f $$pidfile ]; then \
pid=$$(cat $$pidfile); \
if kill -0 $$pid 2>/dev/null; then \
echo "Stopping process $$pid from $$pidfile"; \
kill $$pid; \
sleep 1; \
if kill -0 $$pid 2>/dev/null; then \
echo "PID $$pid did not exit, forcing kill"; \
kill -9 $$pid; \
fi; \
fi; \
rm -f $$pidfile; \
fi; \
done
[ -f /tmp/redis_unavailable.pid ] && kill `cat /tmp/redis_unavailable.pid` || true
test-local: | start-local mvn-test-local stop-local
mvn-test-local:
@TEST_ENV_PROVIDER=oss-source mvn -Dwith-param-names=true -Dtest=${TEST} clean verify
mvn-test:
mvn -Dwith-param-names=true -Dtest=${TEST} clean verify
format:
mvn java-formatter:format
system-setup:
# Install gcc with Homebrew (macOS) or apt (Linux)
if [ "$(shell uname)" = "Darwin" ]; then \
brew install gcc || true; \
else \
sudo apt install -y gcc g++; \
fi
[ ! -e redis-git ] && git clone https://github.com/redis/redis.git --branch unstable --single-branch redis-git || true
$(MAKE) -C redis-git clean
$(MAKE) -C redis-git BUILD_TLS=yes
compile-module:
gcc -shared -o /tmp/testmodule.so -fPIC src/test/resources/testmodule.c
# Start test environment with specific version using predefined docker compose setup
start:
@if [ -z "$(version)" ]; then \
version=$(arg); \
if [ -z "$$version" ]; then \
version="$(DEFAULT_TEST_ENV_VERSION)"; \
fi; \
fi; \
if [ -n "$$CLIENT_LIBS_TEST_IMAGE_TAG" ]; then \
echo "Using custom image tag: $$CLIENT_LIBS_TEST_IMAGE_TAG"; \
version=""; \
elif ! echo "$(SUPPORTED_TEST_ENV_VERSIONS)" | grep -qw "$$version"; then \
echo "Error: Invalid version '$$version'. Supported versions are: $(SUPPORTED_TEST_ENV_VERSIONS)."; \
exit 1; \
fi; \
default_env_file="src/test/resources/env/.env"; \
custom_env_file="src/test/resources/env/.env.v$$version"; \
env_files="--env-file $$default_env_file"; \
if [ -f "$$custom_env_file" ]; then \
env_files="$$env_files --env-file $$custom_env_file"; \
fi; \
rm -rf "$(REDIS_ENV_WORK_DIR)"; \
mkdir -p "$(REDIS_ENV_WORK_DIR)"; \
docker compose $$env_files -f src/test/resources/env/docker-compose.yml up -d --wait --quiet-pull; \
echo "Started test environment with Redis version $$version. "
# Stop the test environment
stop:
docker compose -f src/test/resources/env/docker-compose.yml down; \
rm -rf "$(REDIS_ENV_WORK_DIR)"; \
echo "Stopped test environment and performed cleanup."
test: | start mvn-test stop
.PHONY: test test-local start start-local stop stop-local cleanup mvn-test-local mvn-test format system-setup compile-module
================================================
FILE: README.md
================================================
# Jedis
[](https://github.com/redis/jedis/releases/latest)
[](https://central.sonatype.com/artifact/redis.clients/jedis)
[](https://www.javadoc.io/doc/redis.clients/jedis)
[](https://github.com/redis/jedis/blob/master/LICENSE)
[](https://codecov.io/gh/redis/jedis)
[](https://discord.gg/redis)
## What is Jedis?
Jedis is a Java client for [Redis](https://github.com/redis/redis "Redis") designed for performance and ease of use.
Are you looking for a high-level library to handle object mapping? See [redis-om-spring](https://github.com/redis/redis-om-spring)!
## How do I Redis?
[Learn for free at Redis University](https://university.redis.io/academy/)
[Try the Redis Cloud](https://redis.io/try-free/)
[Dive in developer tutorials](https://redis.io/learn/)
[Join the Redis community](https://redis.io/community/)
[Work at Redis](https://redis.io/careers/jobs/)
## Supported Redis versions
The most recent version of this library supports redis version
[7.2](https://github.com/redis/redis/blob/7.2/00-RELEASENOTES),
[7.4](https://github.com/redis/redis/blob/7.4/00-RELEASENOTES),
[8.0](https://github.com/redis/redis/blob/8.0/00-RELEASENOTES),
[8.2](https://github.com/redis/redis/blob/8.2/00-RELEASENOTES) and
[8.4](https://github.com/redis/redis/blob/8.4/00-RELEASENOTES).
The table below highlights version compatibility of the most-recent library versions with Redis and JDK versions. Compatibility means communication features, and Redis command capabilities.
| Jedis version | Supported Redis versions | JDK Compatibility |
|---------------|---------------------------------------|-------------------|
| 3.9+ | 5.0 to 6.2 Family of releases | 8, 11 |
| >= 4.0 | Version 5.0 to 7.2 Family of releases | 8, 11, 17 |
| >= 5.0 | Version 6.0 to current | 8, 11, 17, 21 |
| >= 5.2 | Version 7.2 to current | 8, 11, 17, 21 |
| >= 6.0 | Version 7.2 to current | 8, 11, 17, 21 |
| >= 7.0 | Version 7.2 to current | 8, 11, 17, 21 |
## Getting started
To get started with Jedis, first add it as a dependency in your Java project. If you're using Maven, that looks like this:
```xml
redis.clients
jedis
7.1.0
```
To use the cutting-edge Jedis, check [here](https://redis.github.io/jedis/jedis-maven/).
Next, you'll need to connect to Redis. Consider installing a redis server with docker:
```bash
docker run -p 6379:6379 -it redis:latest
```
You can instantiate a RedisClient like so:
```java
RedisClient jedis = RedisClient.builder().hostAndPort("localhost", 6379).build();
```
Now you can send commands:
```java
jedis.sadd("planets", "Venus");
```
## Connecting to a Redis cluster
Jedis lets you connect to Redis Clusters, supporting the [Redis Cluster Specification](https://redis.io/topics/cluster-spec).
To do this, you'll need to connect using `RedisClusterClient`. See the example below:
```java
Set jedisClusterNodes = new HashSet();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7380));
RedisClusterClient jedis = RedisClusterClient.builder().nodes(jedisClusterNodes).build();
```
Now you can use the `RedisClusterClient` instance and send commands like you would with a standard pooled connection:
```java
jedis.sadd("planets", "Mars");
```
## Support for Redis data types
Jedis includes support for all [Redis data types](https://redis.io/docs/latest/develop/data-types/) and features such as
[JSON](https://redis.io/docs/latest/develop/data-types/json/) and [VectorSets](https://redis.io/docs/latest/develop/data-types/vector-sets/).
## Failover
Jedis supports retry and failover for your Redis deployments. This is useful when:
1. You have more than one Redis deployment. This might include two independent Redis servers or two or more Redis databases replicated across multiple [active-active Redis Enterprise](https://redis.io/docs/latest/operate/rs/databases/active-active/) clusters.
2. You want your application to connect to one deployment at a time and to fail over to the next available deployment if the first deployment becomes unavailable.
For the complete failover configuration options and examples, see the [Jedis failover docs](https://redis.github.io/jedis/failover/).
## Token-Based Authentication
Jedis supports Token-Based authentication (TBA) starting with 5.3.0 GA release. This feature is complemented by an extension library that enhances the developer experience and provides most of the components required for TBA functionality.
Notably, the extension library includes built-in support for **Microsoft EntraID**, offering a seamless integration as part of the generic solution.
For more details and examples, please refer to the [Advanced Usage](https://redis.github.io/jedis/advanced-usage/) documentation.
## Documentation
The [Jedis documentation site](https://redis.github.io/jedis/) contains several useful articles for using Jedis.
You can also check the [latest Jedis Javadocs](https://www.javadoc.io/doc/redis.clients/jedis/latest/index.html).
Some specific use-case examples can be found in [`redis.clients.jedis.examples`
package](https://github.com/redis/jedis/tree/master/src/test/java/redis/clients/jedis/examples/) of the test source codes.
## Troubleshooting
If you run into trouble or have any questions, we're here to help!
Hit us up on the [Redis Discord Server](http://discord.gg/redis) or
[Jedis GitHub Discussions](https://github.com/redis/jedis/discussions).
## Contributing
We'd love your contributions!
Bug reports are always welcome! [You can open a bug report on GitHub](https://github.com/redis/jedis/issues/new).
You can also contribute documentation -- or anything to improve Jedis. Please see
[contribution guideline](https://github.com/redis/jedis/blob/master/.github/CONTRIBUTING.md) for more details.
## License
Jedis is licensed under the [MIT license](https://github.com/redis/jedis/blob/master/LICENSE).
## Sponsorship
[](https://redis.io/)
================================================
FILE: docs/Dockerfile
================================================
FROM squidfunk/mkdocs-material
COPY requirements.txt .
RUN pip install -r requirements.txt
================================================
FILE: docs/README.md
================================================
# Jedis Documentation
This documentation uses [MkDocs](https://www.mkdocs.org/) to generate the static site.
See [mkdocs.yml](../mkdocs.yml) for the configuration.
To develop the documentation locally, you can use the included [Dockerfile](Dockerfile) to build a container with all the
dependencies, and run it to preview your changes:
```bash
# in docs/
docker build -t squidfunk/mkdocs-material .
# cd ..
docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material
```
================================================
FILE: docs/advanced-usage.md
================================================
# Advanced Usage
## Transactions
To do transactions in Jedis, you have to wrap operations in a transaction block, very similar to pipelining:
```java
jedis.watch (key1, key2, ...);
Transaction t = jedis.multi();
t.set("foo", "bar");
t.exec();
```
Note: when you have any method that returns values, you have to do like this:
```java
Transaction t = jedis.multi();
t.set("fool", "bar");
Response result1 = t.get("fool");
t.zadd("foo", 1, "barowitch"); t.zadd("foo", 0, "barinsky"); t.zadd("foo", 0, "barikoviev");
Response> sose = t.zrange("foo", 0, -1); // get the entire sortedset
t.exec(); // dont forget it
String foolbar = result1.get(); // use Response.get() to retrieve things from a Response
int soseSize = sose.get().size(); // on sose.get() you can directly call Set methods!
// List