Redisson - Redis Java client with features of In-Memory Data Grid. Over 50 Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Publish / Subscribe, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, MyBatis, RPC, local cache ...

Overview

Redisson - Redis Java client
with features of In-Memory Data Grid

Maven Central JavaDoc License

Quick start | Documentation | Javadocs | Changelog | Code examples | FAQs | Report an issue

Based on high-performance async and lock-free Java Redis client and Netty framework.
JDK compatibility: 1.8 - 15, Android

Features

Success stories

Moving from Hazelcast to Redis / Datorama

Migrating from Hazelcast to Redis / Halodoc

Distributed Locking with Redis (Migration from Hazelcast) / ContaAzul

Migrating from Coherence to Redis

Quick start

Maven

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.15.1</version>
</dependency>  

Gradle

compile 'org.redisson:redisson:3.15.1'  

SBT

libraryDependencies += "org.redisson" % "redisson" % "3.15.1"

Java

// 1. Create config object
Config config = new Config();
config.useClusterServers()
       // use "rediss://" for SSL connection
      .addNodeAddress("redis://127.0.0.1:7181");

// or read config from file
config = Config.fromYAML(new File("config-file.yaml")); 
// 2. Create Redisson instance

// Sync and Async API
RedissonClient redisson = Redisson.create(config);

// Reactive API
RedissonReactiveClient redissonReactive = Redisson.createReactive(config);

// RxJava2 API
RedissonRxClient redissonRx = Redisson.createRx(config);
// 3. Get Redis based implementation of java.util.concurrent.ConcurrentMap
RMap<MyKey, MyValue> map = redisson.getMap("myMap");

RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap");

RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap");
// 4. Get Redis based implementation of java.util.concurrent.locks.Lock
RLock lock = redisson.getLock("myLock");

RLockReactive lockReactive = redissonReactive.getLock("myLock");

RLockRx lockRx = redissonRx.getLock("myLock");
// 4. Get Redis based implementation of java.util.concurrent.ExecutorService
RExecutorService executor = redisson.getExecutorService("myExecutorService");

// over 50 Redis based Java objects and services ...

Consider Redisson PRO version for advanced features and support by SLA.

Downloads

Redisson 3.15.1, Redisson node 3.15.1

FAQs

Q: What is the cause of RedisTimeoutException?

Q: When do I need to shut down a Redisson instance, at the end of each request or the end of the life of a thread?

Q: In MapCache/SetCache/SpringCache/JCache, I have set an expiry time to an entry, why is it still in Redis when it should be disappeared?

Q: How can I perform Pipelining/Transaction through Redisson?

Q: Is Redisson thread safe? Can I share an instance of it between different threads?

Q: Can I use different encoder/decoders for different tasks?

