Redis学习笔记7:基于springboot的Lettuce redis客户端keepAlive保活机制

news/2024/11/20 1:25:02/

Lettuce是基于netty来实现的,Netty支持通过设置ChannelOption.SO_KEEPALIVE属性来控制保活机制,底层实现是基于操作系统,操作系统的保活机制一般要等待7200秒,如centos的net.ipv4.tcp_keepalive_time设置;lettuce客户端另外提供了扩展保活机制,方便客户端灵活的控制保活机制的空闲时间、次数、间隔。

一个对springboot redis框架进行重写,支持lettuce、jedis、连接池、同时连接多个集群、多个redis数据库、开发自定义属性配置的开源SDK

<dependency><groupId>io.github.mingyang66</groupId><artifactId>emily-spring-boot-redis</artifactId><version>4.3.9</version>
</dependency>

GitHub地址:https://github.com/mingyang66/spring-parent

一、Lettuce提供基于操作系统的保活机制
  • 通过SocketOptions属性设置keepAlive,默认:false
 ClientOptions.Builder builder = this.initializeClientOptionsBuilder(properties);Duration connectTimeout = properties.getConnectTimeout();if (connectTimeout != null) {builder.socketOptions(SocketOptions.builder().keepAlive(true).build());}
  • io.lettuce.core.ConnectionBuilder#configureBootstrap设置保活参数
 bootstrap.option(ChannelOption.SO_KEEPALIVE, options.isKeepAlive());
