Skip to content

Releases: redisson/redisson

redisson-4.8.0

Choose a tag to compare

@mrniko mrniko released this 02 Oct 09:02

Feature - Redisson AI implemented
Feature - REmbeddingModel object added
Feature - REmbeddingsCache object added
Feature - RVectorStore object added
Feature - RSemanticCache object added
Feature - RAgentMemory object added
Feature - Spring AI 2.0.0 integration
Feature - Spring AI Chat Memory implementation
Feature - Spring AI Semantic Cache implementation
Feature - Count-min sketch object added
Feature - Time Series (Native) object added
Feature - RTimeSeriesNatives object added for mass operations with Time Series (Native) objects
Feature - RCountMin and RTimeSeriesNative objects added to RBatch object
Feature - Valkey 8.0+ availability zone support through AZ_AFFINITY, AZ_AFFINITY_SLAVES_AND_MASTER, AZ_AFFINITY_MASTER_SLAVE read modes and clientAvailabilityZone setting
Feature - Apache Fory JSON codec added: JsonForyCodec and TypedJsonForyCodec
Feature - PrefixNameMapper object added
Feature - RTimeSeries.add(TimeSeriesAddArgs) method added, old add() methods deprecated
Feature - RTimeSeries.addIfAbsent() and addOrReplace() methods added
Feature - RTimeSeries.aggregate() method added
Feature - RTimeSeries.addAndGet(), addIfLess(), addIfGreater() and addAndSum() methods added
Feature - RTimeSeries.getAll(), getAllEntries(), removeAll(), getAndRemoveAll() and getAndRemoveAllEntries() methods added
Feature - RTimeSeries.readTail() and info() methods added
Feature - RTimeSeries.rangeByLabel(), rangeReversedByLabel(), entryRangeByLabel(), entryRangeReversedByLabel(), removeRangeByLabel() and labels() methods added
Feature - retention setting added to TimeSeriesAddArgs of RTimeSeries object
Feature - RKeys.time() method added (thanks to @dlwhdgus0810)
Feature - StorageMemoryUsageListener and storageStatisticsInterval setting added (thanks to @seakider)
Feature - allowedClasses setting added to JsonJacksonCodec and JsonJackson3Codec
Feature - node address is now passed to FailedNodeDetector methods, legacy methods deprecated (thanks to @rahulrane50)

Improvement - ZStdCodec optimization. Up to 18X faster to encode, up to 91X faster to decode
Improvement - ForyCodec optimization. Up to 2X faster encoding
Improvement - SnappyCodecV2 memory allocation optimization
Improvement - LFUCacheMap optimization: ~25% faster, elements eviction throughput gain is 1.6X-6.9X
Improvement - RTimeSeries entries sharing a timestamp keep insertion order
Improvement - failed command recording is no longer serialized (thanks to @rahulrane50)
Improvement - failed node recovery moved out of health check (thanks to @rahulrane50)
Improvement - Netty updated to 4.2.18.Final
Improvement - Fory lib updated to 1.7.5
Improvement - Kryo lib updated to 5.7.0
Improvement - Jackson libs updated to 2.22.1 and 3.2.1
Improvement - Caffeine lib updated to 3.2.4
Improvement - Javassist lib updated to 3.32.0-GA
Improvement - lz4-java lib updated to 1.11.2
Improvement - Micrometer lib updated to 1.16.6
Improvement - Helidon lib updated to 4.5.4
Improvement - Micronaut lib updated to 5.1.13
Improvement - Quarkus lib updated to 3.40.1
Improvement - Tomcat libs updated to 9.0.121, 10.1.59 and 11.0.25

Fixed - high CPU usage by Hibernate RedissonCacheKeysFactory.createCollectionKey() method
Fixed - CommandDecoder.readLong() performance regression
Fixed - FastRemovalQueue isn't atomic
Fixed - AsyncSemaphore.removeListeners() method should cancel futures
Fixed - AbstractCacheMap view iterators cannot remove
Fixed - AbstractCacheMap.computeIfPresent() method drops a mapping without onValueRemove
Fixed - AbstractCacheMap.entrySet() remove/contains methods compare the wrong types
Fixed - SerializationCodec doesn't use allowedClasses if classLoader isn't defined
Fixed - ZStdCodec, LZ4CodecV2 and LZ4Codec don't check decompression size
Fixed - incorrect maxIdleTime=0 handling in RMapCache.putIfAbsent() method
Fixed - RObject.renamenx() method may throw key not found error
Fixed - RSearch.hasIndex() method throws "unknown index name" error
Fixed - RTimeSeries get/remove methods skip a live entry if an expired one shares its timestamp
Fixed - RTimeSeries range with a limit drops entries sharing a timestamp
Fixed - RTimeSeries fails on timestamps above 1e17 and on an entry missing its expiration
Fixed - RTimeSeries first/last/poll methods return insertion order instead of timestamp order
Fixed - RRateLimiter discards permits returned by release() method if available permits are recalculated (thanks to @likerhythm)
Fixed - FailedCommandsDetector undercounts failures sharing the same millisecond (thanks to @rahulrane50)
Fixed - RKeysRx keys iterator ignores reactive backpressure (thanks to @stlahxm)
Fixed - RSetCache entry added without TTL may become invisible (thanks to @fudianchn)
Fixed - local cache disabled marker isn't cleaned up after transaction commit (thanks to @fudianchn)
Fixed - local cache transaction invalidation events aren't published through sharded topic in cluster (thanks to @fudianchn)
Fixed - RESP3 boolean reply isn't consumed if completed command's reply is skipped (thanks to @fudianchn)
Fixed - ByteBuf leak in BaseTransactionalMap.isEqual() method (thanks to @kalayciburak)
Fixed - RReliableTopic stops polling after listener exception (thanks to @49EHyeon42)
Fixed - RBinaryStream input stream position is incorrect after partial reads (thanks to @daixiheguu)
Fixed - CROSSSLOT error in lock renewal if useSingleServer() is used behind a cluster proxy (thanks to @govansmailbox)
Fixed - missing permit acquisition in connection pool tracking (thanks to @Sebmaster)
Fixed - connection bootstrap ordering around AUTH (thanks to @rahulrane50)
Fixed - failed replica recovery during connection pool selection (thanks to @rahulrane50)
Fixed - Spring Data Redis Reactive hash field expiration ignores expiration type and precision (thanks to @COBI-98)
Fixed - RedissonCache.retrieve() method returns internal NullValue object instead of null (thanks to @stlahxm)
Fixed - Spring Data Redis set() method ignores KEEPTTL and unixTimestamp expirations (thanks to @stlahxm)
Fixed - Spring Data Redis Reactive getEx() method ignores PERSIST, KEEPTTL, EXAT and PXAT options (thanks to @stlahxm)
Fixed - Spring Data Redis getEx() method doesn't apply passed options
Fixed - Same slave node reconnection after failover causes timeout exceptions if performanceMode != NORMAL
Fixed - Quarkus native build fails with GraalVM 25