Comments
  • Redisson calls do not time out and very long cache times depending on ttl setting

    Redisson calls do not time out and very long cache times depending on ttl setting

    Hi, while developing using redisson some problems with timeouts and cache times are experienced.

    1. Consider the following scenario:
    try {
         node = configCacheBusinessLogic.get();
    } catch (RedisException e) {
         log.warn("Failed to get from cache, fall back to database", e);
         node = configService.get();
    }
    
    1. In ConfigCacheBusinessLogic:
    @Cacheable(value = CACHE_NAME, key = CACHE_KEY_SPEL)
    public JsonNode get() throws AbstractCustomException {
        //configService.get() is database logic wrapped in @Transactional
        return configService.get();
    }
    
    1. @Cacheable uses a class that extends Spring's Cache:
    @Override
    public ValueWrapper get(Object key) {
       PerformanceLogHelper.startTimer(CACHE_TIME);
       try {
           RBucket bucket = redisson.getBucket((String) key);
           Object value = bucket.get();
           return toWrapper(value);
        } finally {
            PerformanceLogHelper.stopTimer(CACHE_TIME);
        }
    }
    

    Now there are several problems here. Timeout exceptions are being thrown, but seemingly at random times ignoring the timeout setting of redisson. It is also somehow being affected by ttl setting as the shorter ttl yields lower cache times, as well as the frequency of hitting the cache. You can see it from the following graphs of CACHE_TIME timer:

    1. Long TTL setting, and around 4-5 queries per minute (cache time goes as high as 800,000 ms): long ttl not many queries 2 . With long TTL setting and around 200 queries per minute, cache times also go as high as 800,000 ms but there are fewer spikes than in case 1 (sorry no screenshot)
    2. Short TTL setting, around 4-5 queries per minute (cache time goes as high as 800 ms): short tll not many queries
    3. Short TTL setting, around 200 queries per minute (cache time goes as high as 1000 ms but very rarely): short ttl many queries

    So to summarize:

    | TTL | Queries per minute | Max cache time | Cache time spikes | Picture in the previous list | | --- | --- | --- | --- | --- | | Long | 4-5 | 800,000 | Many | 1 | | Long | ~200 | 800,000 | Few | 2 (no pic) | | Short | 4-5 | 800 | Many | 3 | | Short | ~200 | 1000 | Few | 4 |

    In all cases the timeout was set to 100ms, 3 attempts with 100ms interval. In all the cases in the end requests succeed to fall over to the database (either through a timeout error or through returning null). Regardless, the timeout is not being thrown according to the settings. Please let me know if you might know the cause of the issue. Thoroughly investigated the code on this side and it seems like the issue is in redisson. Let me know if you need more context

    bug 
    opened by oleg-gr 87
  • Redisson not able to detect ip changes of active node in RLEC endpoint

    Redisson not able to detect ip changes of active node in RLEC endpoint

    We are currently using Redisson 3.5.0 to connect to our Redis labs enterprise cluster(RLEC). The driver is configured to connect using single server mode (as recommended for RLEC). When the active node ip switches/changes, Redisson is not able to reconnect with the new active node. It keeps retrying to communicate with the last known active node ip from the endpoint. This behavior is consistent with either "dns monitoring" being set to true / false. If we manually set the same active node ip back, it immediately reconnects, which proves the point that its unaware of the ip address changes, unless the last known ip is elected again as active.

    How do we enable Redisson to detect potential ip changes of active node, while using endpoint of RLEC in single server mode?

    Please let me know if you have any ideas on this one. Thanks.

    bug 
    opened by sindhuvaidy 76
  • AddSentinelAddress(...) non-running instance ClosedChannelException

    AddSentinelAddress(...) non-running instance ClosedChannelException

    Hi,

    I have noticed something running some load tests recently.

    I have a 3 sentinels, 1 slave and 1 master set up.

    Initially I was running load tests on this exact set up and would occasionally run into org.redisson.client.RedisConnectionException: Slave connection pool gets exhausted! which is fine since when the load is reduced the app goes back to normal.

    Then I had to switch off one of the sentinels and forgot to restart it, so now I was running with 2 sentinels, 1 slave and 1 master.

    I would first again run into org.redisson.client.RedisConnectionException: Slave connection pool gets exhausted! but would also run into org.redisson.client.WriteRedisConnectionException: Can't send command: RedisCommand [name=GET, subName=null], params: [Ljava.lang.Object;@44d02cc5, channel: [id: 0x08bfe466, 0.0.0.0/0.0.0.0:55173 :> /127.0.0.1:6379] (6379 is master) org.redisson.client.WriteRedisConnectionException: Can't send command: RedisCommand [name=GET, subName=null], params: [Ljava.lang.Object;@1283c11d, channel: [id: 0x05e26dda, 0.0.0.0/0.0.0.0:54360 :> /127.0.0.1:6380] (6380 is slave) and org.redisson.client.WriteRedisConnectionException: Can't send command: RedisCommand [name=GET, subName=null], params: [Ljava.lang.Object;@2f0f4c9c, channel: [id: 0xf38de559, 0.0.0.0/0.0.0.0:55367]

    here is one of them with full stack:

    org.redisson.client.WriteRedisConnectionException: Can't send command: RedisCommand [name=GET, subName=null], params: [Ljava.lang.Object;@2f0f4c9c, channel: [id: 0xf38de559, 0.0.0.0/0.0.0.0:55367]
        at org.redisson.CommandExecutorService$6.operationComplete(CommandExecutorService.java:447)
        at org.redisson.CommandExecutorService$6.operationComplete(CommandExecutorService.java:442)
        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:680)
        at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:567)
        at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:424)
        at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetFailure(AbstractChannel.java:801)
        at io.netty.channel.AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:699)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1122)
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:633)
        at io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:32)
        at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:908)
        at io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:960)
        at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:893)
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:356)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)
        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.nio.channels.ClosedChannelException: null
    

    After reducing the load, org.redisson.client.RedisConnectionException: Slave connection pool gets exhausted! disappear, but org.redisson.client.WriteRedisConnectionException: Can't send command... persist and appear on every couple of calls even for 0.5QPS.

    I tried this several times and it always was like this, 3 sentinels - all good, 2 sentinels - WriteRedisConnectionException exceptions.

    Note that in both cases I passed all 3 sentinel's addresses to addSentinelAddress(...) for useSentinelConnection()

    Maybe a check on the new Redis(...) call to ping all the sentinels would be nice

    bug 
    opened by oleg-gr 76
  • ClientConnectionsEntry中的成员变量allConnections(Queue)中存在非常多的RedisConnection对象,内存占用非常大,无法回收,导致年老代被占满,疯狂fullgc,cpu 300%

    ClientConnectionsEntry中的成员变量allConnections(Queue)中存在非常多的RedisConnection对象,内存占用非常大,无法回收,导致年老代被占满,疯狂fullgc,cpu 300%

    Expected behavior

    不会存在非常多的RedisConnection,堆内存、cpu正常

    Actual behavior

    存在非常多的RedisConnection,新生代,年老代都接近100%,cpu达到300%

    Steps to reproduce or test case

    Redis version

    4.0.8

    Redisson version

    3.10.1

    Redisson configuration

    Config config = new Config(); config.setNettyThreads(0).setThreads(0).setCodec(new JsonJacksonCodec()).setReferenceEnabled(true); config.useSingleServer() .setAddress("redis://"+"ip".concat(":").concat(String.valueOf(port))) .setDatabase(1) .setPassword("password") .setIdleConnectionTimeout(10000) .setPingConnectionInterval(30000) .setPingTimeout(1000) .setConnectTimeout(10000) .setTimeout(3000) .setRetryAttempts(3) .setRetryInterval(1500) .setSubscriptionsPerConnection(5) .setClientName("none") .setSubscriptionConnectionMinimumIdleSize(1) .setSubscriptionConnectionPoolSize(50) .setConnectionPoolSize(64) .setConnectionMinimumIdleSize(10) .setDnsMonitoringInterval(5000); RedissonClient redissonClient = Redisson.create(config);

    bug 
    opened by xujunhua555 63
  • RedisTimeoutException after long time of running

    RedisTimeoutException after long time of running

    Expected behavior

    Redisson must reconnect to the server if the connection is lost.

    Actual behavior

    It seems to didn't even try to reconnect.

    Steps to reproduce or test case

    We are using AWS as the Redisson hosts, and OVH as the Redis server host (with a ping between 10 to 30 ms max from one server to the other one).
    Let the server run for some hours (3hours seems to be enough), then try to do a request to the server.
    You'll get this kind of error:

    org.redisson.client.RedisTimeoutException: Unable to send command! Node source: NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=MasterSlaveEntry [masterEntry=[freeSubscribeConnectionsAmount=0, freeSubscribeConnectionsCounter=5, freeConnectionsAmount=0, freeConnectionsCounter=4, freezed=false, freezeReason=null, client=[addr=redis://xxxx.xxxx.xxxx.xxxx:6380], nodeType=MASTER, firstFail=0]]], connection: RedisConnection@2119571203 [redisClient=[addr=redis://xxxx.xxxx.xxxx.xxxx:6380], channel=[id: 0xf5e8192b, L:/xxxx.xxxx.xxxx.xxxx:36546 - R:xxxx.xxxx.xxxx.xxxxx/xxxx.xxxx.xxxx.xxxx:6380]], command: (EVAL), command params: [while true do local firstThreadId2 = redis.call('lindex', KEYS[2], 0);if firstThreadId2 == false the..., 3, XXXX:6360:lock, redisson_lock_queue:{XXXX:6360:lock}, redisson_lock_timeout:{XXXX:6360:lock}, 30000, 42785f4b-af2a-4002-aef2-940e5657ac26:57, 1548175178331, 1548175173331] after 3 retry attempts
    	at org.redisson.command.CommandAsyncService$10.run(CommandAsyncService.java:721)
    	at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:668)
    	at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:743)
    	at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:471)
    	at java.lang.Thread.run(Thread.java:748)
    

    Redis version

    Waiting for my Sysadmin to come back to tell me our Redis version.

    Redisson version

    3.10.0

    Redisson configuration

    {
       "clusterServersConfig":{
          "idleConnectionTimeout":10000,
          "pingTimeout":1000,
          "connectTimeout":10000,
          "timeout":3000,
          "retryAttempts":3,
          "retryInterval":1500,
          "failedSlaveReconnectionInterval":3000,
          "failedSlaveCheckInterval":60000,
          "password":"REDIS_PROD",
          "subscriptionsPerConnection":5,
          "clientName":null,
          "loadBalancer":{
             "class":"org.redisson.connection.balancer.RoundRobinLoadBalancer"
          },
          "subscriptionConnectionMinimumIdleSize":1,
          "subscriptionConnectionPoolSize":5,
          "slaveConnectionMinimumIdleSize":1,
          "slaveConnectionPoolSize":5,
          "masterConnectionMinimumIdleSize":1,
          "masterConnectionPoolSize":5,
          "readMode":"SLAVE",
          "subscriptionMode":"SLAVE",
          "nodeAddresses":[
            "redis://XXXXXX:6379"
          ],
          "scanInterval":1000
       },
       "threads":0,
       "nettyThreads":0,
       "codec":{
          "class":"org.redisson.codec.JsonJacksonCodec"
       },
       "transportMode":"NIO"
    }
    
    
    opened by AlexMog 59
  • tomcat session replication with non-sticky session not working, multiple issues

    tomcat session replication with non-sticky session not working, multiple issues

    Hi, I'm trying to setup a Tomcat 8 cluster with 2 nodes without sticky session. Issues: 1.java.lang.IllegalStateException: setAttribute: Session [F766FB4EAE8FE29451215A67300EF46A] has already been invalidated 2. ``` Caused by: java.io.IOException: java.lang.ClassNotFoundException: xxx.dto.PermissionDTO at org.redisson.codec.SerializationCodec$1.decode(SerializationCodec.java:53) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:259) at org.redisson.client.handler.CommandDecoder.decodeList(CommandDecoder.java:289) at org.redisson.client.handler.CommandDecoder.decodeFromCheckpoint(CommandDecoder.java:154) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:101) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:367) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:644) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:579) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:496)

    
    
    3. From RedissonSessionManager and RedissonSession i can't understand how this solution replicates in real time( no sticky sessions) the same session from one node to another.I was expecting that method getAttribute should use the map also. If someone can explain this.
    
    And a feature if it is possible:
    can we filter some session attributes from going into RMap?
    
    Thanks.
     
    bug 
    opened by gabydinu 54
  • "Can't update cluster state" error often occurs when using AWS Elasticache.

    using the lock function, which is the biggest strength of redisson.

    As suggested, netty is using the latest version (4.1.75.Final).

    스크린샷 2022-04-11 14 04 16

    In addition, netty-all is included.

    스크린샷 2022-04-11 14 05 17

    The settings are as follows:

    Config config = new Config().setCodec(StringCodec.INSTANCE); config.setCheckLockSyncedSlaves(false); config.setAddressResolverGroupFactory(new DnsAddressResolverGroupFactory());

    ClusterServersConfig clusterServersConfig = config.useClusterServers(); clusterServersConfig.setConnectTimeout(3000); clusterServersConfig.setTimeout(10000); clusterServersConfig.setIdleConnectionTimeout(3000); clusterServersConfig.setPingConnectionInterval(3000); clusterServersConfig.setDnsMonitoringInterval(1000); clusterServersConfig.setScanInterval(1000); clusterServersConfig.setNodeAddresses(Collections.singletonList("redis://"+redisProperty.getElasticache().getHost()+":"+redisProperty.getElasticache().getPort())); return Redisson.create(config);

    I also implemented a new DnsAddressResolverGroupFactory and injected it like this:

    스크린샷 2022-04-12 10 23 42

    Is there something I'm missing out on?

    Wouldn't changing dnsMonitoringInterval to -1 as suggested by @mrniko would lead to failover detection and other issues?

    Due to the nature of my application, lettuce is also used mixedly, and it is not occurring in lettuce.

    The error content is as follows:

    io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Failed to resolve 'xxxxxxx.gxk3ue.clustercfg.apne1.cache.amazonaws.com' and search domain query for configured domains failed as well: [ap-northeast-1.compute.internal] at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1047) at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:1000) at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:418) at io.netty.resolver.dns.DnsResolveContext.access$600(DnsResolveContext.java:66) at io.netty.resolver.dns.DnsResolveContext$2.operationComplete(DnsResolveContext.java:467) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609) at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117) at io.netty.resolver.dns.DnsQueryContext.tryFailure(DnsQueryContext.java:240) at io.netty.resolver.dns.DnsQueryContext$4.run(DnsQueryContext.java:192) at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/10.0.0.2:53] query via UDP timed out after 2000 milliseconds (no stack trace available)

    dns 
    opened by ant76050391 52
  • Request org.redisson.client.RedisTimeoutException during high load

    Request org.redisson.client.RedisTimeoutException during high load

    Hello,

    I'm using redisson v3.6.5 with Redis 4. I have 3 masters and 3 slaves nodes for 5 tomcat clusters. However during high load, my team experienced a lot of org.redisson.client.RedisTimeoutException exceptions such as below:

    20-Apr-2018 11:21:16.641 SEVERE [http-nio-18080-exec-1790] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jsp] in context with path [] threw exception [org.redisson.client.RedisTimeoutException: Unable to send command! Node source: NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=org.redisson.connection.MasterSlaveEntry@6a5e3f8], connection: [id: 0x8ccbc494, L:/184.170.243.238:38841 - R:/104.200.148.138:6380], command: (HGET), command params: [redisson_tomcat_session:7AB9E70459E2041FED447330E28EF802, PooledUnsafeDirectByteBuf(ridx: 0, widx: 12, cap: 256)] after 3 retry attempts] with root cause org.redisson.client.RedisTimeoutException: Unable to send command! Node source: NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=org.redisson.connection.MasterSlaveEntry@6a5e3f8], connection: [id: 0x8ccbc494, L:/184.170.243.238:38841 - R:/104.200.148.138:6380], command: (HGET), command params: [redisson_tomcat_session:7AB9E70459E2041FED447330E28EF802, PooledUnsafeDirectByteBuf(ridx: 0, widx: 12, cap: 256)] after 3 retry attempts at org.redisson.command.CommandAsyncService$8.run(CommandAsyncService.java:544) at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:668) at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:743) at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:471) at java.lang.Thread.run(Thread.java:748)

    org.redisson.client.RedisTimeoutException: Unable to send command! Node source: NodeSource [slot=null, addr=null, redisClient=null, redirect=null, entry=org.redisson.connection.MasterSlaveEntry@6a5e3f8], connection: [id: 0x354aeaed, L:/184.170.243.238:57085 - R:/104.200.148.138:6379], command: (HSET), command params: [redisson_tomcat_session:D5C32289A6DD5483FBEABA4A98C5B32A, PooledUnsafeDirectByteBuf(ridx: 0, widx: 12, cap: 256), PooledUnsafeDirectByteBuf(ridx: 0, widx: 178, cap: 256)] after 3 retry attempts at org.redisson.command.CommandAsyncService$8.run(CommandAsyncService.java:544) at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:668) at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:743) at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:471) at java.lang.Thread.run(Thread.java:748)

    We have increased the timeout param but there seemed to make no difference. Are the parameters mentioned in https://github.com/redisson/redisson/wiki/16.-FAQ#q-i-saw-a-redistimeoutexception-what-does-it-mean-what-shall-i-do-can-redisson-team-fix-it the only variables to tune? Could you please point me to the direction, as I'm lost with these issues here?

    Thank you. Kevin

    opened by k3vinwan 50
  • Redisson RMap get response is slow

    Redisson RMap get response is slow

    I've a java application where I'm using Rmap to store and retrieve objects to/from Redis. The response time of map.put(...) is reasonable but map.get(...) is averaging 4000000.0 ns. I'm using FstCodec for serialization/deserialization. The application has many classes that do not provide no arg constructor and hence certain codecs can't be used. I would like to know how to improve the map.get(...) response. When same object to go LinkedHashMap, the response time is in the range of 446.0 ns and I'm looking for a response time in that range. Find attached my sample java application and config file.

    RedissonIPWCTaskTester.java.txt RedisConfig.json.txt

    opened by shashibsingh 46
  • Redisson get api  is very slow !!!!

    Redisson get api is very slow !!!!

    I am using Redisson client with Redis and implemented Redisson as JSR 107 . I am simply calling a cache through jsp but it is taking a lot of time in CountDownLatch.await(). This wait is common for every single request , so what is the possible reason for this wait ????? Is there any client side or server side setting effecting it.... Please find Jprofiler snapshot showing Api call trace.

    issue1


    And please find attached code test code.

    public void getmodulemapTime() throws Exception { long w_start_time = System.nanoTime(); String w_existingMap = (String)CacheService.get(CacheConstants.CACHEKEY.MODULE_CKEY_GLOBAL_MAP, "MODULEMANAGER_GLOBAL_MODULE_MAP_KEY"); long w_end_time = System.nanoTime(); double w_difference = (w_end_time - w_start_time)/1000000; System.out.println("Get Time in ms for MODULE *****" + w_difference); }

    opened by nratta 46
  • Can Redisson be used for Tomcat session and application cache? Getting java.lang.ClassNotFoundException on read

    Can Redisson be used for Tomcat session and application cache? Getting java.lang.ClassNotFoundException on read

    I have a webapp using Redisson to handle Hibernate cache, application cache and session persistence. However, each time my webapp client attempt to READ back from Redis, Redisson give back an java.lang.ClassNotFoundException on every object saved in Redis. If I remove all lib from the lib folder and disable the session manager, the webapp client work perfectly.

    I suspect a class loader conflict, as Redisson's classes are loaded inside the Server Class loader, while the webapp classes inside the Webapp class loader. The sessions objects are working as all is handled at Tomcat level, but the client is jumping between both class loader.

    Anyone was able to get both working altogether, or is it require to use 2 Redis Java client implementation, one for the Session and the other for the Webapps?

    Expected behavior

    Tomcat sessions are saved. Object are saved and restored from Redis in the Webapps

    Actual behavior

    Tomcat Session are saved and restored. Webapps objects are saved but cause a "java.lang.ClassNotFoundException" upon restore.

    Steps to reproduce or test case

    Create a plain tomcat instance. Put redisson-all and redisson-tomcat jars in lib folder Create a war with a 2 serializable entities and a servlet that read and save said entity in the session And the client directly (caching).

    Redis version

    4.0.9

    Redisson version

    3.8.2

    Redisson configuration

    { "singleServerConfig":{ "idleConnectionTimeout":10000, "pingTimeout":1000, "connectTimeout":10000, "timeout":3000, "retryAttempts":3, "retryInterval":1500, "password":null, "subscriptionsPerConnection":5, "clientName":"tomcat", "address": "redis://127.0.0.1:6379", "subscriptionConnectionMinimumIdleSize":1, "subscriptionConnectionPoolSize":50, "connectionMinimumIdleSize":32, "connectionPoolSize":64, "database":1 }, "threads":0, "nettyThreads":0, "codec":{ "class":"org.redisson.codec.SnappyCodec" }, "transportMode":"NIO" }

    RedissonTomcatTest.zip

    bug tomcat 
    opened by pbusquemdf 45
  • Is it possible to set concurrency level for SequentialDnsAddressResolverFactory in Quarkus extension?

    Is it possible to set concurrency level for SequentialDnsAddressResolverFactory in Quarkus extension?

    We're using Quarkus extension 3.18.1, and we observed DnsNameResolverTimeoutException occasionally. We have a lot of k8s pods connecting to AWS Elasticache cluster. We'd like to try to tune the concurrency level of SequentialDnsAddressResolverFactory as suggested in #4577.

    Is it possible to configure the concurrency level of SequentialDnsAddressResolverFactory in Quarkus extension?

    question 
    opened by sara-han 0
  • why ClassCastException happened when  I use Rlist.readAll()

    why ClassCastException happened when I use Rlist.readAll()

    I met some error when I deploy my app. verison 3.17.6 java.Lang.ClassCastException: class java.lang.String cannot be cast to class java.util.List (java.lang.String and java.util.List are in module java.base of loader 'bootstrap") at org. rediss on. RedissonList.readAlI(RedissonList.java:102)

    question 
    opened by qqwangxiaow 1
  • Handler dispatch failed: java.lang.NoSuchMethodError: 'void org.springframework.data.repository.support.Repositories._jr$ip$domainTypeMapping(java.lang.Object, org.springframework.util.ConcurrentLruCache)'

    Handler dispatch failed: java.lang.NoSuchMethodError: 'void org.springframework.data.repository.support.Repositories._jr$ip$domainTypeMapping(java.lang.Object, org.springframework.util.ConcurrentLruCache)'

    Expected behavior

    • use long success

    • use string throw exception

    Actual behavior `

    jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: 'void org.springframework.data.repository.support.Repositories._jr$ip$domainTypeMapping(java.lang.Object, org.springframework.util.ConcurrentLruCache)' at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1095) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1010) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:902) ~[spring-webmvc-6.0.3.jar:6.0.3] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:705) ~[tomcat-embed-core-10.1.4.jar:6.0] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:884) ~[spring-webmvc-6.0.3.jar:6.0.3] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.4.jar:6.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.3.jar:6.0.3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.3.jar:6.0.3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.3.jar:6.0.3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.3.jar:6.0.3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at com.cynray.parent.starter.bff.filter.RequestWrapperFilter.doFilterInternal(RequestWrapperFilter.java:42) ~[cynray-starter-bff-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.3.jar:6.0.3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:97) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:41002) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na] Caused by: java.lang.NoSuchMethodError: 'void org.springframework.data.repository.support.Repositories._jr$ip$domainTypeMapping(java.lang.Object, org.springframework.util.ConcurrentLruCache)' at org.springframework.data.repository.support.Repositories.loadRepositories(Repositories.java:64) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.data.repository.support.Repositories.(Repositories.java:45001) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.data.repository.support.DomainClassConverter.lambda$setApplicationContext$2(DomainClassConverter.java:98) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.data.util.Lazy.getNullable(Lazy.java:229) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.data.util.Lazy.get(Lazy.java:113) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.data.repository.support.DomainClassConverter.getConverter(DomainClassConverter.java:91) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.data.repository.support.DomainClassConverter.matches(DomainClassConverter.java:83) ~[spring-data-commons-3.0.0.jar:3.0.0] at org.springframework.core.convert.support.GenericConversionService$ConvertersForPair.getConverter(GenericConversionService.java:663) ~[spring-core-6.0.3.jar:6.0.3] at org.springframework.core.convert.support.GenericConversionService$Converters.getRegisteredConverter(GenericConversionService.java:560) ~[spring-core-6.0.3.jar:6.0.3] at org.springframework.core.convert.support.GenericConversionService$Converters.find(GenericConversionService.java:544) ~[spring-core-6.0.3.jar:6.0.3] at org.springframework.core.convert.support.GenericConversionService.getConverter(GenericConversionService.java:261) ~[spring-core-6.0.3.jar:6.0.3] at org.springframework.core.convert.support.GenericConversionService.canConvert(GenericConversionService.java:146) ~[spring-core-6.0.3.jar:6.0.3] at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:127) ~[spring-beans-6.0.3.jar:na] at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73) ~[spring-beans-6.0.3.jar:na] at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53) ~[spring-beans-6.0.3.jar:na] at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:729) ~[spring-context-6.0.3.jar:6.0.3] at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:181) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:148) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.3.jar:6.0.3] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080) ~[spring-webmvc-6.0.3.jar:6.0.3] ... 48 common frames omitted ` Steps to reproduce or test case image

    Redis version 7.0.6 Redisson version <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.19.0</version> </dependency>

    <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> Redisson configuration

    image
    opened by fffguo 0
  • Are Redis Functions supported and used to manage tasks like eviction?

    Are Redis Functions supported and used to manage tasks like eviction?

    In Redis 7 they introduced the possibility to use redis functions: https://redis.io/docs/manual/programmability/functions-intro/

    I find this interesting especially for eviction related complex logic, I see in the comments of the RMapCache that you use a complex lua script to manage expiration of the entries. I was wondering whether you use those redis functions when available and if it makes sense in your opinion to add support for them when those are not already used. (I think this approach could be used in other places as well)

    question 
    opened by nicdard 1
  • Fixed NPE while booting when pub message set to null

    Fixed NPE while booting when pub message set to null

    We found it failed to boot after adding redisson dependency into our springboot application. It's because we set the pub message to null just to check the connection with redis and it work well when using lettuce(the pub method we use is org.springframework.data.redis.core.RedisTemplate#convertAndSend).

    opened by MooRoakee 1
  • io.netty.handler.codec.DecoderException: java.lang.IllegalStateException: Can't decode replay: \u0015\u0003\u0001\u0000\u0002\u0002

    io.netty.handler.codec.DecoderException: java.lang.IllegalStateException: Can't decode replay: \u0015\u0003\u0001\u0000\u0002\u0002

    Getting this issue when trying to connect the Gcloud redis from websphere liberty app. This issue is similar to the github request number: https://github.com/redisson/redisson/issues/4333 Kindly provide the solution and that would be helpful.

    Caused by: java.lang.IllegalStateException: Can't decode replay: \u0015\u0003\u0001\u0000\u0002\u0002F org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:281) org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:95) io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:367) 00000068 id= io.netty.channel.DefaultChannelPipeline W onUnhandledInboundException An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.

    question 
    opened by kaviarasupgk 3
Releases(redisson-3.19.1)
  • redisson-3.19.1(Jan 6, 2023)

    Feature - containsEach() method added to RSet object (thanks to @slovvik)
    Feature - getPermits(), acquiredPermits(), setPermits() methods added to RPermitExpirableSemaphore object (thanks to @kscaldef, @derekroller)

    Breaking change - Kryo5Codec uses own serializators to serialize UUID, URI and Pattern objects

    Fixed - RReliableTopic doesn't remove all expired subscribers at once
    Fixed - RPatternTopic messages duplication after failover in cluster if channel starts with __keyspace@ and __keyevent@
    Fixed - RBatch.getListMultimapCache() method should return RMultimapCacheAsync interface
    Fixed - SharedPubSub listener isn't being triggered (thanks to @MrChaos1993)
    Fixed - RSetCacheRx and RSetCacheReactive miss tryAdd() method
    Fixed - RSetRx and RSetReactive objects miss tryAdd() method
    Fixed - RBloomFilter bitset can't be expired and deleted if nameMapper is used (thanks to @javed119)
    Fixed - RMapCacheRx and RMapCacheReactive interfaces miss addListener() method
    Fixed - RMapCacheAsync interface misses addListenerAsync() method
    Fixed - RTopicAsync.addListenerAsync() method uses wrong generic pattern for MessageListener object
    Fixed - RPermitExpirableSemaphore throws CROSSSLOT error in cluster if nameMapper is used

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.19.0(Dec 16, 2022)

    Feature - implementation of Spring Cache methods added in Spring 5.2
    Feature - entriesRead and lag fields added to StreamGroup object
    Feature - added RFencedLock implementation
    Feature - credentialsResolver setting added

    Breaking change - default codec changed to Kryo5Codec

    Fixed - new Redis node isn't discovered between PubSub subscription attempts
    Fixed - codec,nettyHook,addressResolverGroupFactory,connectionListener settings can't be defined through Micronaut config
    Fixed - evictions metrics doesn't work for RedissonCache (thanks @Nicola Dardanis)
    Fixed - PubSub connection isn't reused if it reached subscriptions limit before unsubscribe operation
    Fixed - PubSub connection returns to connection pool only if subscriptions limit was reached
    Fixed - use slf4j late-binding when logging instead of string concat (thanks @vatarasov)
    Fixed - most of pubsub subscriptions fail to resubscribe after failover
    Fixed - RBatch with executionMode = REDIS_WRITE_ATOMIC throws NPE in case of connection starvation
    Fixed - CommandDecoder.messageDecoder() method throws NPE if RBatch object used with executionMode = IN_MEMORY (regression since 3.18.1)
    Fixed - some scheduled tasks aren't executed (regression since 3.17.5)
    Fixed - RFunction doesn't pass keys to Redis correctly (thanks @@jordanrmerrick)
    Fixed - incorrectly reset jackson type factory (thanks @noelvo)
    Fixed - cluster partitions parsing error isn't logged

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.18.1(Nov 30, 2022)

    Feature - Spring Data Redis 3.0.0 module added

    Fixed - PubSub subscription in cluster sometimes doesn't apply to all nodes
    Fixed - command replies don't match if connection pool size < 10 and at least one command failed
    Fixed - RLock throws CancellationException continuously
    Fixed - None of slaves were synced error is thrown after failover during RLock acquisition
    Fixed - AWS Elasticache cluster failover
    Fixed - hRandFieldWithValues() and hRandField() methods of Spring Data Redis module throw ClassCastException
    Fixed - trySetPermitsAsync() method of RPermitExpirableSemaphore object shouldn't allow to overwrite the number of permits if value == 0 (thanks @kscaldef)
    Fixed - RKeys object doesn't use nameMapper
    Fixed - connection leak after master failover

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.18.0(Nov 10, 2022)

    Feature - Tomcat 10.1.x support
    Feature - labels support for RTimeSeries object
    Feature - compatibility with Spring Boot 3 (thanks @olivierboudet)
    Feature - RxJava and Reactive interfaces for RLocalCachedMap object
    Feature - local cache support for JsonBucket object

    Improvement - StringCodec now implements JsonCodec

    Fixed - RDoubleAdder and RLongAdder objects don't work with nameMapper
    Fixed - RBlockingQueue methods should return null if negative timeout defined
    Fixed - RLocalCachedMap.clearLocalCacheAsync() method shouldn't retain semaphore after invocation
    Fixed - Spring Data Redis methods weren't implemented: zRandMember(), zRandMemberWithScore(), zPopMin(), bZPopMin(), zPopMax(), bZPopMax(), zMScore(), zDiff(), zDiffWithScores(), zDiffStore(), zInter(), zInterWithScores(), zUnion(), zUnionWithScores(), hRandField(), hRandFieldWithValues(), copy(), lMove(), bLMove(), lPop(), rPop(), sMIsMember(), getEx(), getDel()
    Fixed - attempts to connect to the failed master after failover in cluster mode
    Fixed - RMapCache MapEntryListener doesn't work with nameMapper
    Fixed - RJsonBucket.getKeys() method doesn't use path parameter
    Fixed - RRateLimiter.getConfig().getRate() throws NPE if it doesn't exist (thanks @Tanky-Zhang)
    Fixed - RTransaction objects should be the same instances on each "get..." call
    Fixed - RScheduledExecutorService cron triggers fire continuously for hours for some time zones (regression since 3.16.5)
    Fixed - RSortedSet.add() throws NPE (thanks @yuwei)
    Fixed - RKeysReactive.getKeysByPattern() method isn't giving all entries if downstream consumer is slow
    Fixed - "Unable to unfreeze entry" errors in sentinel mode
    Fixed - JsonBucket.compareAndSet() method with null as update value deletes whole object
    Fixed - Redis Cluster topology scanned partially in case of DNS resolution error
    Fixed - Slave nodes failed to pass complete initialization shouldn't be added as nodes
    Fixed - ByteBuf leaks when one of multiple parameters can't be encoded
    Fixed - SearchDomainUnknownHostException is thrown occasionally

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.7(Oct 3, 2022)

    Improvement - Failed connection ping isn't taken in account in Redis slave health check

    Fixed - RScheduledExecutorService cron expression doesn't support year
    Fixed - replaceValues() method of RListMultimap and RSetMultimap throws exception for empty collection
    Fixed - RedissonBaseLock throws NPE after failover
    Fixed - Spring Data Redis evalsha() method doesn't use key for Redis node routing in Cluster mode
    Fixed - DNS change isn't detected in replicated mode
    Fixed - RCollectionReactive.addAll() method is executed without subscription
    Fixed - RKeysAsync.countExists() method throws errors in cluster mode
    Fixed - Spring Data Redis reactive setIfAbsent should return false on error (thanks @zhuangzibin)
    Fixed - Micronaut native image configuration
    Fixed - RBatchReactive execution stuck forever if useScriptCache = true
    Fixed - NameMapper is applied incorrectly to RBoundedBlockingQueue object
    Fixed - incorrect IPv6 conversion
    Fixed - Spring Boot Module ignores username parameter set via Spring Redis config
    Fixed - SpringBoot yaml configuration parsing errors shouldn't be suppressed

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.6(Aug 25, 2022)

    Feature - Helidon 3.0 support
    Feature - ability to specify MapWriterAsync and MapLoaderAsync in MapOptions object

    Improvement - log output string expanded to 1000 characters by default

    Fixed - RBuckets methods don't use nameMapper
    Fixed - PingConnectionHandler should close channel on RedisLoadingException, RedisTryAgainException, RedisClusterDownException, RedisBusyException
    Fixed - Invocation timeout isn't applied for RTopic.removeListenerAsync() methods
    Fixed - WriteBehind task isn't stopped after RMap.destroy() method invocation
    Fixed - Connection pinging works incorrectly if new connections were created in pool
    Fixed - "SlaveConnectionPool no available Redis entries" error occurs in Cluster caused by early excluding of master node from nodes for reading
    Fixed - Permanent blocking calling threads

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.5(Jul 26, 2022)

    Feature - touch(), unlink() and delete() methods implemented for transactional RSetCache and RSet objects
    Feature - transactional RBucket, RMap, RMapCache, RSetCache, RSet objects support expire(), expireAt() and clearExpire() methods
    Feature - ExecutorOptions.idGenerator() setting added
    Feature - methods with task id added to RExecutorService interface

    Fixed - duplicate subscriptions with RedisMessageListenerContainer in Spring Data Redis 2.7
    Fixed - NameMapper applied twice to transactional RBucket
    Fixed - some Quarkus environment variables clear all Redisson properties set through config file
    Fixed - RJsonBucket.delete() method doesn't work
    Fixed - RExecutorService.submitAsync(Callable, long, TimeUnit) method throws ClassCastException (thanks @xyqshi) Fixed - Lock synced slaves check
    Fixed - reactive scripting commands throw ClassCastException if result is list of list
    Fixed - RBatch.getJsonBucket() method should return RJsonBucketAsync interface

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.4(Jun 16, 2022)

    Feature - RJsonBucket object added for JSON.* commands support
    Feature - RFunction and RShardedTopic objects added to RBatch

    Fixed - continuous "Unable to unfreeze entry" error in Sentinel mode
    Fixed - nameMapper setting isn't applied to RExecutorService and RScheduledExecutorService
    Fixed - channel write exception may lead to wrong commands order
    Fixed - don't connect to sentinel resolved by DNS if it's not included in result of SENTINEL SENTINELS command
    Fixed - RScript.load() method shouldn't use failed Redis nodes
    Fixed - RPermitExpirableSemaphore.acquireAsync() method hangs until leaseTimeout occurs. (regression since 3.16.8)
    Fixed - use 60 seconds polling instead of take command for RRemoteService responses
    Fixed - eval() and evalSha() methods of Spring Data Redis ReactiveScriptingCommands object throws IndexOutOfBoundsException
    Fixed - expired entries eviction process is limited to 5000 per call
    Fixed - sharded topic isn't resubscribed after channel reconnection
    Fixed - execution of blpop command leads to reconnection

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.3(May 27, 2022)

    Feature - Hibernate 6 support

    Improvement - amount of created connections in parallel reduced to 2 for better stability

    Fixed - Spring Boot Starter doesn't start with Spring Boot 2.7
    Fixed - RRateLimiter doesn't allow to set expiration time of permits and values

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.2(May 23, 2022)

    Feature - RScoredSortedSet.replace() method added
    Feature - Spring Data Redis 2.7.0 module added
    Feature - RPatternTopic.removeAllListenersAsync() method added
    Feature - RShardedTopic object added (requires Redis 7.0+)
    Feature - allow to specify username and password in redis connection url
    Feature - JCache data partitioning with local cache support

    Fixed - "Can't add slave" exceptions after fail over in cluster mode
    Fixed - "Unable to acquire subscription" error after connection interruption
    Fixed - JCache hangs forever when getting value from cache with useScriptCache=true
    Fixed - RMap.merge() method hangs if MapLoader specified
    Fixed - FairLock thread counter should start from 1 (thanks to @thisiswanghy)

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.1(Apr 25, 2022)

    Feature - transient fields support for LiveObjects to avoid data serialization
    Feature - removeAllListenersAsync() method added to RTopic object
    Feature - transactionAware setting added to RedissonSpringCacheManager

    Improvement - amount of created connections in parallel reduced to 5, for better stability

    Fixed - RedissonReactiveClient.getMultilock() method should accept RLockReactive objects
    Fixed - RedissonRxClient.getMultilock() method should accept RLockRx objects
    Fixed - don't close connection on error response during topology scan
    Fixed - SET command should be an idempotent operation
    Fixed - MasterSlaveConnectionManager throws ClassCastException if host unknown
    Fixed - RReadWriteLock renewal doesn't work if writeLock released before readLock then both were acquired
    Fixed - Spring Data Redis module. Scan In cluster mode, other nodes cannot be scanned
    Fixed - RReliableTopic object throws "attempt to compare nil with number" error
    Fixed - RedissonSpinLock.tryLock() method returns false instead of true if the remaining wait time is negative
    Fixed - an error should be thrown if merge(), compute(), computeIfAbsent() and computeIfPresent() of RMap used in batch
    Fixed - Unable to specify timezone in CronSchedule object
    Fixed - RMapCache.destroy() method throws NPE
    Fixed - RLock.tryLock() method throws CancellationException
    Fixed - Unable to connect to Redis server error is thrown due to NPE
    Fixed - RBlockingQueue.pollLastAndOfferFirstTo() throws ClassCastException if result is empty
    Fixed - internal AsyncSemaphore doesn't skip canceled tasks in the same thread
    Fixed - RLocalCachedMap.getAll() method doesn't respect storeCacheMiss setting
    Fixed - 0 value for waitTime and leastTime isn't handled correctly by RMultiLock object
    Fixed - Spring Data Redis module. RedissonConnection.execute() method doesn't invoke overloaded methods correctly

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.17.0(Mar 21, 2022)

    Feature - RFunction object added (requires Redis 7.0+)
    Feature - pollLastEntriesFromAny() and pollFirstEntriesFromAny() methods added to RScoredSortedSet object (requires Redis 7.0+)
    Feature - expireIfSet(), expireIfNotSet(), expireIfGreater() and expireIfLess() methods added to RExpirable interface (requires Redis 7.0+)
    Feature - checkLockSyncedSlaves setting added
    Feature - getAndExpire and getAndClearExpire() methods added to RBucket object (requires Redis 6.2.0+)
    Feature - pollFirstFromAny() and pollLastFromAny() methods with timeout and count added to RScoredSortedSet object (requires Redis 7.0+)
    Feature - pollFirst() and pollLast() methods with timeout and count added to RScoredSortedSet object (requires Redis 7.0+)
    Feature - addAllIfLess(), addAllIfGreater(), addAllIfExist(), addAllIfAbsent() methods added to RScoredSortedSet object
    Feature - RExpirable.expire(Duration) method added
    Feature - RExpirable.expireTime() method added (requires Redis 7.0+)
    Feature - range(), rangeReversed(), entryRange(), entryRangeReversed() methods with limit parameter added to RTimeSeries object
    Feature - TransactionalOperation.syncSlaves setting added
    Feature - pollFirstFromAny() and pollLastFromAny() methods added to RBlockingQueue object (requires Redis 7.0+)

    Improvement - read-only cached scripts should be executed on slaves (requires Redis 7.0+)
    Improvement - SORT_RO command is used for slave nodes (requires Redis 7.0+)
    Improvement - decrease size of allocated data by RPermitExpirableSemaphore

    Fixed - RedissonLocalCachedMap.clearLocalCache() method throws IllegalArgumentException
    Fixed - RedissonMultiLock doesn't work properly with RedissonSpinLock
    Fixed - SlaveConnectionPool no available Redis entries error occurs in Cluster mode
    Fixed - RKeys.deleteByPattern() method does not always delete keys correctly
    Fixed - expireAt(Instant) method of RExpirableReactive and RExpirableRx interfaces doesn't work
    Fixed - wrong detection of added and removed slots in Redis Cluster mode
    Fixed - RScoredSortedSet.addIfGreater() and RScoredSortedSet.addIfLess() methods always return false
    Fixed - Spring Data Connection in multi mode causes thread stuck (regression since 3.16.7)
    Fixed - Sentinel username setting is not applied (thanks to @nicolas-tg-ch)
    Fixed - RTimeSeries doesn't handle same values for different timestamps
    Fixed - Quarkus environment variables aren't parsed correctly
    Fixed - check expiration before release in RPermitExpirableSemaphore (thanks to @randomVariable2)
    Fixed - RedisTimeoutException: Command execution timeout for command: (PING) (regression since 3.16.3)
    Fixed - wrong wait time calculation in RedissonMultiLock lock method causes deadlock
    Fixed - RLocalCachedMap throws NPE if cache update listener receives message during init
    Fixed - AsyncRemoteProxy throws Redisson is shutdown exception
    Fixed - RedisClusterNode.clusterSlots() method throws Exception

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.8(Jan 21, 2022)

    Fixed - Quarkus redisson config fails to load in cluster mode with one node address
    Fixed - registered RReliableTopic listener doesn't get old messages
    Fixed - pubsub channel isn't released if subscription timeout occurred
    Fixed - Quarkus Redisson config should be read at runtime
    Fixed - RTopic channels aren't unsubscribed
    Fixed - race condition causes Subscription timeout
    Fixed - RMapCache.readAllKeySet() doesn't use MapKey codec
    Fixed - Spring Data Redis RedissonConnection doesn't implement lpos command (thanks @woodyDM)
    Fixed - master host isn't formatted into compressed format for IPV6 addresses in Sentinel mode
    Fixed - Spring Data Redis restore() method throws Busy exception

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.7(Dec 23, 2021)

    Improvement - MessageListener should be annotated by FunctionalInterface

    Fixed - RScript.scriptLoad() method doesn't load script into Slave nodes
    Fixed - Spring Data RedissonConnection eval should use ByteArrayCodec (thanks @woodyDM)
    Fixed - RSet.distributedIterator() and RScoredSortedSet.distributedIterator() methods throw script error
    Fixed - synced slaves amount is not checked in RLock object
    Fixed - race condition during hostname resolution in sentinel mode which may cause slave shutdown
    Fixed - error should be thrown if slaves aren't defined in MasterSlave mode and readMode != MASTER
    Fixed - master node shouldn't be initialized as slave in single mode
    Fixed - can't find node error arise in replicated mode

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.6(Dec 6, 2021)

  • redisson-3.16.5(Nov 30, 2021)

    Feature - countIntersection() method added to RSet object
    Feature - added reactive interface for RListMultimapCache and RSetMultimapCache objects
    Feature - sentinelUsername setting added
    Feature - added distributed iterator (thanks @Vorotyntsev)
    Feature - added Spring Data Redis 2.6.0 support

    Fixed - RedissonConnectionFactory.getReactiveConnection() method of Spring Data Redis isn't compatible with Redis cluster mode
    Fixed - Mybatis RedissonCache should search redisson.yaml config at root package
    Fixed - Can't find host in slaves! error after failover with a new IP of master host
    Fixed - failed slaves aren't detected in Replicated mode
    Fixed - get operation before put may cause inconsistent state of local cache
    Fixed - RList.remove(object, count) throws exception if multiple objects were removed (thanks @cartermc24)
    Fixed - RLocalCachedMap.delete() method clears local cache asynchronously
    Fixed - IdleConnectionWatcher shouldn't close RedisPubSubConnection if it's in subscribed state
    Fixed - SSL is not used for Sentinel master host
    Fixed - update sync strategy of LocalCachedMap objects shouldn't apply updated value twice to instance of update source
    Fixed - JCache dependency updated to 1.1.1
    Fixed - Sentinel master-host = ? setting isn't handled properly during slave check
    Fixed - RBuckets.trySet() method throws CROSSSLOT error (thanks to @deerRule)
    Fixed - DNS monitor makes a new attempt to change master while current attempt wasn't finished

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.4(Oct 29, 2021)

    Feature - sentinelsDiscovery setting added
    Feature - quarkus.redisson.file setting added to redisson-quarkus module to define external Redisson config file

    Improvement - optimization of ClusterConnectionManager.checkSlaveNodesChange() and ClusterConnectionManager.checkMasterNodesChange() methods

    Fixed - master change monitoring task in Replicated mode stops execution if it's invoked before the dns change
    Fixed - RemoteService cannot be called if requestId is null (thanks to @jimichan)
    Fixed - codec is not applied to RBuckets.set() method in non Cluster mode
    Fixed - recovered slave shouldn't be added again in Redis Cluster mode
    Fixed - releaseConnection method may cause StackOverflowError
    Fixed - MOVED response with hostname isn't handled properly
    Fixed - RStream.readGroup() method throws IndexOutOfBoundsException if group has a message without data
    Fixed - NPE in CommandPubSubDecoder
    Fixed - RExecutorService may execute same task twice at the same time
    Fixed - dependencies for testing should use appropriate scope
    Fixed - RPriorityQueue.add() method uses async method
    Fixed - don't retry non-idempotent operations which were successfully sent
    Fixed - RMapCache.fastRemove throws RedisException: too many results to unpack
    Fixed - RRateLimiter decreases limit over the time in highly concurrent environment
    Fixed - don't PING connection if it's in use

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.3(Sep 21, 2021)

    Improvement - RBuckets.get() method should group keys by slot in Redis Cluster mode
    Improvement - RBatch result decoding optimization

    Fixed - RExecutorService, RRemoteService execution may hang if connection used for tasks pooling was interrupted
    Fixed - RBatch with skipResult() option affects result of other commands (regression since 3.16.1)
    Fixed - connection leak (regression since 3.16.1)
    Fixed - getBuckets().set() method throws CROSSSLOT error (thanks to @mikawudi)
    Fixed - RedissonMapCache.addListener() method throws NPE
    Fixed - master-host of Slave node isn't resolved in Sentinel mode
    Fixed - interrupted RLock.tryLock() method keeps renewing lock indefinitely (thanks to @Cesarla)
    Fixed - don't ping connection if it's in use
    Fixed - natMapper isn't applied to resolved Sentinel and Cluster hosts

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.2(Sep 5, 2021)

    Feature - Micronaut 3.0 integration
    Feature - added batched merge() method to RLiveObjectService interface
    Feature - resolve hostnames used in Redis Cluster topology
    Feature - resolve hostnames used in Redis Sentinel topology
    Feature - added batched addLast() and addFirst() methods to RDeque, RDequeRx and RDequeReactive interfaces
    Feature - added addAllCounted() and removeAllCounted() methods to RSet, RSetRx and RSetReactive interfaces

    Fixed - Redis Stream trim command with MINID strategy is not fully supported
    Fixed - Quarkus requires AutowiredAnnotationBeanPostProcessor class during native image execution
    Fixed - issues with Quarkus Netty dependencies
    Fixed - MOVED redirection loop detected error in Redis Cluster
    Fixed - handling master with empty slots in Redis Cluster topology
    Fixed - SentinelConnectionManager should use unified compressed format for IPv6
    Fixed - RLocalCachedMap.readAllValues() method uses key decoder instead of value
    Fixed - empty array passed to RKeys.delete() method causes thread blocking
    Fixed - cluster partition without address causes NPE
    Fixed - threads waiting for RSemaphore permits acquisition unable to acquire them if permits added
    Fixed - RRateLimiter allows limit overcome
    Fixed - RMapCacheReactive and RMapCacheRx interfaces miss method to define eviction algorithm
    Fixed - write-behind tasks aren't flushed after Redisson shutdown() method invocation
    Fixed - LiveObjects with indexed field can't be stored using batch persist method
    Fixed - failed master shouldn't skipped in Redis Cluster topology scan (thanks to @JerryWzc)
    Fixed - RListReactive iterator with filter returns non-deterministic result
    Fixed - replicatedServers mode should use ip addresses if nodes defined using hostnames
    Fixed - multiple masters check removed for replicatedServers mode
    Fixed - MapWriter should be defined along with writeBehind settings

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.1(Jul 26, 2021)

    Improvement - MarshallingCodec and JsonJacksonCodec warmup added
    Improvement - performance improvement for connection pool with few connections

    Fixed - connection leak after command error if Batch executed in REDIS_WRITE_ATOMIC mode Fixed - AsyncSemaphore race condition issue
    Fixed - Quarkus native remote service invocation fails
    Fixed - nameMapper setting isn't applied to RTopic object
    Fixed - Batch in REDIS_WRITE_ATOMIC mode doesn't respect batch settings
    Fixed - UndeclaredThrowableException is thrown when cache down while executing RLiveObjectService.get() method
    Fixed - Reactive Transactions aren't unlocking transactional locks
    Fixed - keySet() method of transactional map throws Exception
    Fixed - lock expiration renewal should be canceled if owner doesn't exist (thanks to @regidio)

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.16.0(Jun 29, 2021)

    Feature - GraalVM native-image support
    Feature - Spring Data Redis 2.5.x support
    Feature - Helidon CDI integration
    Feature - Quarkus integration
    Feature - Micronaut integration
    Feature - data partitioning support for JCache

    Fixed - Live Object Conditions.in() aren't considered if defined in Conditions.and() clause
    Fixed - Redisson shutdown takes much time after RBatch execution
    Fixed - RBatch object in REDIS_WRITE_ATOMIC or REDIS_READ_ATOMIC mode can be corrupted by PING command
    Fixed - RKeysReactive.getKeysByPattern() method returns wrong result
    Fixed - RExpirable.expire(Instant) method doesn't work for RBloomFilter, RBoundedBlockingQueue, RDelayedQueue, RLock, RIdGenerator, RMultimap, RMapCache, RPriorityQueue, RRateLimiter, RReliableTopic, RSetMultimap, RTimeSeries objects
    Fixed - RBlockingDequeReactive.takeElements() method does not consume all elements
    Fixed - RScheduledExecutorService stops to work if task timeout occurred
    Fixed - RedissonReactiveSubscription removes listener after first 32 messages
    Fixed - RedisNodeNotFoundException is thrown after cluster failover (thanks to @UzimakiNaruto)

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.6(Jun 8, 2021)

    Fixed - RedisSentinel.getMaster() method throws NPE
    Fixed - RSemaphore.drainPermits() throws ClassCastException
    Fixed - missed implementation of few methods in Spring Data's RedissonConnection
    Fixed - RLocalCachedMap.containsKey() method doesn't invoke map loader
    Fixed - RSemaphore permits can't be acquired due to "Maximum permit count exceeded" error
    Fixed - RedissonNode unable to start due to ClassNotFoundException
    Fixed - SENTINEL SENTINELS command timeout (thanks to @zhwq1216)
    Fixed - JCachingProvider shouldn't depend on class from Jackson 2.12.x
    Fixed - JCache.get() method swallows Redis errors
    Fixed - RLocalCachedMap doesn't used MapLoader if storeMode = LOCALCACHE

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.5(May 12, 2021)

    Feature - discard() method added to RBatch object
    Feature - broadcastSessionUpdates setting added to Tomcat Session Manager

    Fixed - no error if jcache has wrong configuration in yaml format
    Fixed - frequent Redis master failover causes memory leak in IdleConnectionWatcher
    Fixed - RedisStreamCommands.xGroupDelConsumer() method in Spring Data module uses incorrect Redis command
    Fixed - RLock can't be acquired anymore if pubsub connection limit was reached (thanks to @zhwq1216)
    Fixed - PubSub Lock entries memory-leak during Lock acquisition (thanks to @zhwq1216)
    Fixed - dns monitor shouldn't use IP addresses as hostnames
    Fixed - failover handling stops to work if Redis Cluster node returned empty topology
    Fixed - mGet() and mSet() methods of Spring Data RedissonConnection object throw CROSSSLOT error
    Fixed - touch(), mDel(), mUnlink(), expire(), pExpire(), expireAt(), pExpireAt(), persist() methods of Spring Data ReactiveKeyCommands interface should be executed as write operation
    Fixed - RMap.computeIfPresent() doesn't update mutable objects
    Fixed - MapReduce timeout isn't applied if ExecutorService node is down
    Fixed - Redisson tries reconnect to Redis nodes which marked as shutdown by topology manager

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.4(Apr 20, 2021)

    Feature - sslProtocols setting added
    Feature - nameMapper setting added
    Feature - getSigned(), setSigned(), incrementAndGetSigned(), getUnsigned(), setUnsigned(), incrementAndGetUnsigned() methods added to RBitSet object
    Feature - updateEntryExpiration(), getWithTTLOnly() methods added to RMapCache object

    Improvement - Spring Cache, MyBatis Cache, Hibernate Cache implementations should read data from Redis slave if idleTime and cache size weren't specified

    Fixed - ClusterConnectionManager.upDownSlaves() method throws ConcurrentModificationException
    Fixed - ClusterConnectionManager.checkMasterNodesChange() method throws NPE
    Fixed - JCache CacheEntryUpdatedListener doesn't get old value of changed entry (thanks to @testower)

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.3(Mar 31, 2021)

    Feature - connectionListener setting added

    Fixed - tryAcquire() and availablePermits() method of RRateLimiter object throw too many results to unpack error
    Fixed - RRateLimiter object throws LUA-script error
    Fixed - connection leak in Topology Manager for Replicated Redis config
    Fixed - ConnectionListener.onConnect() method isn't triggered during Redisson start
    Fixed - addLastIfExists() and addLastIfExists() methods of RDeque object don't work
    Fixed - ArrayIndexOutOfBoundsException is thrown if Redis master change was unsuccessful
    Fixed - RScheduledExecutorService.scheduleAtFixedRate() starts multiple instances of the same task if multiple workers defined
    Fixed - tasks scheduled via RScheduledExecutorService.scheduleAtFixedRate() method aren't executed after some time

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.2(Mar 22, 2021)

    Feature - move() method added to RDeque and RBlockingDeque objects
    Feature - MINID trimming strategy and LIMIT argument added to RStream.add() method
    Feature - new config checkSlaveStatusWithSyncing setting added (thanks to @mikawudi)
    Feature - enable tcpNoDelay setting by default
    Feature - RedissonClient.reactive() and RedissonClient.rxJava() methods added
    Feature - Spring Boot auto configuration should create Reactive and RxJava instances

    Improvement - simplified API of RStream.read() and RStream.readGroup()

    Fixed - Hibernate modules prior 5.3 version don't support fallback for nextTimestamp() method
    Fixed - MarshallingCodec doesn't release allocated ByteBuf object if exception thrown during encoding
    Fixed - retryInterval isn't used for next attempt if Redis client didn't send response
    Fixed - lease timeout updated in non-safe way in org.redisson.RedissonLock#tryLockInnerAsync method (thanks to @coding-tortoise)
    Fixed - references in RxJava objects aren't supported
    Fixed - Spring Data Redis module doesn't support StreamReadOptions.isNoack() option in RedisStreamCommands.xReadGroup() method. Fixed - trying to authentificate sentinel server without password
    Fixed - RStream.getInfo() method doesn't decode entries
    Fixed - Redisson doesn't reconnect slave if it was excluded before due to errors in failedSlaveCheckInterval time range. (thanks to @mikawudi)

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.1(Mar 3, 2021)

    Feature - expireAt(Instant) method added to RExpirable object
    Feature - random() method added to RScoredSortedSet object
    Feature - randomKeys() and randomEntries() methods added to RMap object
    Feature - count with any parameter added for search in RGeo object
    Feature - ability to search in box added for RGeo object

    Improvement - simplified RGeo API with search methods
    Improvement - added check for invocation of sync methods in async/rx/reactive listeners

    Fixed - continuous reconnecting to broken host if it was defined as hostname in Redisson Cluster config
    Fixed - WeightedRoundRobinBalancer filters master node in readMode=ReadMode.MASTER_SLAVE
    Fixed - RPatternTopicReactive.removeListener() method should return Mono<Void>
    Fixed - remove authType and principal attributes on Apache Tomcat logout
    Fixed - scheduled tasks via RScheduledExecutorService object can't be canceled
    Fixed - RStream.claim() method throws NPE if given id does not exist
    Fixed - RPatternTopic on keyspace/keyevent notification subscribes only to single master node in Redis cluster
    Fixed - Class cast exception is thrown during iteration of RMapCache entries
    Fixed - internal RedissonBaseLock.evalWriteAsync() method isn't executed again if cluster slaves amount > 0
    Fixed - CPU spike after Slave failover if subscriptionMode=SLAVE
    Fixed - rename() method throws throws RedisException if RBloomFilter is empty
    Fixed - output full exception stacktrace if unable connect to sentinel server
    Fixed - duplicated PING sent when Redis connection got reconnected
    Fixed - Optional class can't be used as a result object in RemoteService interface
    Fixed - redisson-spring-boot-starter should use redisson-spring-data-24 module
    Fixed - RMapCacheRx.getLock() returns org.redisson.RedissonLock instead of org.redisson.api.RLockRx
    Fixed - RMapCacheReactive.getLock() returns org.redisson.RedissonLock instead of org.redisson.api.RLockReactive

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.15.0(Jan 29, 2021)

    Feature - Apache Tomcat 10 support added
    Feature - Spin Lock added. Please refer to documentation for more details (thanks to @Vorotyntsev)
    Feature - sentinelPassword setting added (thanks to @ghollies)
    Feature - RedisNode.getMemoryStatistics() method added
    Feature - setAndKeepTTL() method added to RBucket object
    Feature - min idle time parameter added to listPending() and pendingRange() methods of RStream object
    Feature - autoClaim(), fastAutoClaim() and createConsumer() methods added to RStream object
    Feature - addIfExists(), addIfGreater() and addIfLess() methods added to RScoredSortedSet object
    Feature - putIfExists() and fastPutIfExists() methods added to RMap object
    Feature - tryAdd() and addIfExists() methods added to RGeo object
    Feature - readUnion(), readIntersection(), diff(), readDiff(), rangeTo(), revRangeTo() methods added to RScoredSortedSet object
    Feature - ScoredSortedSetAddListener added to RScoredSortedSet object

    Improvement - use System.nanoTime() in IdleConnectionWatcher to avoid clock drifting

    Fixed - eval command executed on Redis cluster doesn't use key for master/slave selection
    Fixed - MOVED or ASK response from Redis causes Unable to acquire connection! error
    Fixed - Spring Redis Data PatternTopic listeners are invoked multiple times per message
    Fixed - don't add Redis Slave as active if connections can't be established (thanks to @yann9)
    Fixed - RBatch object throws Exception if not all slots are covered in Redis Cluster
    Fixed - stream and queue object may lost entry during execution of any blocking poll operation
    Fixed - Redis BUSY response handling (thanks to @wuqian0808)
    Fixed - InterruptedExceptions are hidden by RedisException
    Fixed - primitive class numbers aren't indexed correctly in LiveObject search engine
    Fixed - NPE is thrown if LiveObject index stored for the first time in Redis cluster
    Fixed - NPE is thrown if Redis node doesn't return "flags" parameter

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.14.1(Dec 22, 2020)

    Feature - added option LocalCachedMapOptions.storeCacheMiss to store cache miss in a local cache (thanks to @ipalbeniz)
    Feature - LFU eviction algorithm added to trySetMaxSize and setMaxSize methods of RMapCache interface

    Improvement - RedisNodes ping results check optimization (thanks to @blackstorm)
    Improvement - keySet().isEmpty() and values().isEmpty() methods of RMap object aren't efficient

    Fixed - connection leak if new discovered slaves in LOADING Redis is loading the dataset in memory state (thanks to @mikawudi)
    Fixed - RMap.putIfAbsent() method doesn't check value for null
    Fixed - Apache Tomcat Valve objects should be added in context pipeline instead of engine's pipeline
    Fixed - slaves synchronization timeout isn't respected during RLock.lock() method invocation
    Fixed - ConnectionWatchdog may cause connection leak (thanks to @mikawudi)
    Fixed - Redisson.shutdown() method throws RejectedExecutionException
    Fixed - count() and addAll() methods of RScoredSortedSetReactive and RScoredSortedSetRx interfaces throw ClassCastException
    Fixed - GEORADIUS_RO command should be used instead of GEORADIUS in Spring Redis Data module
    Fixed - Spring Data Redis RedissonConnection.del() method doesn't work in pipeline on Redis cluster
    Fixed - RLocalCachedMap.putAll() method updates in wrong way log used for Reconnection.LOAD strategy
    Fixed - redisRepository.opsForSet().distinctRandomMembers() method throws ClassCastException

    Source code(tar.gz)
    Source code(zip)
  • redisson-3.14.0(Nov 22, 2020)

    Spring Session implementation is deprecated now. Please refer to documentation for more details

    Feature - RReliableTopic object added. Please refer to documentation for more details
    Feature - IdGenerator object added. Please refer to documentation for more details
    Feature - Spring Data Redis 2.4.0 integration
    Feature - StreamMessageId.AUTO_GENERATED const added
    Feature - Rx API for RMultimapCache object (thanks to @mlkammer)
    Feature - cluster-safe implementation of rename, renameNX methods of RedissonClusterConnection object (thanks to @eager)
    Feature - RxJava2 API replaced with RxJava3
    Feature - tryAdd() method added to RSet and RSetCache objects

    Improvement - preventing sending CLUSTER NODES to the same host (thanks to @serssp)

    Fixed - RSetMultimap could throw a class cast exception on its get() method because it actually contained a list based multimap instance (thanks to @mlkammer)
    Fixed - Spring Data Redis redisTemplate.opsForGeo().radius() method doesn't work
    Fixed - RKeys.deleteByPattern() method executed in batch should throw UnsupportedOperationException in cluster mode
    Fixed - CACHE_REGION_PREFIX setting isn't applied for hibernate 5.3+
    Fixed - deprecation error log about JSON config even though it's not used
    Fixed - update new master record in DNS monitor only if it replaced old master successfully
    Fixed - RQueue.removeIf() method should throw UnsupportedOperationException
    Fixed - Lock watchdog won't renew after reconnection (thanks to @burgleaf)
    Fixed - TimeSeries.iterator() method doesn't respect the ordering
    Fixed - RRateLimiter throws "bad argument #2 to 'unpack' (string expected, got nil)."
    Fixed - CROSSSLOT error rised when clearing a redis-spring-data cache
    Fixed - RLongAdder.sum() and RDoubleAdder.sum() methods return wrong result
    Fixed - getting error while connecting to sentinel using password
    Fixed - result of RStream.read() method isn't sorted by key

    Source code(tar.gz)
    Source code(zip)
Owner
Redisson
Redis Java client with features of In-Memory Data Grid
Redisson
Netflix, Inc. 23.1k Jan 5, 2023
BitTorrent library and client with DHT, magnet links, encryption and more

Bt A full-featured BitTorrent implementation in Java 8 peer exchange | magnet links | DHT | encryption | LSD | private trackers | extended protocol |

Andrei Tomashpolskiy 2.1k Jan 2, 2023
Simple and lightweight sip server to create voice robots, based on vert.x

Overview Lightweight SIP application built on vert.x. It's intended to be used as addon for full-featured PBX to implement programmable voice scenario

Ivoice Technology 7 May 15, 2022
A reactive dataflow engine, a data stream processing framework using Vert.x

?? NeonBee Core NeonBee is an open source reactive dataflow engine, a data stream processing framework using Vert.x. Description NeonBee abstracts mos

SAP 33 Jan 4, 2023
Backend for HR Admin Console with Spring Boot

HR-ADMIN 后台管理系统 项目简介 一个基于 Spring Boot 2.1.0 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue 的前后端分离的后台管理系统 默认账号密码: admin / 123456 主要特性 使用最新技术栈,社区资源丰富。

Wensen Ma 13 Feb 14, 2021
Fault tolerance and resilience patterns for the JVM

Failsafe Failsafe is a lightweight, zero-dependency library for handling failures in Java 8+, with a concise API for handling everyday use cases and t

Jonathan Halterman 3.9k Dec 29, 2022
Fibers, Channels and Actors for the JVM

Quasar Fibers, Channels and Actors for the JVM Getting started Add the following Maven/Gradle dependencies: Feature Artifact Core (required) co.parall

Parallel Universe 4.5k Dec 25, 2022
Resilience4j is a fault tolerance library designed for Java8 and functional programming

Fault tolerance library designed for functional programming Table of Contents 1. Introduction 2. Documentation 3. Overview 4. Resilience patterns 5. S

Resilience4j 8.5k Jan 2, 2023
Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.

Zuul Zuul is an L7 application gateway that provides capabilities for dynamic routing, monitoring, resiliency, security, and more. Please view the wik

Netflix, Inc. 12.4k Jan 3, 2023
Build highly concurrent, distributed, and resilient message-driven applications on the JVM

Akka We believe that writing correct concurrent & distributed, resilient and elastic applications is too hard. Most of the time it's because we are us

Akka Project 12.6k Jan 3, 2023
Distributed Stream and Batch Processing

What is Jet Jet is an open-source, in-memory, distributed batch and stream processing engine. You can use it to process large volumes of real-time eve

hazelcast 1k Dec 31, 2022
a blockchain network simulator aimed at researching consensus algorithms for performance and security

Just Another Blockchain Simulator JABS - Just Another Blockchain Simulator. JABS is a blockchain network simulator aimed at researching consensus algo

null 49 Jan 1, 2023
Apache Mesos is a cluster manager that provides efficient resource isolation and sharing across distributed applications, or frameworks

Apache Mesos is a cluster manager that provides efficient resource isolation and sharing across distributed applications, or frameworks. It can run Hadoop, Jenkins, Spark, Aurora, and other frameworks on a dynamically shared pool of nodes.

The Apache Software Foundation 5k Dec 31, 2022
A reactive Java framework for building fault-tolerant distributed systems

Atomix Website | Javadoc | Slack | Google Group A reactive Java framework for building fault-tolerant distributed systems Please see the website for f

Atomix 2.3k Dec 29, 2022
a reverse proxy load balancer using Java. Inspired by Nginx.

Project Outline: Project Main coding reverse proxy support configuration adding unit test works on Websocket Stress Test compared to Nginx load balanc

Feng 12 Aug 5, 2022
Java software that notifies by voice when a new Vaccine is available in your specified district/pincode

CowinVaccineAvailabilitySpeaker is a Java software that notifies user by voice when a new vaccine is available in the specified pin-code/district. It

Abhishek Chawla 10 May 24, 2021
Rqueue aka Redis Queue [Task Queue, Message Broker] for Spring framework

Rqueue: Redis Queue, Task Queue, Scheduled Queue for Spring and Spring Boot Rqueue is an asynchronous task executor(worker) built for spring and sprin

Sonu Kumar 221 Jan 5, 2023
Program finds average number of words in each comment given a large data set by use of hadoop's map reduce to work in parallel efficiently.

Finding average number of words in all the comments in a data set ?? Mapper Function In the mapper function we first tokenize entire data and then fin

Aleezeh Usman 3 Aug 23, 2021