Redisson - Easy Redis Java client with features of In-Memory Data Grid. 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 - Multi Sentinel mode implementation
Feature - RLocalCachedMapCacheV2
object implemented with effecient partitioning and advanced entry eviction
Feature - graceful shutdown in quarkus (thanks to @naah69)
Improvement - RLongAdder
and RDoubleAddder
should use sharded topic if possible
Improvement - reduced CPU and Memory consumption by ClusterConnectionManager.getLastPartitonsByURI()
method
Improvement - RedisURI.hashCode()
caching to reduce CPU consumption
Improvement - shutdown check added in RTopic.removeListener()
method
Fixed - incorrect detection of sharded pubsub support
Fixed - RBatch
does not work with RKeys.randomKeyAsync() method (thanks to @wynn5a)
Fixed - unresolved Redis node hostname in cluster mode affects cluster topology scan
Fixed - MASTER
nodes aren't used if readMode = MASTER_SLAVE
Fixed - RLock
, RFencedLock
, RReadWriteLock
miss unlock messages and wait a defined timeout before a next attempt or hang
Fixed - RSemaphore
, RPermitExpirableSemaphore
miss release messages and wait a defined timeout before a next attempt or hang
Fixed - incorrect value of RLongAdder.sum()
and RDoubleAddder.sum()
methods if multiple Adder instances for the same Redisson object are used
Fixed - CountDownLatch.await()
method may throw NPE
Fixed - ExecutionException handling in RExecutorService, RLock, RPermitExpirableSemaphore, RSemaphore objects
Fixed - ConcurrentModificationException
is thrown on RedissonSession save method if readMode = MEMORY
Fixed - Spring Data Redis zPopMin() and zPopMax() methods don't work (thanks to @bimslab)
Feature - RShardedTopic.countSubscribers()
method implemented
Feature - RedissonMultiLock
implements isHeldByThread()
and isHeldByCurrentThread()
methods
Fixed - Multiple locking of RLock reset remainTimeToLive to config default
Fixed - exception thrown by natMapper
is not shown in logs
Fixed - OSGi jdk.net package import should be optional
Fixed - ServiceManager.resolveAll()
method throws NPE
Fixed - RObject.addListenerAsync()
method throws UnsupportedOperationException
Fixed - StatusListener
doesn't work with RShardedTopic
Fixed - NPE is thrown in cluster mode if slave node added
Fixed - continuously reconnecting to a removed slave node in cluster mode
Fixed - incorrect handling of TrackingListener removal
Fixed - FlushListener
receives duplicate events
Fixed - SlotsDecoder
throws NPE on empty result
Fixed - Clash between RedissonCache and Spring (6.1+) Cache interface methods
Fixed - RedissonClient.shutdown()
method hangs at serviceManager.getShutdownLatch()
invocation
Fixed - "Failed to submit a listener notification task. Event loop shut down?" error caused by PingConnectionHandler
Fixed - JsonCodecWrapper
isn't cached properly
Feature - added TrackingListener
support to RList
, RQueue
, RDeque
, RBlockingQueue
, RBlockingDeque
, RDelayedQueue
, RRingBuffer
objects
Feature - addListener()
, random()
methods added to RLexSortedSet
object
Improvement - show log warning "DNS TCP fallback on UDP query timeout disabled" if Netty version is lower 4.1.105
Improvement - ChannelName.toString() conversion optimization
Fixed - retryInterval
and retryAttempts
settings aren't applied in case of 'READONLY You can't write against a read only replica.' error
Fixed - RRemoteService
may cause CPU spike after Master failover
Fixed - FlushListener
causes ClassCastException
Fixed - TrackingListener
causes ClassCastException
Fixed - RedissonSetCache.addIfAbsentAsync()
uses incorrect argument for zadd (thanks @fooooxxxx)
Feature - client tracking support. TrackingListener
is available for RBucket
, RStream
, RScoredSortedSet
, RSet
, RMap
and RBucket
objects
Feature - added RKeys.addListener()
method to register global listeners
Feature - FlushListener
added to track flushdb/flushall command invocation
Feature - Kryo5Codec
constructor with registrationRequired
parameter added
Feature - nettyExecutor
setting added
Feature - enable DNS TCP fallback when UDP query timeout for RoundRobinDnsAddressResolverGroupFactory
and SequentialDnsAddressResolverFactory
Improvement - cache result of INFO REPLICATION
command for RLock
objects
Fixed - Spring Data Redis ReactiveKeyCommands.pExpire()
method throws an exception
Fixed - NPE is thrown by RedisExecutor.handleError()
method
Fixed - sharded pubsub detection for Apache Tomcat Session Manager
, RMapCache
and RLocalCachedMap
objects
Fixed - Redisson's threads aren't shutdown if Redis node address isn't defined
Fixed - NPE is thrown while creating RLocalCacheMap
object without WriteMode value
Fixed - incorrect RESP3 protocol parsing causes SlaveConnectionPool no available Redis entries
error
Fixed - repeated new connections with AWS Elasticache serverless
Fixed - internal LRUCacheMap
object throws ConcurrentModificationException
Feature - enable DNS TCP fallback on UDP query timeout (thanks to @hellojukay)
Feature - StreamMessageId.autogenerateSequenceId()
method added (thanks to @mrmx)
Feature - RLockReactive.isHeldByThread()
method added (thanks to @sanail)
Fixed - missed implementation of Spring Data Redis ReactiveStringCommands.bitField()
method
Fixed - Spring Data Redis opsForCluster().randomKey()
method throws UnsupportedOperationException
Fixed - JCache.close()
method throws IllegalStateException
if statistics enabled
Fixed - doubled connections to the master node if readMode = MASTER_SLAVE
or there are no slave nodes
Fixed - RSearch.delDict()
and RSearch.addDict()
methods throw NPE
Fixed - connection ping handler doesn't use commandTimeout
setting
Fixed - repeated new connections with AWS Elasticache serverless
Fixed - RLock
throws ERR unknown command 'wait'
with AWS Elasticache serverless
Fixed - RSearchReactive.dropIndex()
method doesn't call onComplete() handler
Feature - ability to specify retryInterval
, retryAttempts
, timeout
settings per Redisson object. Please refer to the documentation
Feature - LocalCachedMapOptions.expirationEventPolicy
setting added
Feature - StreamAddListener
, StreamCreateConsumerListener
, StreamCreateGroupListener
, StreamRemoveConsumerListener
, StreamRemoveGroupListener
, StreamRemoveListener
, StreamTrimListener
listeners added for RStream
object
Fixed - Spring Data Redis RedissonConnection.setCommands()
method returns null
Fixed - continuously reconnecting to a removed slave node in cluster mode
Fixed - EntryExpiredListener
isn't invoked by RMapCache
instance in Redis Cluster 7+ and if nameMapper
is defined
Fixed - Skipped slave up ...
error is thrown in Sentinel mode if nodes use IPv6
Fixed - NPE is thrown when adding or removing shards in ElastiCache
Fixed - RAtomicDouble
, RAtomicLong
, RMap
, RScoredSortedSet
, RSet
listeners aren't removed properly
Fixed - connection isn't reconnected on WRONGPASS
Redis error
Fixed - connection timeout during Redisson start ignores connections amount
Fixed - RSearch.search()
method doesn't execute query with aliases properly
Fixed - FCALL_RO
command isn't used when RFunction
method called with FunctionMode.READ
parameter
Fixed - IllegalReferenceCountException
is thrown when canceling a method call
Fixed - Redis scan cursor exceed Long.MAX_VALUE
in AWS Elasticache
Fixed - internal ServiceManager.calcSHA()
method should use UTF-8 encoding by default
Fixed - SSL connection can't be established
Improvement - JDK21 Virtual Threads compatibility
Fixed - EvictionTask keeps running even after destroy()
method called
Fixed - Sprint Data Redis throws Subscription registration timeout exceeded
Fixed - Sprint Data Redis RedisMessageListenerContainer.addMessageListener()
method hangs if called after container start
Fixed - NPE is thrown if lazyInitialization = true
Fixed - PriorityQueue
methods may hang due to unreleased lock after exception
Fixed - RMap.getAll()
method throws IndexOutOfBoundsException
Fixed - natMapper isn't applied to slaves and master nodes at start in Sentinel mode
Fixed - method invocation hangs after failover if retryInterval = 0
Fixed - transactional Map and MapCache keySet method returns inconsistent state
Fixed - Multilock lock method doesn't work properly with non-MILLISECONDS TimeUnit
Feature - RESP3 protocol support. protocol setting added Feature - Spring Data Redis 3.2.0 implementation Feature - RSetCacheV2, RSetV2 objects with more effecient partitioning in Cluster added in PRO version
Improvement - SLF4j updated to 2.0.9 version
Fixed - RFunction/RScript keys parameter accepts only String values Fixed - IP address instead of hostname is used in sentinel mode with SSL connection Fixed - Resources leak in Version.logVersion() method Fixed - RLiveObjectService.persist() method with varargs hangs in cluster mode Fixed - Redisson connection process may hang at start in some cases Fixed - EntryExpiredListener isn't invoked by RMapCache instance in Redis Cluster 7+ Fixed - slave node in sentinel mode can't be recovered if it's a master node Fixed - JsonJacksonCodec fails to serialize Throwable on Java17 (thanks to @tomjankes) Fixed - RBlockingDeque.move() throws an exception for empty result Fixed - RScoredSortedSet.pollFirstEntries(count) and pollLastEntries(count) methods return wrong result Fixed - BZMPOP command timeout isn't applied Fixed - getBlockingDeque(), getDeque(), getPriorityDeque(), getPriorityBlockingDeque() throw NoClassDefFoundError if JDK version < 21 Fixed - RLocalCachedMap.containsKey() method does not work properly if storeCacheMiss = true Fixed - RedissonRemoteService exceptions handling (thanks to @mrmx) Fixed - RSearch.info() method throws NumberFormatException Fixed - HttpSessionListener.sessionDestroyed() method isn't called if Tomcat Session deleted by the node which didn't create it Fixed - LZ4CodecV2 isn't compatible with LZ4Codec Fixed - RSearch GroupBy.reduce alias isn't applied (thanks to @arjunE1395)
Feature - Helidon 4.0 integration
Fixed - ERR invalid expire time
error is thrown during RLock.unlock()
call if retryAttempts = 0