该Redis Connection Pool实现是否正确?AWS连接异常求代码评审
Redis连接池实现代码评审问题汇总
致命逻辑错误(直接导致连接异常)
RedisClient静态类语法与初始化逻辑错误- 类定义语法错误:
public static class RedisClient()多了尾部括号,属于编译级错误 - 锁对象未定义:
lock(_lock)代码中的_lock没有声明初始化,直接运行会抛出空引用异常 - 连接获取逻辑未初始化:公共方法
GetConnnection直接调用_connectionPoolManager.GetConnection(),没有先调用GetConnectionPoolManager()执行初始化,首次调用必然空引用,未初始化的场景下直接触发上层连接异常
- 类定义语法错误:
- 连接集合静态化导致的生命周期混乱
RedisCacheConnectionPoolManager中的_connections被声明为静态字段,意味着所有该类的实例共享同一个连接集合:- 每次实例化新对象时调用
Initialize()会直接覆盖全局连接集合,旧实例持有的连接全部丢失 - 任意实例调用
Dispose()会释放全局所有连接,其他正在运行的实例会拿到已释放的连接对象,直接抛出connectionException
- 每次实例化新对象时调用
功能缺陷(高并发/AWS环境下必现连接问题)
- 无效连接无淘汰机制
代码完全没有检测连接健康性的逻辑:如果某个ConnectionMultiplexer已经因为网络波动、AWS Redis 主从切换等原因失效,只要IsValueCreated为 true,就会一直被返回给调用方,持续抛出连接异常 - 连接初始化失败无重试逻辑
初始化Lazy<ConnectionMultiplexer>时如果首次Connect失败,该 Lazy 实例会永久缓存异常,不会重试初始化,对应池化位置永久不可用 - 连接选择逻辑低效且不准确
GetConnection方法中使用OrderBy全量排序连接负载,不仅性能开销大,而且排序结果是遍历时刻的快照,返回给调用方时负载已经可能变化,完全达不到负载均衡的效果;高并发下大量遍历操作还会加剧连接池的性能损耗
适配AWS环境的缺失配置建议
AWS ElastiCache 场景下需要在 ConfigurationOptions 中额外配置以下参数,否则容易出现大量连接异常:
- 必须设置
AbortOnConnectFail = false,避免首次连接失败就永久不可用 - 合理设置
ConnectTimeout与SyncTimeout(建议设置为5000ms以上,适配AWS跨可用区网络延迟) - 开启
ConfigCheckSeconds配置,定期刷新AWS Redis的DNS信息,避免节点切换后DNS解析过时
内容的提问来源于stack exchange,提问作者firegarden
相关产品推荐
相关产品推荐

