diff --git a/redisson/pom.xml b/redisson/pom.xml index 9e7ea5c08..27e47d41c 100644 --- a/redisson/pom.xml +++ b/redisson/pom.xml @@ -40,6 +40,13 @@ netty-transport-native-epoll provided + + io.netty.incubator + netty-incubator-transport-native-io_uring + provided + 0.0.21.Final + linux-x86_64 + io.netty diff --git a/redisson/src/main/java/org/redisson/config/TransportMode.java b/redisson/src/main/java/org/redisson/config/TransportMode.java index d564f3362..5bcea36a5 100644 --- a/redisson/src/main/java/org/redisson/config/TransportMode.java +++ b/redisson/src/main/java/org/redisson/config/TransportMode.java @@ -38,4 +38,9 @@ public enum TransportMode { */ KQUEUE, + /** + * Use `io_uring` transport. Requires netty-transport-io_uring lib in classpath. + */ + IO_URING, + } diff --git a/redisson/src/main/java/org/redisson/connection/ServiceManager.java b/redisson/src/main/java/org/redisson/connection/ServiceManager.java index 0ba2487e7..87aecb51b 100644 --- a/redisson/src/main/java/org/redisson/connection/ServiceManager.java +++ b/redisson/src/main/java/org/redisson/connection/ServiceManager.java @@ -27,6 +27,9 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioDatagramChannel; import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.incubator.channel.uring.IOUringDatagramChannel; +import io.netty.incubator.channel.uring.IOUringEventLoopGroup; +import io.netty.incubator.channel.uring.IOUringSocketChannel; import io.netty.resolver.AddressResolver; import io.netty.resolver.AddressResolverGroup; import io.netty.resolver.DefaultAddressResolverGroup; @@ -154,11 +157,16 @@ public class ServiceManager { } this.socketChannelClass = KQueueSocketChannel.class; - if (PlatformDependent.isAndroid()) { - this.resolverGroup = DefaultAddressResolverGroup.INSTANCE; + this.resolverGroup = cfg.getAddressResolverGroupFactory().create(KQueueDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + } else if (cfg.getTransportMode() == TransportMode.IO_URING) { + if (cfg.getEventLoopGroup() == null) { + this.group = new IOUringEventLoopGroup(cfg.getNettyThreads(), new DefaultThreadFactory("redisson-netty")); } else { - this.resolverGroup = cfg.getAddressResolverGroupFactory().create(KQueueDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + this.group = cfg.getEventLoopGroup(); } + + this.socketChannelClass = IOUringSocketChannel.class; + this.resolverGroup = cfg.getAddressResolverGroupFactory().create(IOUringDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); } else { if (cfg.getEventLoopGroup() == null) { this.group = new NioEventLoopGroup(cfg.getNettyThreads(), new DefaultThreadFactory("redisson-netty"));