Commit Graph

1002 Commits

Author SHA1 Message Date
Mark Paluch
7a94beb467 Allow RedisConnectionFactories to be initialized as part of the context lifecycle.
Lettuce and Jedis connection factories now can be configured to initialize early during afterPropertiesSet or configured whether the component should be auto-started by the container.

By default, connection factories auto-startup early.

Closes #2866
Original Pull Request: #2868
2024-04-11 15:34:05 +02:00
Mark Paluch
eed4c2af40 Consider intermediate command interface in ConnectionSplittingInterceptor.
We now consider requests to command API objects such as RedisConnection.keyCommands() in ConnectionSplittingInterceptor to identify the correct command and route it accordingly.

Closes: #2886
Original Pull Request: #2887
2024-04-11 13:31:58 +02:00
Mark Paluch
6f28b530b0 Use Lettuce functionality for Cluster commands where possible.
We now remove our own code in favor of Lettuce's advanced cluster support to leverage asynchronous functionality in pipelining.

Document pipelining restrictions regarding Redis Cluster.

Original Pull Request: #2889
2024-04-10 16:05:56 +02:00
Mark Paluch
d785b5f870 Accept CompletableFuture subtypes for Lettuce pipelining.
We now no longer require RedisCommand but resort to CompletableFuture as the general asynchronous result type for Lettuce pipelining to allow subtypes such as PipelinedRedisFuture.

Closes: #2888
Original Pull Request: #2889
2024-04-10 14:41:06 +02:00
Mark Paluch
761115ab37 Polishing.
Deprecate RedisSentinelConfiguration and RedisClusterConfiguration constructors taking PropertySource in favor of a factory method.

Reformat code. Update documentation.

See #2860
Original pull request: #2861
2024-03-01 14:10:31 +01:00
Mustapha Zorgati
f9a763e55a Extend properties for RedisSentinelConfiguration.
Closes #2860
Original pull request: #2861

Co-authored-by: Samuel Klose <39386136+samKl99@users.noreply.github.com>
2024-03-01 14:10:23 +01:00
Mark Paluch
9543076752 Add support for DTO projections.
See: #2851
Original Pull Request: #2854
2024-02-23 10:38:15 +01:00
Mark Paluch
3c44521026 Use by-id lookup for queries referring to identifier values.
Closes: #2851
Original Pull Request: #2854
2024-02-23 10:36:22 +01:00
Christoph Strobl
505fd846ae Use Redis 7.2 for build.
Update jenkinsfile to test against redis 7.2
Replace usage of DEBUG command.
Provide Redis server version and client lib version to maven build system / gradle cache.

Original Pull Request: #2802
2024-02-07 15:43:16 +01:00
Mark Paluch
4da3169a0b Encapsulate Redis Scan CursorId.
We now retain the raw cursor value without attempting to convert it into a long as Redis uses 64 bit unsigned integers exceeding Long.MAX_VALUE.
Fix broken id parsing for unsigned long value
Update deprecation warnings and method visibility.

See: #2796
Closes: #2802
2024-02-07 15:43:16 +01:00
Mark Paluch
b6e4951345 Polishing.
Add missing property editors to inject requested operations.

See #2828
2024-01-11 14:46:27 +01:00
Mark Paluch
7f48b752eb Extend license header copyright years to 2024.
See #2821
2024-01-02 14:42:07 +01:00
Mark Paluch
2e29a999f8 Differentiate between initial exception handling, recovery and recovery after subscription.
We now differentiate exception handling regarding the recovery state. Initial listen fails if the connection is unavailable. Upon recovery after a preceeding subscription we now log the success to create a counterpart to our error logging.

Closes: #2782
Original Pull Request: #2808
2023-12-15 11:13:37 +01:00
Mark Paluch
97e9a1d18b Expose ValueWrapper to differentiate between cached null values and absent cache mapping.
We now use ValueWrapper to differentiate in the async API between cache misses and cached null values.

Closes: #2783
Original Pull Request: #2785
2023-12-13 16:24:55 +01:00
Christoph Strobl
c19acb0b45 Add tests to verify symmetric usage of scan cursor id.
See: #2796
2023-12-13 14:49:12 +01:00
Mark Paluch
5a2a92a221 Remove duplicate keys from RedisQueryEngine.
We now avoid duplicate keys if a key is found in two indices.

Closes #2799
2023-12-11 10:31:09 +01:00
Mark Paluch
bcf761f0f7 Accept empty config values in the Lettuce connection wrapper.
Closes #2798
2023-12-08 14:56:57 +01:00
Mark Paluch
a15d43f6b8 Adopt tests to Spring Data Commons changes.
Closes #2797
2023-12-08 11:44:41 +01:00
Mark Paluch
58c04a9360 Avoid race condition in tests.
See #2787
2023-11-30 09:39:05 +01:00
Junghoon Ban
85e9ae50ff Use pattern matching instead of type casting.
Closes #2754
2023-10-27 15:00:14 +02:00
John Blum
f56989f9c1 Apply consistent Exception variable names to all catch blocks.
We now consistently align with the core Spring Framework's use of 'ex' as the variable name for Exceptions handled in catch blocks, and 'ignore' for all Exceptions thrown, but ignored by framework code. Both 'ex' and 'ignore' were appropriately used based on the context and nautre of the Exception handler in the catch block.

