Commit Graph

1680 Commits

Author SHA1 Message Date
Mark Paluch
aa7045ab95 Remove redundant assertion from RedisTemplate.afterPropertiesSet(…).
Closes #2832
2024-01-19 09:35:32 +01:00
Mark Paluch
25a6981544 Polishing.
Reformat code.

See #2831
2024-01-18 11:01:27 +01:00
Mark Paluch
75e51f5b39 Deprecate LettuceConnectionFactory.setDatabase(…) in alignment with JedisConnectionFactory.setDatabase(…)
See #2831
2024-01-18 11:01:26 +01:00
Mark Paluch
707184f7e2 Update deprecation description of JedisConnectionFactory.setDatabase(…).
Mention database index instead of client name.

Closes #2831
2024-01-18 11:01:26 +01:00
谭九鼎
014634e94c Fix reference documentation for Stream ops usage.
Closes #2825
2024-01-11 14:46:28 +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
86b97e38e3 Fix documentation to use resource injection for RedisTemplate operations.
Closes #2828
2024-01-11 14:46:27 +01:00
谭九鼎
2369ae0f7e Update Jedis documentation to reflect supporting Redis Streams.
Closes #2824
2024-01-09 09:15:42 +01:00
李潇
356d9af003 Use correct distance unit for repository query method documentation.
Closes #2823
2024-01-08 08:58:08 +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
Christoph Strobl
1c8cc73edc Polishing.
Delegate value loading to existing method to remove duplicate code paths.

Original Pull Request: #2785
2023-12-13 16:25:32 +01:00
Mark Paluch
a2af06d6fd Polishing.
Reformat code.

Original Pull Request: #2785
2023-12-13 16:25:18 +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
b9f2e4c509 Use Long.parseUnsignedLong/toUnsignedString for SCAN cursor id parsing.
Redis uses an unsigned 64bit value for its cursor id which is now captured via parseUnsignedLong.

Closes: #2796
2023-12-13 14:40:55 +01:00
Mark Paluch
966dc05704 Polishing.
Fix Javadoc reference.

See #2778
2023-12-13 09:10:29 +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
Junghoon Ban
3ad3874219 Refine getRequiredAdapter()usage in RedisQueryEngine.
We now use getRequiredAdapter() instead of getAdapter() to enforce either an object or a proper exception.

Closes #2800
Original pull request: #2801
2023-12-11 10:11:59 +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
ffc857e4fc Polishing.
Add missing comma in indexes.adoc. Refine generic map definition statements.

Closes #2784
2023-11-23 09:31:05 +01:00
Runbing
01c113520d Fixed the URL for the Spring Data Commons documentation.
I fixed an incorrect URL in the **antora.yml** file that was preventing other pages from linking to the Spring Data Commons documentation.

Closes #2779
2023-11-20 11:25:15 +01:00
John Blum
76cdf48afa Polishing.
Rename asString(:Object) to toString(:Object) for consistency with toBytes(..).

Original pull request: #2774
2023-11-17 15:05:09 -08:00
Junghoon Ban
482eab9224 Remove unnecessary method call in RedisKeyValueAdapter.
Closes #2774
2023-11-17 15:04:56 -08:00
Mark Paluch
58a4a2da7e Prepare 3.2 GA (2023.1.0).
See #2737
2023-11-17 14:28:30 +01:00
Junghoon Ban
22a465a992 Polishing.
Use module identifier instead of constant.

Closes #2762
2023-11-06 10:55:28 +01:00
Mark Paluch
f97bd87d70 Upgrade to Jedis 5.0.2.
Closes #2763
2023-11-06 09:41:08 +01:00
Mark Paluch
667dd27bb5 Polishing.
Tweak naming. Simplify converters by removing unused methods.

See #2754
2023-10-27 15:00:20 +02:00
Junghoon Ban
85e9ae50ff Use pattern matching instead of type casting.
Closes #2754
2023-10-27 15:00:14 +02:00
John Blum
f28bf61142 Safely add and register the MessageListener to Topic mapping.
Given addListener(:MessageListener, :Collection<Topic>) could be called concurrently from the addMessageListener(:MessageListener, Collection<Topic>) method by multiple Threads, and the RedisMessageListenerContainer Javadoc specifically states that it is safe to call the addMessageListener(..) method conurrently without any external synchronization, and the registeration (or mapping) of listener to Topics is a componund action, then a race condition is possible.

Closes #2755
2023-10-23 12:18:57 -07: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
68f514bdd8 Refine initialization of the TypeResolver in GenericJackson2JsonRedisSerializer.
Closes #2750
2023-10-18 22:27:13 -07:00
John Blum
12f5fad1ba Cleanup equals(:Object) method and compiler warnings in RedisSentinelConfiguration.
Additionally:

* Annotates getMaster() with @Nullable.
* Fixes assertion messages for accuracy and consistency.
* Introduces white spacing for readability.

Closes #2747
2023-10-18 16:32:05 -07:00
John Blum
a71f042ec4 Refine Javadoc and source in caching infrastructure components.
Judiciously applies minor source code refinements, such as introducing named (local) variable object references to make it clearer the arguments that are being passed to caching method parameters, in favor of self-describing code with intent.

Closes #2742
2023-10-17 20:02:56 -07:00
John Blum
31ebe7ea1b Refine tests involving async caching support.
Closes #2741
2023-10-17 20:02:43 -07:00
John Blum
b62f18c027 Prepare 3.2 RC1 (2023.1.0).
See #2712
2023-10-13 08:43:56 -07:00
Mark Paluch
917632bd32 Polishing.
Add since tag. Reformat code.

See #2601
2023-10-13 10:36:26 +02: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
John Blum
9bae67eae2 Deprecate redundant ByteUtils.extractBytes(…) method.
Refactors extractBytes(:ByteBuffer) to call getBytes(:ByteBuffer), thereby avoid the NullPointerException by throwing the more appropriate IllegalArgumentException with a descriptive message instead.

See #2733
2023-10-12 16:21:12 -07:00
John Blum
747a7d03ee Refactor code and cleanup compiler warnings in Redis caching infrastructure.
* Apply Java 17 syntax try-with-resources in DefaultRedisCacheWriter execute methods.
* Organize source code
* Edit Javadoc.

Closes #2733
2023-10-12 16:20:46 -07: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
John Blum
9bd8fda30e Apply additional polishing to ClusterCommandExecutor.
See #2518
2023-10-11 22:44:34 -07: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