Enhance thread-safety in ClientSideCaching key retrieval #3268
+197
−44
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issue
Closes #2402
The current implementation of the get method in the ClientSideCaching class does not provide a mechanism to ensure exclusive access by a single thread when retrieving a value from the Redis server for a specific key. As a result, in high concurrent load scenarios involving the same key, the current implementation may cause redundant and unnecessary calls to the Redis server.
Solution
Added a per-key locking mechanism using
ReentrantLock
to ensure that only a single thread can fetch a value from Redis for a specific key at any given time.Tests
valueLoaderShouldBeInvokedOnceForConcurrentRequests
: Verifies that when multiple threads concurrently access the same key using a valueLoader, the loader is called exactly oncelocksShouldBeProperlyCleanedUp
: Verifies the proper lifecycle management of locks (creation, cleanup on invalidation, recreation, and final cleanup)