Additionally, we use the 'expected' variable name for Exception thrown in tests where the thrown Exception is the expected outcome of the test case.

Only 1 exception exists to these name conventions, and that is 'nested', which was necessarily used in ScanCursor due to the nested try-catch blocks.

Applied consistent use of String.format(..) to Exception messages requiring formatting.

Formatted catch block according to source code formatting style.

Closes #2748
Original pull request: #2749
2023-10-19 09:38:35 +02:00
John Blum
31ebe7ea1b Refine tests involving async caching support.
Closes #2741
2023-10-17 20:02:43 -07:00
Mark Paluch
7bf035f3a5 Allow @EnabledOnRedisDriver usage with @ParameterizedRedisTest.
We now enable tests without an instance in EnabledOnRedisDriverCondition assuming that we only use DriverQualifier on instance fields and not static ones.

Closes #2734
Original pull request: #2717
2023-10-13 09:31:50 +02:00
Mark Paluch
efc9ecf695 Polishing.
Replace blocking lock wait with non-blocking flow. Add support for asynchronous storage to persist the cache value after retrieval from the value supplier. Introduce AsyncCacheWriter abstraction to improve functional guards.

Reformat code. Remove redundant tests. Revisit deprecation notices with consistent mention of the version in which the deprecation was introduced.

Refine exception messages when RedisCache does not support async retrieval.

See #2650
Original pull request: #2717
2023-10-13 09:31:50 +02:00
John Blum
a72c4268a3 Support asynchronous Cache.retrieve(…) in RedisCache.
Closes #2650
Original pull request: #2717
2023-10-13 09:31:19 +02:00
Mark Paluch
df4be6f8b5 Correctly apply Reactive zadd NX/XX command flags.
We now correctly apply if exists/if not exists constraints on the reactive zadd command.

Previously, we only considered upsert which wasn't sufficient to apply xx/nx.

Closes #2731
2023-10-12 10:09:55 +02:00
Mark Paluch
8be6691c8d Polishing.
Simplify tests. Reuse existing interfaces from Spring. Remove inappropriate nullability annotations and introduce annotations where required.

Replace Future mocking with easier to maintain and to read future method overrides. Remove superfluous code and replace with infrastructure classes provided by Spring Framework.

Consistently name callbacks. Make exception collector concept explicit. Reformat code.

See #2518
Original pull request: #2719
2023-10-11 14:46:39 +02:00
John Blum
781fda6be5 Remove Thread.sleep(…) from ClusterCommandExecutor.collectResults(…).
Replace Thread.sleep(..) with Future.get(timeout, :TimeUnit) for 10 microseconds. As a result, Future.isDone() and Future.isCancelled() are no longer necessary. Simply try to get the results within 10 us, and if a TimeoutException is thrown, then set done to false.

10 microseconds is 1/1000 of 10 milliseconds. This means a Redis cluster with 1000 nodes will run in a similar time to Thread.sleep(10L) if all Futures are blocked waiting for the computation to complete and take an equal amount of time to compute the result, which is rarely the case in practice, given different hardware configurations, data access patterns, load balancing/request routing, and so on. However, using Future.get(timeout, :TimeUnit) is more fair than Future.get(), which blocks until a result is returned or an ExecutionException is thrown, thereby starving computationally faster nodes vs. other nodes in the cluster that might be overloaded. In the meantime, some nodes may even complete in the short amount of time when waiting on a single node to complete.

10 microseconds was partially arbitrary, but no more so than Thread.sleep(10L) (10 milliseconds). The main objective was to give each node a chance to complete the computation in a moments notice balanced with the need to quickly check if the computation is done, hence Future.get(timeout, TimeUnit.MICROSECONDS) for sub-millisecond response times. This may need to be further tuned over time, but should serve as a reasonable baseline for the time being. Additionally, this was based on https://redis.io/docs/reference/cluster-spec/#overview-of-redis-cluster-main-components in the Redis documentation, recommending a cluster size of no more than 1000 nodes.

Add test coverage for ClusterCommandExecutor collectResults(..) method.

Cleanup compiler warnings in ClusterCommandExecutorUnitTests.

Closes #2518
Original pull request: #2719
2023-10-11 14:45:28 +02:00
John Blum
dc0756f94e Polish for Issue #2655 and PR #2672.
See #2655
Original pull request: #2672
2023-10-10 19:07:48 -07:00
Mark Paluch
b5f124cfd8 Terminate stream with error on null values returned by RedisElementReader for top-level elements.
We now emit InvalidDataAccessApiUsageException when a RedisElementReader returns null in the context of a top-level stream to indicate invalid API usage although RedisElementReader.read can generally return null values if these are being collected in a container or value wrapper or parent complex object.

