redisson-4.6.1
Fixed - ConnectionsHolder init-connection double release (thanks to @yipeng09)
Fixed - AsyncSemaphore.tryRun() over-increment on cancelled waiters (thanks to @yipeng09)
Fixed - AsyncSemaphore race condition
Fixed - non-cluster lazy initialization can park caller threads indefinitely (thanks to @yipeng09)
Fixed - RedissonReactiveSubscription.unsubscribe() throws UnsupportedOperationException
Fixed - RLocalCachedMap sharded subscription mode uses PSUBSCRIBE unconditionally
Fixed - Spring Data Redis 4.1 RedissonReactiveStringCommands throws exceptions
Fixed - FT.SEARCH/FT.AGGREGATE don't work in master nodes round robin in Redis Cluster (thanks to @wushiyuanmaimob)
redisson-4.6.0
Feature - T-digest object added
Feature - Top-k object added
Feature - Spring Boot 4.1.0 integration
Feature - Spring Data Redis 4.1.0 integration
Feature - getFullInfo() and lastItemsReversed() methods added to RArray
Feature - putWithLease(), getWithLease(), removeWithLease() methods added RMapCache (thanks to @nhancdt2602)
Fixed - Spring Data redisTemplate.opsForZSet().popMin() method throws IndexOutOfBoundsException
Fixed - old value not sent in RMapCache.fastPutIfExistsOperation() update message (thanks to @kubbidev)
Fixed - adding ability to use useReferences and allowedClasses settings in yaml config for Kryo5Codec
redisson-4.5.0
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)
redisson-4.4.0
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
redisson-4.3.1
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
redisson-4.3.0
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
redisson-4.2.0
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
redisson-4.1.0
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)
redisson-4.0.0
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)
redisson-3.52.0
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