前言
之前数据库连接池那篇就提到redis连接池正在准备中,今天就把它贴上。主要包含的redis连接池有jedisPool,redisson,至于之前有吐槽过的那位--lettuce先生,今天就没邀请他,原因是:“被拒绝了”。
我们看下官方文档的描述:
简单翻译一下重点:lettuce是设计成线程安全的,所以一个连接可以在多个线程间共享,并且在默认情况下,lettuce会进行断线重连。虽然在大多数情况下不需要连接池,但是在某些情况下可能会有帮助。
意思就是,我们lettuce大部分情况下是不需要连接池的,你非要用也可以,我们需要common-pool2的依赖。
然后关于其连接池配置的基本找不到,只有在spring官方配置文档中有关于lettuce连接池的几个配置,用spring的小伙伴可以查阅spring的官网看。
Jedis(JedisPool)
配置 | 缺省值 | 说明 | 性能优化 |
---|---|---|---|
maxTotal | 8 | 资源池中的最大连接数 | 一个连接的QPS大约是1s/1ms = 1000,而业务期望的单个Redis的QPS是50000(业务总的QPS/Redis分片个数),那么理论上需要的资源池大小(即MaxTotal)是50000 / 1000 = 50 |
maxIdle | 8 | 资源池允许的最大空闲连接数 | maxIdle设置得过小,会有new Jedis(新连接)开销 |
minIdle | 0 | 资源池确保的最少空闲连接数 | / |
blockWhenExhausted | true | 当资源池用尽后,调用者是否要等待。只有当值为true时,下面的maxWaitMillis才会生效。 | 建议使用默认值。 |
maxWaitMillis | -1(表示永不超时) | 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)。 | 不建议使用默认值。 |
testOnBorrow | false | 向资源池借用连接时是否做连接有效性检测(ping)。检测到的无效连接将会被移除。 | 业务量很大时候建议设置为false,减少一次ping的开销。 |
testOnReturn | false | 向资源池归还连接时是否做连接有效性检测(ping)。检测到无效连接将会被移除。 | 业务量很大时候建议设置为false,减少一次ping的开销。 |
jmxEnabled | true | 是否开启JMX监控 | / |
testWhileIdle | false | 是否在空闲资源监测时通过ping命令监测连接有效性,无效连接将被销毁。 | true |
timeBetweenEvictionRunsMillis | -1(不检测) | 空闲资源的检测周期(单位为毫秒) | 建议设置,周期自行选择,也可以默认也可以使用下方JedisPoolConfig中的配置。 |
minEvictableIdleTimeMillis | 1,800,000(即30分钟) | 资源池中资源的最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除。 | 可根据自身业务决定,一般默认值即可,也可以考虑使用下方JeidsPoolConfig中的配置。 |
numTestsPerEvictionRun | 3 | 做空闲资源检测时,每次检测资源的个数。 | 可根据自身应用连接数进行微调,如果设置为 -1,就是对所有连接做空闲监测。 |
redisson
官方文档:https://github.com/redisson/r...
通用配置
配置 | 缺省值 | 说明 |
---|---|---|
executor | null | 单独提供一个用来执行所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务的线程池(ExecutorService)实例。 |
lockWatchdogTimeout | 30000 | 监控锁的看门狗超时时间单位为毫秒。该参数只适用于分布式锁的加锁请求中未明确使用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实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。 |
threads | 当前处理核数量 * 2 | 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。 |
单机模式
Config config = new Config();
配置 | 缺省值 | 说明 |
---|---|---|
address | null | 以通过host:port的格式来指定节点地址。 |
subscriptionConnectionMinimumIdleSize | 1 | 用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。 |
subscriptionConnectionPoolSize | 50 | 用于发布和订阅连接的连接池最大容量。连接池的连接数量自动弹性伸缩。 |
connectionMinimumIdleSize | 32 | 最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。 |
connectionPoolSize | 64 | 在启用该功能以后,Redisson将会监测DNS的变化情况。 |
dnsMonitoringInterval | 5000 | 监测DNS的变化情况的时间间隔。单位:毫秒 |
idleConnectionTimeout | 10000 | 如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。 |
timeout | 3000 | 等待节点回复命令的时间。该时间从命令发送成功时开始计时。 |
retryAttempts | 3 | 如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。 |
retryInterval | 1500 | 在某个节点执行相同或不同命令时,连续 失败 failedAttempts(执行失败最大次数) 时,该节点将被从可用节点列表里清除,直到 reconnectionTimeout(重新连接时间间隔) 超时以后再次尝试。 |
database | 0 | 尝试连接的数据库编号。 |
password | null | null |
subscriptionsPerConnection | 5 | 每个连接的最大订阅数量。 |
clientName | null | 在Redis节点里显示的客户端名称。 |
connectTimeout | 10000 | 同节点建立连接时的等待超时。时间单位是毫秒。 |
yaml文件配置模版如下:
singleServerConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: null
subscriptionsPerConnection: 5
clientName: null
address: "redis://127.0.0.1:6379"
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
connectionMinimumIdleSize: 24
connectionPoolSize: 64
database: 0
dnsMonitoringInterval: 5000
threads: 16
nettyThreads: 32
codec: ! {}
transportMode: "NIO"
集群模式
ClusterServersConfig clusterConfig = config.useClusterServers();
配置 | 缺省值 | 说明 |
---|---|---|
nodeAddresses | null | 可以通过host:port的格式来添加Redis集群节点的地址。多个节点可以一次性批量添加。 |
scanInterval | 1000 | 对Redis集群节点状态扫描的时间间隔。单位是毫秒。 |
slots | 231 | 用于指定数据分片过程中的分片数量。 |
readMode | SLAVE(只在从服务节点里读取) | 在从服务节点里读取的数据说明已经至少有两个节点保存了该数据,确保了数据的高可用性。设置读取操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里读取。 MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取。 |
subscriptionMode | SLAVE(只在从服务节点里订阅) | 设置订阅操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里订阅。 MASTER - 只在主服务节点里订阅。 |
loadBalancer | org.redisson.connection.balancer.RoundRobinLoadBalancer | 在多Redis服务节点的环境里,可以选用以下几种负载均衡方式选择一个节点: org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法 org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法 org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法 |
subscriptionConnectionMinimumIdleSize | 1 | 从节点发布和订阅连接的最小空闲连接数,多从节点的环境里,每个 从服务节点里用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。 |
subscriptionConnectionPoolSize | 50 | 从节点发布和订阅连接池大小。多从节点的环境里,每个 从服务节点里用于发布和订阅连接的连接池最大容量。连接池的连接数量自动弹性伸缩。 |
slaveConnectionMinimumIdleSize | 32 | 从节点最小空闲连接数。多从节点的环境里,每个 从服务节点里用于普通操作(非 发布和订阅)的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时读取反映速度。 |
slaveConnectionPoolSize | 64 | 多从节点的环境里,每个 从服务节点里用于普通操作(非 发布和订阅)连接的连接池最大容量。连接池的连接数量自动弹性伸缩。 |
masterConnectionMinimumIdleSize | 32 | 多节点的环境里,每个 主节点的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。 |
masterConnectionPoolSize | 64 | 多主节点的环境里,每个 主节点的连接池最大容量。连接池的连接数量自动弹性伸缩。 |
idleConnectionTimeout | 10000 | 如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。 |
connectTimeout | 10000 | 同任何节点建立连接时的等待超时。时间单位是毫秒。 |
timeout | 3000 | 等待节点回复命令的时间。该时间从命令发送成功时开始计时。 |
retryAttempts | 3 | 如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。 |
retryInterval | 1500 | 在某个节点执行相同或不同命令时,连续 失败 failedAttempts(执行失败最大次数) 时,该节点将被从可用节点列表里清除,直到 reconnectionTimeout(重新连接时间间隔) 超时以后再次尝试。 |
password | null | 用于节点身份验证的密码。 |
subscriptionsPerConnection | 5 | 每个连接的最大订阅数量。 |
clientName | null | 在Redis节点里显示的客户端名称。 |
sslEnableEndpointIdentification | true | 开启SSL终端识别能力。 |
sslProvider | JDK | 确定采用哪种方式(JDK或OPENSSL)来实现SSL连接。 |
sslTruststore | null | 指定SSL信任证书库的路径。 |
sslTruststorePassword | null | 指定SSL信任证书库的密码。 |
sslKeystore | null | 指定SSL钥匙库的路径。 |
sslKeystorePassword | null | 指定SSL钥匙库的密码。 |
yaml文件配置模版如下:
clusterServersConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: null
subscriptionsPerConnection: 5
clientName: null
loadBalancer: ! {}
slaveSubscriptionConnectionMinimumIdleSize: 1
slaveSubscriptionConnectionPoolSize: 50
slaveConnectionMinimumIdleSize: 32
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 32
masterConnectionPoolSize: 64
readMode: "SLAVE"
nodeAddresses:
- "redis://127.0.0.1:7004"
- "redis://127.0.0.1:7001"
- "redis://127.0.0.1:7000"
scanInterval: 1000
threads: 0
nettyThreads: 0
codec: ! {}
"transportMode":"NIO"
OK,大致就这样了。