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