当前位置: 首页 > 后端技术 > Java

Redis常用连接池组件配置

时间:2023-04-01 14:54:05 Java

1.前言之前的数据库连接池文章提到redis连接池正在准备中,所以今天贴出来。主要的redis连接池有jedisPool和redisson。至于之前抱怨的生菜先生,今天没有被邀请,原因是:“被拒绝了”。看一下官方文档的描述:重点简要翻译一下:lettuce被设计成线程安全的,所以一个连接可以在多个线程之间共享,默认情况下,lettuce断开连接后会重新连接。虽然在大多数情况下不需要连接池,但在某些情况下它可能会有帮助。就是说我们的生菜在大多数情况下是不需要连接池的,想用就用。我们需要common-pool2的依赖。然后基本没有关于它的连接池配置的信息。只有spring官方的配置文档里面有关于lettuce连接池的几个配置。使用spring的朋友可以参考spring官网。2.SpringBoot配置文件通过SpringBoot配置文件配置redis。详见Spring应用属性官方文档【数据属性部分】:https://docs.spring.io/spring...3.Jedis(JedisPool)以下适用于代码配置(非配置文件配置)配置默认值描述性能优化maxTotal8资源池最大连接数一个连接的QPS约为1s/1ms=1000,业务期望的单个Redis的QPS为50000(业务的总QPS/Redis)numberoffragments),那么理论上需要的资源池大小(MaxTotal)为50000/1000=50maxIdle8资源池允许的最大空闲连接数maxIdle设置得太小,会有新的Jedis(新连接)开销minIdle0资源pool保证的最小空闲连接数/blockWhenExhaustedtrue当资源池耗尽时调用者是否应该等待。只有当该值为true时,后面的maxWaitMillis才会生效。建议使用默认值。maxWaitMillis-1(表示永不超时)当资源池连接耗尽时,调用者的最大等待时间(以毫秒为单位)。不建议使用默认值。testOnBorrowfalse从资源池借用连接时是否进行连接有效性检测(ping)。检测到的无效连接将被删除。当业务量大时,建议设置为false,减少一次ping的开销。testOnReturnfalse返回连接到资源池时是否进行连接有效性检测(ping)。检测到的无效连接将被删除。当业务量大时,建议设置为false,减少一次ping的开销。jmxEnabledtrue是否启用JMX监控/testWhileIdlefalse空闲资源监控时是否使用ping命令监控连接的有效性,无效的连接将被销毁。truetimeBetweenEvictionRunsMillis-1(notdetected)建议设置空闲资源检测周期(毫秒)。期间可以自己选择,也可以使用下面JedisPoolConfig中的默认配置。minEvictableIdleTimeMillis1,800,000(即30分钟)资源池中资源的最小空闲时间(毫秒)。达到这个值后,闲置资源将被移除。你可以根据自己的业务来决定。通常,默认值就足够了。您也可以考虑使用下面JeidsPoolConfig中的配置。numTestsPerEvictionRun3做空闲资源检测时,每次检测的资源数量。可以根据自身应用中的连接数进行微调。如果设置为-1,则会对所有连接进行空闲监控。4、Redisson官方文档:https://github.com/redisson/r...4.1Generalconfiguration配置默认值说明executornull提供了一个线程池,用于分别执行所有RTopic对象监听器、RRemoteService调用者和RExecutorService任务(ExecutorService)实例。lockWatchdogTimeout30000监控锁看门狗超时时间单位为毫秒。该参数仅在分布式锁的锁请求中没有显式使用leaseTimeout参数时适用。如果看门狗不使用lockWatchdogTimeout重新调整分布式锁的lockWatchdogTimeout超时时间,那么这个锁就会失效。该参数可用于避免Redisson客户端节点宕机或其他原因导致的死锁。transportMode(传输模式)TransportMode.NIO可选参数:TransportMode.NIO,TransportMode.EPOLL-依赖包中需要netty-transport-native-epoll包(Linux)TransportMode.KQUEUE-依赖包中需要netty-transport-native-kqueue(macOS))eventLoopGroup/用于指定一个EventLoopGroup。EventLoopGroup用于处理所有通过Netty和Redis服务连接发送和接收的消息。默认情况下,每个Redisson都会创建并管理一个EventLoopGroup实例。因此,如果同一个JVM中可能存在多个Redisson实例,则采用这种配置来达到多个Redisson实例共享一个EventLoopGroup的目的。只有io.netty.channel.epoll.EpollEventLoopGroup或io.netty.channel.nio.NioEventLoopGroup是允许的类型。NettyThreads当前处理核心数*2这个线程池数是它创建的所有分布式数据类型和服务与底层客户端在一个Redisson实例中共享的线程池中保存的线程数。threadscurrentprocessingcorenumber*2这个线程池号被所有的RTopic对象监听器、RRemoteService调用者和RExecutorService任务共享。4.2单机模式Configconfig=newConfig();配置默认值descriptionaddressnull指定节点地址,格式为host:port。subscriptionConnectionMinimumIdleSize1是用于发布和订阅连接的最小持久连接(长连接)数。Redisson内部往往通过发布和订阅的方式实现很多功能。需要长期保持一定数量的发布-订阅连接。subscriptionConnectionPoolSize50发布和订阅连接的连接池的最大容量。连接池中的连接数是自动缩放的。connectionMinimumIdleSize32最小保持连接数(长连接)。长期保持一定数量的连接数,有利于提高瞬时写入响应速度。connectionPoolSize64开启该功能后,Redisson会监听DNS变化。dnsMonitoringInterval5000监听DNS变化的时间间隔。单位:毫秒idleConnectionTimeout10000如果当前连接池中的连接数超过最小空闲连接数,同时有空闲时间超过该值的连接,那么这些连接会自动关闭并从连接池中移除.时间单位是毫秒。timeout3000等待节点回复命令的时间。命令发送成功后开始计时。retryAttempts3如果尝试达到retryAttempts(命令失败重试次数),命令无法发送到指定节点,将抛出错误。如果尝试在此限制内发送成功,则启用超时(命令等待超时)计时器。retryInterval1500当一个节点执行相同或不同的命令,连续失败failedAttempts(最大执行失败次数)时,该节点将从可用节点列表中清除,直到reconnectionTimeout(重连间隔)超时再重试。database0尝试连接的数据库的编号。passwordnullnullsubscriptionsPerConnection5每个连接的最大订阅数。clientNamenullRedis节点中显示的客户端名称。connectTimeout10000与节点建立连接时等待超时。时间单位是毫秒。yaml文件配置模式如下:singleServerConfig:idleConnectionTimeout:10000connectTimeout:10000timeout:3000retryAttempts:3retryInterval:1500password:nullsubscriptionsPerConnection:5clientName:nulladdress:"redis://127.0.0.1:6379"subscriptionConnectionMinimol:127.0.0.1:6379subscriptionConnectionMinimol:1:IdleSize50connectionMinimumIdleSize:24connectionPoolSize:64database:0dnsMonitoringInterval:5000threads:16nettyThreads:32codec:!{}transportMode:"NIO"4.3集群模式ClusterServersConfigclusterConfig=er.useconfig该值表示nodeAddressesnull可以添加Redis集群节点的地址,格式为host:port。一次可以批量添加多个节点。scanInterval1000扫描Redis集群节点状态的时间间隔。单位是毫秒。slots231用于指定数据分片过程中的分片数。readModeSLAVE(仅从服务节点读取)从服务节点读取的数据表示至少有两个节点保存了数据,保证了数据的高可用。设置为读取操作选择节点的模式。可用值有:SLAVE-只从从节点读取。MASTER-仅在主服务器节点上读取。MASTER_SLAVE-可以在主从服务节点中读取。subscriptionModeSLAVE(仅在从服务节点订阅)设置订阅操作选择节点的模式。可用值有:SLAVE-仅在从属节点上订阅。MASTER-仅在主服务节点上订阅。loadBalancerorg.redisson.connection.balancer.RoundRobinLoadBalancer在多个Redis服务节点的环境下,可以选择以下负载均衡方式之一来选择一个节点:org.redisson.connection.balancer.WeightedRoundRobinBalancer-weightedround-robin调度算法org.redisson.connection.balancer.RoundRobinLoadBalancer-循环调度算法org.redisson.connection.balancer.RandomLoadBalancer-随机调度算法subscriptionConnectionMinimumIdleSize1从节点发布和订阅连接的最小空闲连接数。在有多个从节点的环境中,每个从服务节点用于发布和订阅连接的最小保活连接数(长连接)。Redisson内部往往通过发布和订阅的方式实现很多功能。需要长期保持一定数量的发布-订阅连接。subscriptionConnectionPoolSize50从节点发布和订阅连接池大小。在有多个从节点的环境中,每个从服务节点中用于发布和订阅连接的连接池的最大容量。连接池中的连接数是自动缩放的。slaveConnectionMinimumIdleSize32来自节点的最小空闲连接数。在有多个从节点的环境中,每个从服务节点中用于公共操作(非发布和订阅)的最小持久连接(长连接)数。长期保持一定数量的连接数,有利于提高瞬时阅读响应速度。slaveConnectionPoolSize64在有多个从节点的环境下,每个从服务节点中用于公共操作(非发布和订阅)连接的连接池的最大容量。连接池中的连接数是自动缩放的。masterConnectionMinimumIdleSize32在多节点环境中,每个主节点的最小持久连接(persistentconnections)数。长期保持一定数量的连接数,有利于提高瞬时写入响应速度。masterConnectionPoolSize64在多主节点环境下,每个主节点连接池的最大容量。连接池中的连接数是自动缩放的。idleConnectionTimeout10000如果当前连接池中的连接数超过最小空闲连接数,同时有空闲时间超过该值的连接,那么这些连接会自动关闭并从连接池中移除。时间单位是毫秒。connectTimeout10000与任意节点建立连接时等待超时。时间单位是毫秒。timeout3000等待节点回复命令的时间。命令发送成功后开始计时。retryAttempts3如果尝试达到retryAttempts(命令失败重试次数),命令无法发送到指定节点,将抛出错误。如果尝试在此限制内发送成功,则启用超时(命令等待超时)计时器。retryInterval1500当一个节点执行相同或不同的命令,连续失败failedAttempts(最大执行失败次数)时,该节点将从可用节点列表中清除,直到reconnectionTimeout(重连间隔)超时再重试。passwordnull用于节点身份验证的密码。subscriptionsPerConnection5每个连接的最大订阅数。clientNamenullRedis节点中显示的客户端名称。sslEnableEndpointIdentificationtrue启用SSL终端识别功能。sslProviderJDK决定采用哪种方式(JDK或OPENSSL)实现SSL连接。sslTruststorenull指定SSL信任库的路径。sslTruststorePasswordnull指定SSL信任库的密码。sslKeystorenull指定SSL密钥库的路径。sslKeystorePasswordnull指定SSL密钥库的密码。yaml文件配置模型如下:clusterServersConfig:idleConnectionTimeout:10000connectTimeout:10000timeout:3000retryAttempts:3retryInterval:1500password:nullsubscriptionsPerConnection:5clientName:nullloadBalancer:!{1slaveSubscriptionConnectionPoolSize:50slaveConnectionMinimumIdleSize:32slaveConnectionPoolSize:64masterConnectionMinimumIdleSize:32masterConnectionPoolSize:64readMode:“SLAVE”nodeAddresses:-“redis://127.0.0.1:7004”-“redis://127.0.0.1:7001”-“redis://127.0.0.1:7000"scanInterval:1000threads:0nettyThreads:0codec:!{}"transportMode":"NIO"OK,大致就这样了。