Redis连接池深度清理实践(redis 连接池清空)

  最近,针对我们系统中某服务消耗过高的问题,我们根据分析发现,整个系统中Redis的连接池的连接数量很低,但是使用的连接数却是50多个,而Redis的最大连接数只有30个,所以会导致系统无法获取新的Redis连接,导致系统访问严重不稳定。

  所以根据这方面的发现,我们在系统中加入了对Redis连接池深度清理的实现,下面是实现这个功能的具体步骤:

1. 使用flink的window操作监控各个服务的连接池的连接数:

“`java

SingleOutputStreamOperator> connectionCountStream = serviceSource

.keyBy(0)

.window(TumblingEventTimeWindows.of(Time.minutes(10)))

.apply(new WindowFunction, Tuple2, Tuple, TimeWindow>() {

@Override

public void apply(Tuple tuple, TimeWindow window, Iterable> input, Collector> out) throws Exception {

Long count = 0L;

for (Tuple2 item : input) {

count++;

}

out.collect(Tuple2.of(window.getEnd(), count));

}

});


2. 根据连接池的连接数量,在达到一定阈值后,去清理该节点连接池中的多余连接:
```java
connectionCountStream.addSink(new RichSinkFunction>() {
@Override
public void invoke(Tuple2 value, Context context) throws Exception {
Long winEnd = value.f0;
Long count = value.f1;
if (count > MAX_CONNECTION_NUMBER) {
ConnectionPool pool = ConnectionPoolUtils.getConnectionPool(serviceId);
if (pool != null) {
pool.closeIdleConnections(winEnd);
}
}
}
});

  上述两个步骤完成之后,这个功能就已经实现了。在这个清理过程应该注意安全性,不要在重要的时段去执行这个操作,也不要使用太大的时间窗口,这两个都会影响系统的稳定性。


数据运维技术 » Redis连接池深度清理实践(redis 连接池清空)