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
  • RScoredSortedSet.remove only works with I use the original object instance

    RScoredSortedSet.remove only works with I use the original object instance

    Hello there! Unfortunately RScoredSortedSet remove is not properly working. It only works if I remove using the original object instance, if I use a copy (provided by redisson) my object is not removed, even though both objects are equals. DataVO is using lombok, I also tried building my own equals/hash code and not use lombok, but the issue persists.

    Expected behavior After using RScoredSortedSet.remove with a object copy, the object to not be there anymore.

    Actual behavior After using RScoredSortedSet.remove with a object copy, my object can still be found in the set

    Steps to reproduce or test case

    public class MainTest {
    
        private static String PREFIX = "ABC";
        private static String SORTED_SET = "SORTED_SET";
    
        @Test
        public void test() {
            Config config = new Config();
            config.useSingleServer()
                    .setAddress("redis://localhost:6379")
                    .setNameMapper(createNameMapper());
    
            try {
                RedissonClient redissonClient = Redisson.create(config);
                redissonClient.getKeys().deleteByPattern("*");
    
                DataVO vo = new DataVO(1, new HashSet<>(Arrays.asList("1","2")));
                RScoredSortedSet<Object> scoredSortedSet = redissonClient.getScoredSortedSet(SORTED_SET);
    
                scoredSortedSet.addScore(vo, 1);
    
                Collection<ScoredEntry<Object>> scoredEntries = scoredSortedSet.entryRange(0, true, 1, true);
    
                for (ScoredEntry<Object> entry : scoredEntries) {
                    System.out.println("Found " + entry.getValue());
                    System.out.println("Equals? " + entry.getValue().equals(vo));
                    scoredSortedSet.remove(entry.getValue()); //Remove works if I use 'vo' (the original object instance)
                }
    
                scoredEntries = scoredSortedSet.entryRange(0, true, 1, true);
    
                for (ScoredEntry<Object> entry : scoredEntries) {
                    System.out.println("Found again " + entry.getValue()); //It was not removed
                }
    
            } catch (Exception e) {
                System.out.println("Could not connect to redis");
                e.printStackTrace();
            }
        }
    
        private NameMapper createNameMapper() {
            return new NameMapper() {
                public final String nameSpace = PREFIX + ":";
    
                @Override
                public String map(String name) {
                    return nameSpace + name;
                }
    
                @Override
                public String unmap(String name) {
                    return name.substring(nameSpace.length());
                }
            };
        }
    
    }
    
    @Data
    @AllArgsConstructor
    public class DataVO implements Serializable {
        private long when;
        private Set<String> mySet;
    }
    

    Redis version 6.2

    Redisson version 3.18.1

    Redisson configuration Already in the test code

    opened by ivorcosta 0
  • Warning in build: illegal reflective access

    Warning in build: illegal reflective access

    Hi @mrniko - I have been writing integration-tests and since then this warning has been coming. Please can you help prevent this ?

    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by com.esotericsoftware.kryo.unsafe.UnsafeUtil (file:/Users/slala01/.gradle/caches/modules-2/files-2.1/com.esotericsoftware/kryo/5.3.0/7cea47dbef635e2a30a3a252070a0451350fa2fc/kryo-5.3.0.jar) to constructor java.nio.DirectByteBuffer(long,int)
    WARNING: Please consider reporting this to the maintainers of com.esotericsoftware.kryo.unsafe.UnsafeUtil
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release
    

    Java 11 Spring Boot 2.7.3 Gradle build: 7.5.1 IDE: IntelliJ IDEA 2022.2.3 (Ultimate Edition) Test framework: org.junit.jupiter:junit-jupiter:5.9.0

    question 
    opened by sachinlala 0
  • Classfile version 61 (Java17) change intended?

    Classfile version 61 (Java17) change intended?

    Is it an intended or accidental change to publish redisson compiled with java17 target and thus break everyone not yet lucky enough to be on 17? If so, wouldn't a change like this be good to be documented as incompatible in the release notes?

    Also i was expecting such a drastic thing to be a major, rather than a minor change (in terms of SemVer).

    question 
    opened by uweschaefer 1
  • ReliableTopic only deletes expired subscribers when a message is read

    ReliableTopic only deletes expired subscribers when a message is read

    Observation

    ReliableTopics only remove expired subscribers and trim messages (i.e. those read by all subscribers) when a new message is published on the topic (i.e. when the blocking XREAD succeeds to read a message).

    Problematic

    This is problematic for Reliable topics that are not very active (i.e. do not have a lot of messages published), but have a lot of new subscribers. Over time, the subscribers list grows very large (of expired subscribers) because they’re only removed on new message reception, which doesn’t happen very often.

    As a result, when a message gets published, it doesn't get deleted for a long time (months in my case), because a lot of the expired subscribers, that will never read that message, were not removed from the list.

    Questions

    1. Why does the deletion of old subscribers (and the trimming of messages as a result) not happen in every poll (i.e. even if no message was read)? That way, ReliableTopics that do not get a lot of published messages will behave like those that get a lot of published messages => Both will not have expired subscribers left for long.

    2. Suppose I want expired subscribers to be deleted ASAP. Is there an easier way to achieve this than to manually do it myself (e.g. on a separate cron job)?

    bug 
    opened by faroukfaiz10 2
  • DNS exception thrown early, during Redisson.create(...)

    DNS exception thrown early, during Redisson.create(...)

    If configured Redis server does not resolve DNS, Redisson.create(...) will block and ultimately throw DNS error. I am wondering if there's a way to make it lazy-initialize later?

    Background:

    I am providing RedissonClient using dependency injection, and I would like DI system to not crash during injection phase, if database is down.

    question 
    opened by ninja- 0
  • Hibernate 2nd Level Cache Issue For ZonedDateTime Class

    Hibernate 2nd Level Cache Issue For ZonedDateTime Class

    
    java.lang.ClassCastException: class java.time.ZonedDateTime cannot be cast to class [Ljava.lang.Object; (java.time.ZonedDateTime and [Ljava.lang.Object; are in module java.base of loader 'bootstrap') | java.lang.ClassCastException: class java.time.ZonedDateTime cannot be cast to class [Ljava.lang.Object; (java.time.ZonedDateTime and [Ljava.lang.Object; are in module java.base of loader 'bootstrap')
    -- | --
    
    
    

    If my entity class has ZonedDateTime as CreatedTimeStamp or UpdatedTimeStamp, getting this issue.

    question 
    opened by TechnicalRhino 0
Releases(redisson-3.19.0)
  • 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)
  • redisson-3.13.6(Oct 14, 2020)

    Improvement - set pingConnectionInterval = 30000 by default

    Fixed - CROSSLOT error thrown during RLiveObject update
    Fixed - RRateLimiter.delete() method returns false
    Fixed - RBitSet.set(long bitIndex, boolean value) should return boolean
    Fixed - RBatch doesn't handle MOVED, ASK Redis errors in Redis
    Fixed - "response has been skipped due to timeout" warnings were removed
    Fixed - additional check for blocking command added in PingConnectionHandler
    Fixed - object's name should be checked for null
    Fixed - redisson-spring-boot-starter doesn't load config file
    Fixed - RTransaction should be executed in IN_MEMORY_ATOMIC mode
    Fixed - high contention during connection acquisition from connection pool

    Source code(tar.gz)
    Source code(zip)
Owner
Redisson
Redis Java client with features of In-Memory Data Grid
Redisson
Persistent priority queue over sql

queue-over-sql This projects implement a persistent priority queue (or a worker queue) (like SQS, RabbitMQ and others) over sql. Why? There are some c

Shimon Magal 13 Aug 15, 2022
This is an automated library software built in Java Netbeans to reduce manual efforts of the librarian, students to ensure smooth functioning of library by involving RFIDs.

Advanced-Library-Automation-System This is an advanced automated library software built in Java Netbeans to reduce manual efforts of the librarian, st

DEV_FINWIZ 14 Dec 6, 2022
A blazingly small and sane redis java client

Jedis Jedis is a blazingly small and sane Redis java client. Jedis was conceived to be EASY to use. Jedis is fully compatible with redis 2.8.x, 3.x.x

Redis 10.8k Dec 31, 2022
A blazingly small and sane redis java client

Jedis Jedis is a blazingly small and sane Redis java client. Jedis was conceived to be EASY to use. Jedis is fully compatible with redis 2.8.x, 3.x.x

Redis 10.9k Jan 8, 2023
A distributed in-memory data store for the cloud

EVCache EVCache is a memcached & spymemcached based caching solution that is mainly used for AWS EC2 infrastructure for caching frequently used data.

Netflix, Inc. 1.9k Jan 2, 2023
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Dec 30, 2022
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Jan 1, 2023
sql2o is a small library, which makes it easy to convert the result of your sql-statements into objects. No resultset hacking required. Kind of like an orm, but without the sql-generation capabilities. Supports named parameters.

sql2o Sql2o is a small java library, with the purpose of making database interaction easy. When fetching data from the database, the ResultSet will au

Lars Aaberg 1.1k Dec 28, 2022
ObjectBox is a superfast lightweight database for objects

ObjectBox Java (Kotlin, Android) ObjectBox is a superfast object-oriented database with strong relation support. ObjectBox is embedded into your Andro

ObjectBox 4.1k Dec 30, 2022
素材分享网:基于SpringBoot+MyBatis+阿里云OSS实现,适合于初学者。优秀毕业设计,喜欢的小伙伴可以点上面的⭐支持一下嘛!

素材分享网 这是一个多用户的资源共享平台,是一个专为文件共享而设计的新概念网盘系统。这是一个综合性非常强、灵活度非常高的素材网站,注册成为用户之后可以上传自己所喜欢的素材供他人浏览和高速下载。 同时设立网站管理员来审核用户上传的素材以及创建不同的素材分类来方便用户去上传、搜索,以此来为素材来设立分区

莫提 19 Nov 16, 2022
HasorDB is a Full-featured database access tool, Providing object mapping,Richer type handling than Mybatis, Dynamic SQL

HasorDB is a Full-featured database access tool, Providing object mapping,Richer type handling than Mybatis, Dynamic SQL, stored procedures, more dialect 20+, nested transactions, multiple data sources, conditional constructors, INSERT strategies, multiple statements/multiple results. And compatible with Spring and MyBatis usage.

赵永春 17 Oct 27, 2022
Batch Insert for Mybatis (just @BatchInsert)

mybatisBatch Batch Insert for Mybatis,提供更简化的基于 mybatis 的数据库批量保存插件。 功能说明 本项目是一个 mybatis 插件,目的是为了简化编写批量保存的代码。 在使用mybatis编写批量保存方法时,通常情况下需要基于mybatis的动态sql

null 3 Sep 13, 2022
Apache Aurora - A Mesos framework for long-running services, cron jobs, and ad-hoc jobs

NOTE: The Apache Aurora project has been moved into the Apache Attic. A fork led by members of the former Project Management Committee (PMC) can be fo

The Apache Software Foundation 627 Nov 28, 2022
TorMap visualises the location of Tor relays on a world map.

TorMap This project visualizes current and past Tor relays on a world map. The backend regularly downloads descriptors from TorProject Archive and sav

TorMap 6 Dec 8, 2022
Java implementation of Condensation - a zero-trust distributed database that ensures data ownership and data security

Java implementation of Condensation About Condensation enables to build modern applications while ensuring data ownership and security. It's a one sto

CondensationDB 43 Oct 19, 2022
A practical example to showcase Redis Streams and RediSearch in action

Redis Streams in Action A practical example to showcase Redis Streams in action. The goal is to process Twitter data in real-time for search and query

Abhishek Gupta 35 Dec 19, 2022
flink-connector-redis

github: https://github.com/future94/flink-connector-redis gitee : https://gitee.com/future94/flink-connector-redis Stargazers over time 为什么写这个项目 对比其他的

invalley 3 Aug 30, 2022
IoTDB (Internet of Things Database) is a data management system for time series data

English | 中文 IoTDB Overview IoTDB (Internet of Things Database) is a data management system for time series data, which can provide users specific ser

The Apache Software Foundation 3k Jan 1, 2023