二、Lettuce提供扩展keepAlive保活机制
  • 通过SocketOptions属性设置扩展保活机制参数
        ClientOptions.Builder builder = this.initializeClientOptionsBuilder(properties);Duration connectTimeout = properties.getConnectTimeout();if (connectTimeout != null) {builder.socketOptions(SocketOptions.builder().connectTimeout(connectTimeout).keepAlive(SocketOptions.KeepAliveOptions.builder()//两次keep-alive之间的间隔.interval(Duration.ofSeconds(5))//连接空闲多久开始keep-alive.idle(Duration.ofSeconds(5))//keep-alive多少次之后断开连接.count(3)//是否开启保活连接.enable().build()).build());}
  • io.lettuce.core.ConnectionBuilder#configureBootstrap保活连接配置
 public void configureBootstrap(boolean domainSocket,Function<Class<? extends EventLoopGroup>, EventLoopGroup> eventLoopGroupProvider) {...SocketOptions options = clientOptions.getSocketOptions();EventLoopGroup eventLoopGroup = eventLoopGroupProvider.apply(eventLoopGroupClass);bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, Math.toIntExact(options.getConnectTimeout().toMillis()));if (!domainSocket) {//基于操作系统的keepAlive机制bootstrap.option(ChannelOption.SO_KEEPALIVE, options.isKeepAlive());bootstrap.option(ChannelOption.TCP_NODELAY, options.isTcpNoDelay());}bootstrap.channel(channelClass).group(eventLoopGroup);//开启扩展保活机制的前提是必须开启基于操作系统的保活机制if (options.isKeepAlive() && options.isExtendedKeepAlive()) {SocketOptions.KeepAliveOptions keepAlive = options.getKeepAlive();//判断是否可以使用IOUringProvider,即是否可用IO uring库。如果可用,调用IOUringProvider提供的applyKeepAlive方法,传入bootstrap(Netty的引导类)和keepAlive的参数(count、idle、interval),应用IOUringProvider提供的keepalive参数配置if (IOUringProvider.isAvailable()) {IOUringProvider.applyKeepAlive(bootstrap, keepAlive.getCount(), keepAlive.getIdle(), keepAlive.getInterval());} else if (EpollProvider.isAvailable()) {//判断是否可以使用EpollProvider,即是否可用Epoll网络库。如果可用,调用EpollProvider提供的applyKeepAlive方法,传入bootstrap和keepAlive的参数,应用EpollProvider提供的keepalive参数配置。EpollProvider.applyKeepAlive(bootstrap, keepAlive.getCount(), keepAlive.getIdle(), keepAlive.getInterval());} else if (ExtendedNioSocketOptions.isAvailable() && !KqueueProvider.isAvailable()) {//判断是否可以使用ExtendedNioSocketOptions,并且不可使用KqueueProvider。如果可用,调用ExtendedNioSocketOptions提供的applyKeepAlive方法,传入bootstrap和keepAlive的参数,应用ExtendedNioSocketOptions提供的keepalive参数配置ExtendedNioSocketOptions.applyKeepAlive(bootstrap, keepAlive.getCount(), keepAlive.getIdle(),keepAlive.getInterval());} else {logger.warn("Cannot apply extended TCP keepalive options to channel type " + channelClass.getName());}}}
  • IOUring是Netty中的一个实验性模块,用于支持Linux上的IO uring库。IOUring是Netty中的一个实验性模块,用于支持Linux上的IO uring库
  • EpollProvider是Netty中的一个类,用于在Linux上提供基于Epoll的网络通信支持。Epoll是Linux内核提供的一种事件通知机制,用于处理大量并发连接的高性能I/O操作。它通过将文件描述符(包括套接字)注册到一个事件集合中,并且可以监听多个事件类型(如可读、可写、错误等),从而实现了高效的事件驱动模型。
三、SocketOptions.KeepAliveOptions保活机制参数配置类
    public static class KeepAliveOptions {//默认保活机制检查次数上限public static final int DEFAULT_COUNT = 9;//默认信道空闲2小时开始进行keep-alivepublic static final Duration DEFAULT_IDLE = Duration.ofHours(2);//每次keep-alive的时间间隔,默认:75秒public static final Duration DEFAULT_INTERVAL = Duration.ofSeconds(75);private final int count;private final boolean enabled;private final Duration idle;private final Duration interval;private KeepAliveOptions(KeepAliveOptions.Builder builder) {this.count = builder.count;this.enabled = builder.enabled;this.idle = builder.idle;this.interval = builder.interval;}
}

http://www.ppmy.cn/news/1211542.html

相关文章

C语言——求 n 以内(不包括 n)同时能被 3 和 7 整除的所有自然数之和的平方根 s,n 从键盘输入。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<math.h> int main() {int i,n;double s0.0;printf("输入任意一个自然数&#xff1a; ");scanf("%d",&n);for(i1;i<n;i) {if(i%30&&i%70){si;}}ssqrt(s);printf(…

css:两个行内块元素和图片垂直居中对齐

目录 两个行内块元素垂直居中对齐图片垂直居中问题图片和文字垂直居中对齐参考文章 两个行内块元素垂直居中对齐 先看一段代码&#xff1a; <style> .box {width: 200px;height: 200px;line-height: 200px;font-size: 20px;text-align: center;display: inline-block;b…

Android通信安全之HTTPS

Android通信安全之HTTPS 目录 Android通信安全之HTTPS Https 起因 问题描述 自定义X509TrustManager 自定义HostnameVerifier 修复方案 解决方案一 解决方案2 本文章向大家介绍Android通信安全之HTTPS&#xff0c;主要内容包括Https、起因、问题描述、自定义Hostname…

acwing算法基础之搜索与图论--染色法判断二分图

目录 1 基础知识2 模板3 工程化 1 基础知识 二分图&#xff1a;每条边连接的起点和终点&#xff0c;分别属于集合A和集合B。 一个图是二分图&#xff0c;当且仅当&#xff0c;图中不含奇数环&#xff08;即&#xff0c;回环中的结点数目是奇数&#xff09;。 染色法判定二分…

设计模式——适配器模式(Adapter Pattern)+ Spring相关源码

文章目录 一、适配器模式定义二、例子2.1 菜鸟教程例子2.1.1 定义两个不兼容的播放接口MediaPlayer 、AdvancedMediaPlayer2.1.2 定义AdvancedMediaPlayer两个实现类VlcPlayer 、Mp4Player2.1.3 定义适配器MediaAdapter2.1.4 定义AudioPlayer 并使用MediaAdapter2.1.5 使用 2.2…

@KafkaListener注解详解(一)| 常用参数详解

KafkaListener 注解提供了许多可配置的参数&#xff0c;以便更灵活地定制 Kafka 消息监听器的行为。 topics&#xff1a; 描述&#xff1a; 指定监听的 Kafka 主题&#xff0c;可以是一个字符串数组。这是最基本的参数&#xff0c;它定义了监听器将从哪个或哪些主题接收消息。…

rust 闭包

文章目录 闭包使用闭包来简化代码传统函数实现 闭包实现闭包的类型推导结构体中的闭包捕获作用域中的值三种 Fn 特征闭包作为函数返回值 闭包 闭包是一种匿名函数&#xff0c;它可以赋值给变量也可以作为参数传递给其它函数&#xff0c;不同于函数的是&#xff0c;它允许捕获调…

P6入门:项目初始化3-项目详情之记事本Notebook

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…