redisson-4.7.0

Choose a tag to compare

@mrniko mrniko released this 04 Aug 08:35

Feature - RMaps object added for mass operations with Map objects
Feature - Array based Circular Buffer object added
Feature - readNewest(), readOldest() and peekLast() methods added to RRingBuffer
Feature - countUnion(), countUnionApprox() and countDiff() methods added to RSet
Feature - maxCount() and maxSize() params added to RStream.read() and RStream.readGroup() methods
Feature - getAliases() method added to RSearch
Feature - move() method added to RQueue and RBlockingQueue
Feature - SetExpiredListener added for RSetCache
Feature - @RGetter and @RSetter annotations added instead of deprecated @RFieldAccessor
Feature - WorkerOptions.taskLateThreshold setting added
Feature - Hibernate 7.4.x support
Feature - trySetRate(), setRate(), getConfig() and tryAcquire() methods added to RGcra, old tryAcquire() methods deprecated (thanks to @wushiyuanmaimob)
Feature - KeySetViewSerializer used by Kryo5Codec (thanks to @olewehrmeyer)
Feature - Netty updated to 4.2.16.Final
Feature - Fory lib upgraded to 1.4.0

Improvement - RoundRobinLoadBalancer is now load balancing pubsub subscriptions
Improvement - failedSlaveNodeDetector setting is now applied only to slave nodes (thanks to @rahulrane50)
Improvement - FailedNodeDetector instance is now copied per client instead of being shared (thanks to @rahulrane50)
Improvement - redundant junit-bom import removed from redisson-spring-boot-starter (thanks to @Develop-KIM)
Improvement - protobuf-java lib updated to 4.35.1
Improvement - zstd-jni lib updated to 1.5.7-12
Improvement - lz4-java lib updated to 1.11.1
Improvement - jackson-dataformat-msgpack lib updated to 0.9.12
Improvement - micronaut-inject lib updated to 3.10.6 in redisson-micronaut-30 module

Fixed - JCache fallback mode doesn't work for some methods
Fixed - JCache fallback mode doesn't handle incorrect password encryption format
Fixed - EvictionTask cancellation race condition
Fixed - master should be registered even if slaves can't be reached (regression since 4.6.1)
Fixed - cluster lazy initialization parks caller threads indefinitely (thanks to @yipeng09)
Fixed - cluster lazy initialization self-deadlocks if stale master entry is re-registered (thanks to @yipeng09)
Fixed - cluster monitor spams "added slaves detected" if slaves aren't used (thanks to @wushiyuanmaimob)
Fixed - username isn't inherited from cluster config endpoint by discovered nodes (thanks to @wushiyuanmaimob)
Fixed - pubsub semaphore leak if subscription entry is missing (thanks to @AliasJeff)
Fixed - read lock renewal entry leak (thanks to @wushiyuanmaimob)
Fixed - tryLock() method throws timeout exception and redisson_lock_queue, redisson_lock_timeout keys aren't removed (thanks to @seakider)
Fixed - codec mismatch isn't detected if the same name is reused in a transaction (thanks to @fudianchn)
Fixed - ByteBuf leak in RedissonTransactionalBucket.isEquals() method (thanks to @vasiliy-mikhailov)
Fixed - RMap.entrySet().contains() method always returns false (thanks to @vasiliy-mikhailov)
Fixed - RSetMultimap.fastRemoveValueAsync() method always returns 0 (thanks to @vasiliy-mikhailov)
Fixed - RReliableTopic.removeAllListeners() method throws NPE if there is no subscription (thanks to @wushiyuanmaimob)
Fixed - isMinimalPutsEnabledByDefault() method should return false in redisson-hibernate-72 module

redisson-4.6.1

Choose a tag to compare

@mrniko mrniko released this 18 Jun 07:56

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

Choose a tag to compare

@mrniko mrniko released this 15 Jun 08:56

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

Choose a tag to compare

@mrniko mrniko released this 05 Jun 11:38

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

Choose a tag to compare

@mrniko mrniko released this 12 May 14:17

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

Choose a tag to compare

@mrniko mrniko released this 06 Apr 06:16

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

Choose a tag to compare

@mrniko mrniko released this 02 Mar 07:35

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

Choose a tag to compare

@mrniko mrniko released this 05 Feb 12:25

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

Choose a tag to compare

@mrniko mrniko released this 30 Dec 13:18

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)