Redisson - Easy Valkey/Redis Java client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache ...
Feature - Apache Tomcat Manager should use sharded pubsub in Redis Cluster 7.0+
Feature - Micronaut Session store should use sharded pubsub in Redis Cluster 7.0+
Feature - RClusteredScoredSortedSet object implemented
Feature - maxDeletedEntryId
, entriesAdded
, recordedFirstEntryId
properties added to StreamInfo
object
Feature - inactive
property added to StreamConsumer
object
Feature - LocalCachedMapOptions.cacheSize = -1
should disable local cache storage
Breaking change - Apache Tomcat Manager and Micronaut Session store now use sharded PubSub in Redis Cluster 7.0+
Fixed - map index entry isn't deleted when RLiveObjectService
expires
Fixed - RMultimap.fastRemoveValue()
method doesn't delete entry completely if no values retain
Fixed - Default getCache method checks for Object class equality (thanks @agupta-hw)
Fixed - RScoredSortedSet.distributedIterator()
doesn't work (regression since 3.21.0)
Fixed - Memory leak if RLocalCachedMap
created with storeMode=LOCALCACHE
and syncStrategy=UPDATE
params
Fixed - wait time handling in RedissonSpinLock (thanks @vladimirkl)
Fixed - java.lang.ClassCastException is thrown by RDequeReactive.pollLast() and RDequeReactive.pollFirst() methods (thanks @wynn5a)
Fixed - RSearch.search()
method throws "Parameters must be specified in PARAM VALUE pairs" error
Fixed - RRateLimiter.setRate()
method does not behave as expected when RateType is pre_client (thanks @wynn5a)
Fixed - collection fields aren't deleted when RLiveObject
expires or is deleted
Feature - Spring Data Redis 3.1.0 implementation
Feature - Spring Boot 3.1.0 support
Feature - lastEntry()
, firstEntry()
, pollLastEntries()
, pollFirstEntries()
, entryIterator()
, rankEntry()
, revRankEntry()
methods added to RScoredSortedSet
object
Feature - RCountDownLatch
, RLock
, RPermitExpirableSemaphore
, RSemaphore
objects use sharded PubSub in Redis Cluster 7.0+
Feature - slavesSyncTimeout
, commandMapper
, sslCiphers
, sslTrustManagerFactory
, sslKeyManagerFactory
settings added
Feature - RMultimap.fastRemoveValue()
method added
Feature - allowedClasses
setting added to SerializationCodec
Feature - entriesRead
and makeStream
parameters added to RStream.createGroup()
method
Breaking change - RCountDownLatch, RLock, RPermitExpirableSemaphore, RSemaphore objects now use sharded PubSub in Redis Cluster 7.0+
Fixed - Expired LiveObjects with RIndex annotations retain indexed data
Fixed - RRingBuffer
doesn't implement expire()
, expireAt()
, delete()
, clearExpire()
methods properly
Fixed - RLocalCachedMap
local cache isn't cleared after instance expiration
Fixed - default retryInterval isn't applied to RBatch object
Fixed - RBatches no longer respect the default number of retries (regression since 3.21.1)
Feature - RBitSet.set(long[], boolean)
method added (thanks to @skasj)
Fixed - Pattern Topic messages are missed/duplicated after failover in cluster if channel starts with __keyspace
and __keyevent
and subscriptionMode = SLAVE
Fixed - to many pubsub topics may cause memory leak
Fixed - RBatches no longer respect the default number of retries (regression since 3.21.1)
Feature - addIfAbsent()
, addIfExists()
, addIfGreater()
, addIfLess()
, addAll()
, addAllIfAbsent()
, addAllIfExist()
, addAllIfGreater()
, addAllIfLess()
methods added to RSetCache
object
Feature - SetAddListener
, SetRemoveListener
, SetRemoveRandomListener
added to RSet
object
Feature - ScoredSortedSetAddListener
, ScoredSortedSetRemoveListener
added to RScoredSortedSet
object
Feature - MapPutListener
, MapRemoveListener
added to RMap
object
Feature - IncrByListener
added to RAtomicDouble
and RAtomicLong
objects
Feature - RMapCache.getAllWithTTLOnly()
method added
Breaking change - RedissonDelayedQueue internal data format changed
Breaking change - RedissonReliableTopic internal data format changed
Improvement - RedissonReliableTopic
internal structure optimization
Fixed - RReliableTopic
data loss
Fixed - failover isn't handled correctly in some cases
Fixed - BatchOptions.retryAttempts = 0
isn't applied to RBatch
object
Fixed - RMap.keySet()
throws NPE if CompositeCodec used
Fixed - RediSearch NumericFilter shouldn't set exclusive range by default
Fixed - RediSearch NumericFilter throws NPE
Fixed - RLocalCachedMap.removeListener()
method doesn't remove loca cache listeners
Feature - RediSearch module support
Feature - RSetCache
extends RSet
interface
Feature - RSemaphore
and RPermitExpirableSemaphore
objects wait for sync operations completion
Feature - Quarkus 3 support
Feature - LocalCacheUpdateListener
and LocalCacheInvalidateListener
listeners support added to RLocalCachedMap object
Feature - Tracing support
Improvement - RRateLimiter
object uses 128-bit random
Improvement - EVAL script cache applied to RBatch
executed in IN_MEMORY
mode
Improvement - RMap.keySet()
method shouldn't load map values
Improvement - SequentialDnsAddressResolverFactory
default concurrencyLevel set to 6
Fixed - RMapCache.fastPut()
method doesn't clear ttl and idleTime params if entry reinserted after expiration
Fixed - Unable to find session error arise if Tomcat session was deleted or expired
Fixed - MasterSlaveEntry.getClient()
method may throw NPE
Fixed - initialize Decoders LinkedHashMap with correct initial size to avoid unnecessary resizing (thanks @theigl)
Fixed - failover handling may cause temporary connections spike
Feature - LoadBalancer.getEntry(List<ClientConnectionsEntry>, RedisCommand<?>)
method added
Feature - CommandsLoadBalancer added
Feature - NodeType parameter added to ConnectionListener methods
Improvement - command should be redirected to a master node if slave node returns LOADING error
Fixed - closing idle connections causes connection listener to fire
Fixed - Unable to init enough connections amount!
error
Fixed - no retry attempts are made for None of slaves were synced
error
Fixed - READONLY You can't write against a read only replica..
is thrown after failover in sentinel mode (thanks @alexworkgit)
Fixed - continuously attempts of INFO REPLICATION
command execution until attempts limit reached by RLock object after failover
Fixed - Node hasn't been discovered yet error isn't resolved by a new attempt for RBatch and RLock objects
Fixed - RedisClusterDownException
, RedisLoadingException
, RedisBusyException
, RedisTryAgainException
, RedisWaitException
are thrown by RBatch and RLock objects even if these errors disappeared after new attempts
Fixed - "Unable to init enough connections amount! Only 0 of ... were initialized" error (thanks @alexworkgit)
Fixed - nameMapper
isn't applied to some methods of RSet
and RScoredSortedSet
objects
Fixed - readUnion()
, readDiff()
and readIntersection()
methods of RSet
object don't use Redis slave nodes
Feature - new Multi cluster mode which supports AWS Redis Global Datastore and Azure Redis Cache active-passive replication
Feature - Proxy mode supports RLEC Active-Active databases
Feature - monitorIPChanges setting added for replicated servers mode
Feature - auto-detection of unavailable master in replicated mode (thanks @nicdard)
Fixed - RLock
can only be obtained by single redisson node if None of slaves were synced
error occurred
Fixed - RSetMultimapReactive.get()
method throws ClassCastException
Fixed - Redisson doesn't start in Spring Boot Native image
Fixed - RedissonClient.shutdown(long, long, TimeUnit)
method isn't overridden by cluster, replicated and sentinel managers
Fixed - Node hasn't been discovered yet error isn't resolved by a new attempt for RBatch and RLock objects
Fixed - RMapCache.addAndGet()
method doesn't handle Long type properly
Fixed - eventLoopGroup
, connectionListener
and executor
settings can't be defined through YAML configuration
Fixed - keySet()
, values()
, entrySet()
methods of RLocalCachedMap
return empty result if storeMode == LOCALCACHE
Fixed - a new attempt should be made on WAIT error during failover
Fixed - Kryo5Codec fails to (de)serialize Object without no-args constructor (regression since 3.19.2)
Fixed - RLock
instance can acquire lock with previous leaseTime if it's not specified
Fixed - RMap.computeAsync()
method causes deadlock if MapLoader is defined
Fixed - RBoundedBlockingQueue.offer()
methods always use global codec
Fixed - Spring Boot clientName
setting isn't used
Fixed - connectTimeout
setting is set incorrectly if Spring Boot 2.4.0+
Fixed - command replies don't match if exception is thrown in CommandEncoder
Fixed - empty result of BLMPOP command causes IndexOutOfBoundsException
Fixed - canceled blocking operation isn't interrupted immediately in some cases
Fixed - RStream.read() and RStream.readGroup() methods are hang forever is timeout > 0 and < 1000 milliseconds
Fixed - CacheLoader.loadAll()
method isn't called by JCache.getAll()
method if readThrough=true
Fixed - Kryo5Codec
Serializers don't work in GraalVM native image mode
Fixed - LinkedHashMap
and LinkedHashSet
objects can't be decoded properly by Kryo5Codec
Fixed - NameMapper
isn't applied to RFunction
and RScript
objects
Fixed - RFunction.callAsync()
method called with RBatch
object throws MOVED
errors in Redis cluster mode
Fixed - RFunction.loadAndReplace()
method uses incorrect command parameters
Fixed - codec
, nettyHook
, addressResolverGroupFactory
, connectionListener
settings can't be defined through Quarkus or Helidon config
Fixed - RFunction.load()
method uses incorrect command parameters
Fixed - empty RTopic
message handling (thanks @MooRoakee)