All Versions
127
Latest Version
Avg Release Cycle
32 days
Latest Release
12 days ago

Changelog History
Page 1

  • v4.5.0 Changes

    June 05, 2026

    🔋 Feature - Array object added (thanks to @lamnt2008)
    🔋 Feature - BitVector Store object added
    🔋 Feature - Fory lib upgraded to 1.1.0
    🔋 Feature - Micronaut 5.0 support
    🔋 Feature - readMode setting added for MapOptions, PlainOptions, LocalCachedMapOptions objects
    🔋 Feature - extended incrementAndGet() method added to RAtomicLong, RAtomicDouble (thanks to @lamnt2008)
    🔋 Feature - contains(), range(), iterator() methods added to RVectorSet object
    🔋 Feature - RMap.keysAsync() method added (thanks to @sywu14)
    🔋 Feature - RVectorSet added to RBatch object (thanks to @sywu14)

    💥 Breaking change - map listeners signature changed, field name added (thanks to @lamnt2008)

    👌 Improvement - refactor: remove unnecessary boxing of primitives (thanks to @MukjepScarlet)

    🛠 Fixed - RScoredSortedSet Rx and Reactive must handle empty results as absent (thanks to @ngyngcphu)
    🛠 Fixed - RGeo Rx and Reactive must handle empty results as absent (thanks to @lamnt2008)
    🛠 Fixed - RSet Rx and Reactive must handle empty results as absent (thanks to @lamnt2008)
    🛠 Fixed - RVectorSet Rx and Reactive must handle empty results as absent (thanks to @lamnt2008)
    🛠 Fixed - PingConnectionHandler race condition
    🛠 Fixed - UUID type metadata leak in TypedJsonJacksonCodec (thanks to @wushiyuanmaimob)
    🛠 Fixed - UUID type inclusion by TypedJsonJackson3Codec
    🛠 Fixed - buffer truncation in LZ4CodecV2
    🛠 Fixed - WRONGPASS error on cluster slaves with TLS when password is set at root Config level (regression since 4.4.0) (thanks to @seakider)
    🛠 Fixed - release locks for non-existent keys in transactional RMap.fastRemove() (thanks to @sywu14)

  • v4.4.0 Changes

    May 12, 2026

    🔋 Feature - Hibernate 7.3.x support
    🔋 Feature - GCRA Rate Limiter added (thanks to @bandalgomsu)
    🔋 Feature - Non-Reentrant Locks implemented: RLock and RFairLock
    🔋 Feature - entries(count), values(count), keySet(count) methods added to RMultimap
    🔋 Feature - fallbackLoadingToMaster setting added (thanks to @bandalgomsu)
    🔋 Feature - RRateLimiter.set(RateLimiterArgs) method added (thanks to @nhancdt2602)
    🔋 Feature - RRateLimiter.update(RateLimiterArgs) method added (thanks to @nhancdt2602)
    🔋 Feature - RMapCache.putAll() method added with idleTime parameter
    🔋 Feature - RBloomFilter.exists(Collection) method added (thanks to @nhancdt2602)
    🔋 Feature - MapIncrListener, DequeAddFirstListener, DequeAddLastListener added (thanks to @nhancdt2602)
    🔋 Feature - SetInterStoreListener, SetUnionStoreListener, SetDiffStoreListener, ScoredSortedSetIncrListener, ScoredSortedSetUnionStoreListener, ScoredSortedSetInterStoreListener, ScoredSortedSetDiffStoreListener added
    🔋 Feature - profileSearch() and profileAggregate() methods added to RSearch
    🔋 Feature - collection field index support for RLiveObject (thanks to @ngyngcphu)
    🔋 Feature - dnsMonitoringTimes setting added (thanks to @seakider)
    🔋 Feature - RScoredSortedSet.Aggregate.COUNT option added (thanks to @TrietMinh23)
    🔋 Feature - RJsonBucket.set() method added with Floating-point homogeneous array precision type (thanks to @TrietMinh23)
    ‎Feature - yieldDistanceAs() and shardKRatio() methods added to VectorSimilarityNearestNeighbors params (thanks to @TrietMinh23)
    🔋 Feature - RedissonClient.shutdownAsync() method added (thanks to @TrietMinh23)
    🔋 Feature - RStream.nack() method added (thanks to @lamnt2008)
    🔋 Feature - datastoreMode, primaryDiscoveryMode settings added to Multi Sentinel mode
    🔋 Feature - setSyncConfig(), setQueueSyncConfig(), setTopicSyncConfig() methods added to JMS RedissonConnectionFactory

    👌 Improvement - io_uring migration from Netty incubator to graduated transport (4.2)
    👌 Improvement - cleanup: CompletableFutureWrapper of null with generic (thanks to @MukjepScarlet)
    👌 Improvement - refactor: replace LinkedList with ArrayList and ArrayDeque (thanks to @MukjepScarlet)
    👌 Improvement - refactor: replace anonymous objects with lambdas (thanks to @MukjepScarlet)

    🛠 Fixed - RReliableQueue doesn't work with nameMapper
    🛠 Fixed - RReliablePubSubTopic doesn't work with nameMapper
    🛠 Fixed - JCache CacheManager should be run in fallback mode if Redisson config is incorrect
    🛠 Fixed - RReliablePubSubTopic might miss messages published at the same moment with listener registration
    🛠 Fixed - all named subscriptions in JMS now prefix the subscription name with the client ID (when set)
    🛠 Fixed - unsubscribe cross-session active consumer check in JMS
    🛠 Fixed - rejecting a second JMS consumer on the same unshared subscription even across different sessions
    🛠 Fixed - durable JMS subscription metadata now stores the message selector alongside topic and noLocal
    🛠 Fixed - JMSContext.close() MessageListener guard ordering
    🛠 Fixed - JCache fallback mode isn't handled during CacheManager acquisition
    🛠 Fixed - JCache fallback mode logs
    🛠 Fixed - JMS shared non-durable subscription is only removed when the last consumer closes
    🛠 Fixed - CancellationException is thrown by RedisExecutor.addMetrics() method
    🛠 Fixed - RStreamReactive and RStreamRx should emit empty signal instead of empty Map and List objects
    🛠 Fixed - return no singal instead of empty map for stream read/readGroup methods (thanks to @TrietMinh23)
    🛠 Fixed - RMap.copy() fails with CROSSSLOT in Redis cluster mode (thanks to @ngyngcphu)
    🛠 Fixed - RSearch.readCursor() doesn't work in RESP3
    🛠 Fixed - RJsonBucket.getKeys() doesn't work in RESP3
    🛠 Fixed - RReadWriteLock cross-instance zombie renewal (thanks to @ngyngcphu)
    🛠 Fixed - RLiveObject.findIds() method throws StringIndexOutOfBoundsException (thanks to @ngyngcphu)
    🛠 Fixed - RPriorityQueue failed to maintain order under high concurrency with replica read (thanks to @nhancdt2602)
    🛠 Fixed - cap RLock timeout to max long when overflow occurs (thanks to @nhancdt2602)
    🛠 Fixed - long type should be used as timeouts in lock objects
    🛠 Fixed - attempt to unlock lock, not locked by current thread by node id (thanks to @nhancdt2602)
    🛠 Fixed - RedisNodeNotFoundException in cluster mode due to incorrect slot calculation for RRemoteService and RExecutorService (thanks to @ngyngcphu)
    🛠 Fixed - RKeysRx.getKeys() doesn't return all keys by pattern
    🛠 Fixed - RSortedSet comparator without declared constructor can't be used
    🛠 Fixed - nameMapper isn't applied if scheduled task was cancelled
    🛠 Fixed - nameMapper isn't applied to tasks running by cron schedule
    🛠 Fixed - ClassCastException from RemoteServiceResponse to RemoteServiceAck (thanks to @nhancdt2602)
    🛠 Fixed - unable to delete Set inside a Transaction if a write operation is queued (thanks to @seakider)
    🛠 Fixed - Pub/Sub channels can't be re-authenticated
    🛠 Fixed - connection leak in RScheduledExecutorService and RRemoteService
    🛠 Fixed - delete() method doesn't work in RedissonTransactionalLocalCachedMap (thanks to @seakider)
    🛠 Fixed - empty result for XREADGROUP, BLMPOP, BZMPOP commands isn't handled properly if read timeout occurs
    🛠 Fixed - incorrect LocalCachedMap behavior within a transaction (thanks to @seakider)
    🛠 Fixed - NullPointerException in MasterConnectionPool if no entries in pool (thanks to @nhancdt2602)
    🛠 Fixed - don't cancel connection acquisition for blocking commands if retry timeout reached
    🛠 Fixed - ClassCastException in Apache Tomcat Session loading due to unsafe numeric casts (thanks to @leonroars)
    🛠 Fixed - cluster detection in single mode (thanks to @bandalgomsu)
    🛠 Fixed - RedisURI.toString() leaks password in plaintext in exception message and logs (thanks to @Woongi9)
    🛠 Fixed - RSearch.info() method doesn't return index prefixes information

  • v4.3.1 Changes

    April 06, 2026

    🔋 Feature - RQueue.indexOf() method added (thanks to @seakider)

    👌 Improvement - RPriorityQueue.poll() should return immediately if queue is empty

    🛠 Fixed - CacheEvict doesn't work correctly in redisson-spring-data-40 (thanks to @seakider)
    🛠 Fixed - Quarkus throws NPE if Redisson configuration isn't defined
    🛠 Fixed - missing @deprecated annotation on RedissonClient.getDelayedQueue() (thanks to @minseok1015)
    🛠 Fixed - master connection is frozen during ElastiCache/Valkey upgrade (thanks to @gpsinghsandhu)
    🛠 Fixed - RSearch.readCursor() skips rows if total is 0
    🛠 Fixed - connection in reconnection state shouldn't be used
    🛠 Fixed - cluster detection for a single node connection
    🛠 Fixed - comment in config.setNettyExecutor() that virtual threads are not recommended (thanks to @seakider)
    🛠 Fixed - DNS hostname resolution shouldn't be used for offline slaves in Sentinel mode
    🛠 Fixed - Spring Data Listener addition for RedisMessageListenerContainer hangs
    🛠 Fixed - LOADING error on slave burns extra retry attempt in batch commands (thanks to @yuxi.jin)
    🛠 Fixed - Spring Data Redis Cluster compatibility
    🛠 Fixed - Cluster topology error handling (thanks to @ngyngcphu)
    🛠 Fixed - AsyncIterator's CompletionStage is not completed exceptionally, when connection gets read timeout (thanks to @seakider)
    🛠 Fixed - unnecessary semicolons in RExecutorService (thanks to @chancehee)
    🛠 Fixed - WriteRedisConnectionException is thrown after Cluster failover

  • v4.3.0 Changes

    March 02, 2026

    🔋 Feature - JMS API implemented
    🔋 Feature - RCuckooFilter object added
    🔋 Feature - Local cached Reactive Spring Session implemented
    🔋 Feature - RBitSet.bitField() method added (thanks to @bandalgomsu)
    🔋 Feature - RBatch.getBloomFilterNative() method added
    🔋 Feature - StreamAddArgs.idempotentProducerId() method added
    🔋 Feature - hashCode()/equlas() methods added to StreamRangeParams object (thanks to @bandalgomsu)
    🔋 Feature - Message.getDeliveries() method added

    👌 Improvement - tcpKeepAlive setting is true by default

    🛠 Fixed - RReliablePubSubTopic.setConfigIfAbsent() throws NPE
    🛠 Fixed - Message.getCreationTime() returns null for messages stored in RReliableQueue
    🛠 Fixed - corrupted Input object shouldn't be returned to the pool in Kryo5Codec
    🛠 Fixed - increased char array in Kryo5Codec isn't cleared when the Input.reset() method is invoked
    🛠 Fixed - traffic burst may block RRateLimiter indefinitely
    🛠 Fixed - attempt to unlock lock, not locked by current thread by node id error (thanks to @seakider)
    🛠 Fixed - RTopicPattern resubscription after failover (thanks to @peterhalicky)
    🛠 Fixed - RBloomFilterNative's add(), exists(), count() return type
    🛠 Fixed - Spring Data ReactiveKeyCommands.scan() method throws NPE if count setting isn't defined

  • v4.2.0 Changes

    February 05, 2026

    🔋 Feature - Spring AI Vector Store implemented
    🔋 Feature - AvroJackson3Codec, CborJackson3Codec, IonJackson3Codec, SmileJackson3Codec codecs added
    🔋 Feature - RBloomFilterNative object added which covers BF.* commands (thanks to @bandalgomsu)
    🔋 Feature - RSearch.hasIndex() method added (thanks @bandalgomsu)
    🔋 Feature - Jackson3Codec added for RJsonBucket and RJsonStore objects

    💥 Breaking change - RSet.containsEach() returns Set (thanks to @bandalgomsu)

    🛠 Fixed - RRingBuffer.clear() method shouldn't clear capacity (thanks to @bandalgomsu)
    🛠 Fixed - unnecessary attempts for BUSYGROUP error (thanks to @bandalgomsu)
    🛠 Fixed - RenewalTask.renewSlots() throws StackOverflowError with many locks (thanks to @subbotinkv)
    🛠 Fixed - RExecutorService.scheduleAtFixedRate() method can only be executed once (thanks to @bandalgomsu)
    🛠 Fixed - Stream ranges in Spring Data Redis module don't handle bounds (thanks to @bandalgomsu)
    🛠 Fixed - UUID serialization by Jackson codecs
    Fixed - RBatch with ExecutionMode.REDIS_WRITE_ATOMIC throws NPEs
    🛠 Fixed - RJsonBucket.setAndKeepTTLAsync() doesn't work (thanks to @jigneshcoder)
    🛠 Fixed - possible RedisTimeoutException and memory Growth after upgrading to Redisson 3.47.0 (thanks to @seakider)
    🛠 Fixed - missed redisson-spring-cache and redisson-spring-transaction dependencies for redisson-spring-boot-starter module
    🛠 Fixed - RSearch VectorSimilarity param doesn't allow to specify scoreAlias and filter params
    🛠 Fixed - javadocs: Config.setCleanUpKeysAmount() description (thanks to @MuriloMarquesSantos)
    🛠 Fixed - errors logging improvement (thanks to @GaoSSR)
    🛠 Fixed - potential negative index in load balancers (thanks to @GaoSSR)
    🛠 Fixed - GraalVM reflection issue in Spring Native (thanks to @GaoSSR)
    🛠 Fixed - docs: update deprecation note for RedLock object (thanks to @mykronetix)
    🛠 Fixed - passwords encryption JDK 8 compatibility

  • v4.1.0 Changes

    December 30, 2025

    🔋 Feature - Local cached Spring Session implemented
    🔋 Feature - Hibernate 7.2 module added
    🔋 Feature - support for Instant-based expiration in RMapCacheNative (thanks @bandalgomsu)
    🔋 Feature - claim() method added to StreamMultiReadGroupArgs and StreamReadGroupArgs for RStream object
    🔋 Feature - RBucket.getDigest() method added
    🔋 Feature - extended RBucket.compareAndSet() method added
    🔋 Feature - RBucket.compareAndDelete() method added
    🔋 Feature - RMapCacheNative.putIfExists() methods added with ttl and time arguments
    🔋 Feature - RBuckets.setIfAllKeysExist() method added (thanks to @seakider)
    🔋 Feature - RBuckets.setIfAllKeysAbsent() method added (thanks to @seakider)
    🔋 Feature - RMapCacheNative.putIfAllKeysExist() method added
    🔋 Feature - RMapCacheNative.putIfAllKeysAbsent() method added
    🔋 Feature - extended RMapCacheNative.putAll() method added
    🔋 Feature - JsonJackson3Codec and TypedJsonJackson3Codec codecs added
    🔋 Feature - RSearch.hybridSearch() method added

    💥 Breaking change - Spring Cache implementation moved to redisson-spring-cache/redisson-spring module (thanks to @seakider)
    💥 Breaking change - Spring Transaction implementation moved to redisson-spring-transaction/redisson-spring module (thanks to @Anubhavagnihotrii)
    💥 Breaking change - FstCodec, FuryCodec, MarshallingCodec, SnappyCodec deprecated codecs have been removed

    👌 Improvement - redisson-spring-data is a sub-module of redisson-spring module
    👌 Improvement - redisson-spring-boot-starter is a sub-module of redisson-spring
    👌 Improvement - redisson-spring-cloud-stream-binder is a sub-module of redisson-spring

    🛠 Fixed - Spring Data Redis ttl() method returns 0 instead of -1 when TimeUnit.SECONDS is used (thanks to @seakider)
    🛠 Fixed - incorrect delay calculations by EqualJitterDelay and FullJitterDelay after 57 attempts
    🛠 Fixed - Kryo5Codec fails sometimes if allowedClasses specified
    🛠 Fixed - PendingEntry.lastTimeDelivered renamed to deliveryCount
    🛠 Fixed - REDIRECT response handling
    🛠 Fixed - Spring Boot attempts to start JCache instance
    🛠 Fixed - LEAK: ByteBuf.release() was not called before it's garbage-collected after redirect handling (thanks to @seakider)

  • v4.0.0 Changes

    December 16, 2025

    🔋 Feature - full-featured Reliable Pub/Sub implemented. Provides topic-subscription-consumer model with message acknowledgment, grouping, seek/replay, Dead Letter Topic, and pull/push consumers
    🔋 Feature - Quarkus 3.30.x integration
    🔋 Feature - Spring Boot 4.0 integration
    🔋 Feature - Spring Data Redis 4.0 module added
    🔋 Feature - database setting added for Valkey Cluster Mode
    🔋 Feature - RSemaphore.releaseIfExists() method added
    🔋 Feature - RBatch.getClusteredMapCacheNative() method added
    🔋 Feature - RSearch.aggregate() method with Iterable result added (thanks to @seakider)
    🔋 Feature - GEOSHAPE field type added in RSearch#createIndex() method (thanks to @seakider)
    🔋 Feature - expire(Duration, names) and expireAt(Instant, names) methods added (thanks to @bandalgomsu)
    🔋 Feature - compute(key, ttl, func) and computeIfAbsent(key, ttl, func) methods added to RMapCacheNative object
    🔋 Feature - RClusteredLocalCachedMapCacheNativeV2, RMapCacheNativeV2, RClusteredMapCacheNativeV2, RLocalCachedMapCacheNativeV2 objects added with maxSize setting

    💥 Breaking change - dropped support of deprecated JSON config format
    💥 Breaking change - removed deprecated getNodesGroup() and getClusterNodesGroup() methods of RedissonClient object
    💥 Breaking change - removed deprecated methods of RGeo object
    💥 Breaking change - removed deprecated methods of RFuture object
    💥 Breaking change - removed deprecated support of Spring XML configuration
    💥 Breaking change - removed support of deprecated custom implementation of Spring Session
    💥 Breaking change - RScript.ReturnType.MULTI renamed to LIST
    💥 Breaking change - RScript.ReturnType.STATUS renamed to STRING
    💥 Breaking change - RScript.ReturnType.INTEGER renamed to LONG
    💥 Breaking change - NameMapper, NatMapper classes moved to org.redisson.config package
    💥 Breaking change - GeoUnit, GeoPosition, GeoOrder, GeoEntry classes moved to org.redisson.api.geo package
    💥 Breaking change - StreamConsumer, StreamGroup, StreamInfo, StreamMessageId, PendingEntry, PendingResult, AutoClaimResult, FastAutoClaimResult classes moved to org.redisson.api.stream package

    👌 Improvement - move auth parameters at Config object level (thanks to @seakider)
    👌 Improvement - move nameMapper/commandMapper parameters at Config object level (thanks to @seakider)
    👌 Improvement - move ssl parameters to Config object level (thanks to @seakider)
    👌 Improvement - use SnakeYAML library directly for Config parsing
    👌 Improvement - lz4-java lib updated
    👌 Improvement - netty lib updated to 4.2.9
    👌 Improvement - Jackson library is now optional
    👌 Improvement - move tcp and keepAlive parameters at Config object level (thanks to @seakider)

    🛠 Fixed - ObjectParams.retryAttempts() setting is 0 by default
    🛠 Fixed - Spring Data RedissonSubscription object doesn't handle cluster failover
    🛠 Fixed - locks extension process in LockTask and ReadLockTask (thanks to @Aleksandr-Kiriushkin-Miro)
    🛠 Fixed - CROSSSLOT Errors with Proxy Mode Redis Cluster and Locks usage
    🛠 Fixed - XREAD blocking call may cause ClassCastException
    🛠 Fixed - an extra key is retained after RLocalCachedMap.clearLocalCache() method invocation
    🛠 Fixed - RedissonNode.start() method throws AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory error
    🛠 Fixed - invalid JSON in resource-config.json (thanks to @Anubhavagnihotrii)
    🛠 Fixed - RSemaphore and RLock objects may wait too long if AOF enabled on Valkey or Redis side
    🛠 Fixed - EqualJitterDelay and FullJitterDelay throw IllegalArgumentException if attempt > 62
    🛠 Fixed - RClientSideCaching doesn't clear parent Redisson instance local cache synchronously
    🛠 Fixed - if prefix is configured, some hibernate caching configurations do not take effect (thanks to @seakider)
    🛠 Fixed - CommandPubSubDecoder may throw NPE
    🛠 Fixed - replicated node timeout handling in Replicated mode (thanks to @johnou)
    🛠 Fixed - RBucket.setIfAbsent() is not rolling back on transaction (thanks to @seakider)
    🛠 Fixed - get() method of RListMultimapCacheReactive and RSetMultimapCacheReactive object doesn't work
    🛠 Fixed - docs: Correct default value for useScriptCache setting (thanks to @lunakv)
    🛠 Fixed - javadocs: Rename method create to createIndex in RSearch (thanks to @senocak)

  • v3.52.0 Changes

    September 25, 2025

    🔋 Feature - loadCoalescingConcurrency setting added to RClusteredLocalCachedMapCache object
    🔋 Feature - implemented EntraIdCredentialsResolver for authentication using Microsoft Entra ID
    🔋 Feature - added support of RStream XDELEX command (thanks to @seakider)
    🔋 Feature - added support of RStream XACKDEL command (thanks to @seakider)
    🔋 Feature - Apache Fory - ForyCodec added
    🔋 Feature - added RMapCache.compute() method with ttl parameter (thanks to @seakider)
    🔋 Feature - added pollFirst() & pollLast() methods to RSortedSet (thanks to @seakider)
    🔋 Feature - password can be specified in config endpoint url for Valkey or Redis cluster
    🔋 Feature - added WITHATTRIBS and EPSILON parameters for VSIM command in RVectorSet object (thanks to @seakider)
    🔋 Feature - RRateLimiter.release() method added (thanks to @moil-xm)
    🔋 Feature - CredentialsResolver.nextRenewal() method added

    💥 Breaking change - VectorSimilarArgs.effort() method renamed to VectorSimilarArgs.explorationFactor()
    💥 Breaking change - VectorSimilarArgs.effort() method renamed to VectorSimilarArgs.explorationFactor()
    💥 Breaking change - VectorAddArgs.effort() method renamed to VectorAddArgs.explorationFactor()
    💥 Breaking change - VectorAddArgs.element() renamed to VectorAddArgs.name()
    💥 Breaking change - credentialsReapplyInterval setting removed and replaced with CredentialsResolver#nextRenewal()

    🛠 Fixed - Attempt to unlock lock, not locked by current thread by node id error (thanks to @seakider)
    🛠 Fixed - cluster failover handling for RBatch object
    🛠 Fixed - inconsistent Command Result Filtering in Spring Data Redis Transactions/Pipelines (thanks to @pengyongqiang)
    🛠 Fixed - Spring Data Reactive module: XPENDING missing group (syntax error) and NPE on empty pending summary (thanks to @seakider)
    🛠 Fixed - NameMapper isn't applied properly for RFairLock object (thanks to @seakider)
    🛠 Fixed - Connection pool should prioritize recently used connections to allow idle connection discard
    🛠 Fixed - QUIT command shouldn't be used
    🛠 Fixed - ERR unknown command WAITAOF error
    🛠 Fixed - RLock object doesn't work in MultiCluster mode
    🛠 Fixed - redisson.license.expiration-year, redisson.license.expiration-month, redisson.license.expiration-day metrics output NaN

  • v3.51.0 Changes

    August 22, 2025

    🔋 Feature - RBitSet.diff(), diffInverse(), andOr(), setExclusive() methods added
    🔋 Feature - FieldIndex.svsVamanaVector() vector indexing added (thanks to @seakider)
    🔋 Feature - checkMasterLinkStatus setting added for Cluster mode (thanks to @seakider)
    🔋 Feature - RKeys.migrate() method added with auth support (thanks to @lyrric)
    🔋 Feature - added support of KEEPREF, DELREF and ACKED options to RStream.trim() method (thanks to @seakider)
    🔋 Feature - added support of KEEPREF, DELREF and ACKED options to RStream.add() method (thanks to @seakider)
    Feature - new FIRST_PRIMARY_PUBSUB_NOTIFICATION mode added to Multi Cluster primaryDiscoveryMode setting
    🔋 Feature - new metrics "responses.busy", "responses.wait", "responses.tryagain", "responses.loading", "responses.ask", "responses.moved" added

    👌 Improvement - AbstractCacheMap.removeExpiredEntries() method optimization (thanks to @lyrric)
    👌 Improvement - equals/hashcode implementation added to TransactionOptions
    👌 Improvement - Cluster manager uses IP if hostname can't be resolved (thanks to @seakider)
    👌 Improvement - new API for RStream.range(), RStream.rangeReversed() and RStream.listPending() methods (thanks to @seakider)

    🛠 Fixed - RReliableQueue message reached delivery limit isn't removed and moved to deadLetterQueue
    🛠 Fixed - visibility setting isn't applied if defined in RReliableQueue queue config
    🛠 Fixed - license key can't be read if defined as JVM option
    🛠 Fixed - RClusteredLocalCachedMapCache.putIfAbsent() method sends incorrect local cache update date (regression since 3.49.0)
    🛠 Fixed - RLocalCachedMapCacheV2.fastPutIfExists() method doesn't work (regression since 3.49.0)
    🛠 Fixed - SyncStrategy.UPDATE doesn't work for RLocalCachedJsonStore
    🛠 Fixed - RClusteredLocalCachedMap.putIfAbsent() and fastPutIfAbsent() methods don't update the local cache if storeCacheMiss = true
    🛠 Fixed - RClusteredLocalCachedMap.putIfExists() method doesn't update the local cache if storeCacheMiss = true
    🛠 Fixed - RClusteredLocalCachedMapCache.putIfExists() and putIfAbsent() methods doesn't update the local cache if storeCacheMiss = true
    🛠 Fixed - RClusteredLocalCachedMapCache.fastPutIfExists(), putIfExists(), putIfAbsent() and fastPutIfAbsent() methods don't update the local cache if storeCacheMiss = true
    🛠 Fixed - RClusteredLocalCachedMapCacheNative.fastPutIfExists(), putIfExists(), putIfAbsent() and fastPutIfAbsent() methods don't update the local cache if storeCacheMiss = true
    🛠 Fixed - RReliableQueue.get(Codec, String) method doesn't work
    🛠 Fixed - Multi Cluster mode doesn't detect failed clusters
    🛠 Fixed - null is printed in logs during connection in Cluster mode
    🛠 Fixed - RBitSet.and(), not(), or(), xor() methods return void instead of number
    🛠 Fixed - RScheduledExecutorService.deregisterWorkers() method throws an exception (thanks to @seakider)
    🛠 Fixed - RLocalCachedMap.putIfExists() method doesn't update the local cache if storeCacheMiss = true
    🛠 Fixed - RLocalCachedMap.putIfAbsent() method doesn't update the local cache if storeCacheMiss = true
    🛠 Fixed - IllegalReferenceCountException is thrown when using RClientSideCaching (thanks to @seakider)
    🛠 Fixed - failed Slave at Redisson start moment can't be discovered later in Cluster mode
    🛠 Fixed - INFO REPLICATION command timeout logging
    🛠 Fixed - graalvm: Classes that should be initialized at run time got initialized during image building (thanks to @seakider)
    🛠 Fixed - DNSMonitor logs a warning (thanks to @seakider)
    🛠 Fixed - race condition during elements eviction in LFU cache (thanks to @lyrric)
    🛠 Fixed - when acquire by RPermitExpirableSemaphore it may fail in some case (thanks to @lyrric)
    🛠 Fixed - Direct byte buffer leak when using RLocalCachedMap with StoreMode.LOCALCACHE for readAllValues(), readAllMap() and readAllEntrySet() methods (thanks to @lyrric)
    🛠 Fixed - DataInputStream closing to prevent resource leak in RedissonExecutorService.getClassBody() method (thanks to @backstraw)
    🛠 Fixed - added missed setters and getters for Config object in RedissonSessionManager (thanks to @jglapa)
    🛠 Fixed - RPermitExpirableSemaphore.tryAcquire() doesn't work when acquiring > 1 permit (thanks to @lyrric)
    🛠 Fixed - CommandMapper isn't applied properly to RScript object (thanks to @lyrric)
    🛠 Fixed - synchronization of remote and local Tomcat SSO cache (thanks to @cogniware)
    🛠 Fixed - FT.SEARCH command is executed only on master nodes (thanks to @pfyod)

  • v3.50.0 Changes

    June 17, 2025

    🔋 Feature - Apache Tomcat SSO integration (thanks to @cogniware and @iamrakesh)
    🔋 Feature - Valkey and Redis url may contain password only (thanks to @noxvost)

    🛠 Fixed - Redisson can't connect to Azure Managed Redis Cluster (thanks to @beetlebugorg)
    🛠 Fixed - commons-codec and json-smart libs updated
    🛠 Fixed - IllegalArgumentException: tickDuration : 0 (expected: > 0) error is thrown