Apply consistent wording to operations documentation.
2023-10-10 19:07:42 -07:00
John Blum
2075633809 Upgrade to Jedis 5.0
Adapt to API changes in the Jedis 5.0 driver.
Fix bzPopMaxShouldWorkCorrectly() and bzPopMinShouldWorkCorrectly() tests in JedisClusterConnectionTests.

Jedis 5.0 changed the bzpopmax and bzpopmin Redis commands to no longer return an empty (Array)List internally when evaluating and popping from an empty sorted set. A NullPointerException will be thrown if either bzpopmax or bzpopmin commands are executd on an empty Redis sorted set in Jedis 5.0 (vs. Jedis 4.x):

Closes #2612
Original pull request: #2716
2023-10-04 08:04:37 +02:00
Mark Paluch
49c6637913 Fix broken unit tests.
Closes #2720
2023-09-28 14:41:22 +02:00
Mark Paluch
8573104ad8 Reenable disabled tests.
See #2489
2023-09-21 15:24:02 +02:00
Mark Paluch
d4ba034b28 Refine RedisSerializer implementations.
This commit polishes up method ordering, introduces Javadoc where missing and updates nullability annotations and argument names.

Closes #1097
2023-09-21 14:59:23 +02:00
Mark Paluch
9e473b5dcd Polishing.
Reorder methods to align with ListOperations. Simplify tests to avoid test noise.

See #2692
Original pull request: #2704
2023-09-12 11:09:06 +02:00
John Blum
157f5e4b1d Adds support to lPop or rPop N elements from a Redis List in ReactiveListOperations.
Closes #2692
Original pull request: #2704
2023-09-12 11:08:32 +02:00
John Blum
ea4acad379 Polish enhanced switch statements.
See #2705
Original pull request: #2706
2023-09-11 16:45:59 -07:00
Mark Paluch
001456447b Migrate documentation site to Antora.
Closes #2703
2023-09-08 13:59:16 +02:00
John Blum
e423851f87 Polish for #2696.
Closes #2701
Original pull request: #2696
2023-09-06 17:15:51 -07:00
Mark Paluch
f5f0c3b259 Polishing.
Move executor from ClusterConfiguration to connection factories as the executor is a Spring concept that isn't tied to endpoint details or the client config.

Reorder static factory methods after constructors and property accessors after static factory methods. Inline single-line single-use methods that aren't intended as extension hooks for easier readability.

Disable TaskExecutor disposal on ClusterCommandExecutor.destroy().

Remove NonNull annotations as default non-nullability is defined on the package level.

Simplify tests to use integration tests to avoid excessive mocking.

See #2594
Original pull request: #2669
2023-08-17 10:35:15 +02:00
John Blum
8d6ebb4e99 Add configuration for TaskExecutor used by ClusterCommandsExecutor.
This change allows users to leverage the VirtualThread facilities and AsyncTaskExecutor implementations provided in and by the core Spring Framework as part of our Loom support theme.

Closes #2594
Original pull request: #2669
2023-08-17 10:35:15 +02:00
John Blum
2eaf1746da Polishing.
Organize source code and cleanup compiler warnings.

See #2594
Original pull request: #2669
2023-08-17 10:35:14 +02:00
Mark Paluch
76c1830c57 Polishing.
Replace qualified class name access of inner classes with simple names and imports.

Remove Java 8 guards. Extend supported temporal types in Jsr310Converters. Remove superfluous converter annotations.

Simplify tests.

See #2677
Original pull request: #2681
2023-08-17 09:14:39 +02:00
John Blum
dc09635cc4 Register Converters for Offset java.time types in JSR310Converters.
We now appropriately handle OffsetDateTime and OffsetTime the same as all other java.time types, supported as simple types on Spring application (persistent) entity classes.

Closes #2677
2023-08-17 08:44:15 +02:00
Mark Paluch
372d26ab21 Polishing.
Use Regex to capture the various styles of CLUSTER NODES endpoint representations.

See #2678
Original pull request: #2679
2023-08-16 11:53:57 +02:00
Sorokin Evgeniy
d1908fdbfc Add support for bracket-less IPv6 addresses to CLUSTER NODES Converter.
Closes #2678
Original pull request: #2679
2023-08-16 11:53:36 +02:00
Christoph Strobl
bf0ac0011e Align ParameterizedTestContext usage of DefaultArgumentsAccessor with recent JUnit version
Closes: #2661
2023-08-04 15:44:05 +02:00
Christoph Strobl
5568ffd818 Polishing
Order imports to match code style. Use one line per sentence in documentation.

Original pull request: #2643
2023-08-01 15:02:14 +02:00
John Blum
dddf3530b9 Add support for TTI expiration in Redis Cache implementation.
We now support time-to-idle (TTI) expiration policies for cache reads.

The TTI implementation is achieved with the use of the Redis GETEX command on Cache.get(key) operations as well as consistently using the same TTL configuration for all cache operations when TTI is enabled and TTL expiration has been configured,
with the use of a TtlFunction or fixed Duration.

Closes #2351
Original pull request: #2643
2023-07-28 10:42:34 +02:00
Christoph Strobl
862e3446bc Use reflection to access internal value in tests.
Original Pull Request: #2647
2023-07-28 10:30:15 +02:00