Golang Go语言中redigo尝试使用连接池,shell循环跑1000为啥redis的连接数还是1?

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中redigo尝试使用连接池,shell循环跑1000为啥redis的连接数还是1?

如题,小 demo 已 build,用 shell 循环 1000 次 exe,本地 info clients 一直是 1,用 redigo 封装的 Stats 测试一直都是「 1 0 」,按说连接池应该有大于 1 的链接被用啊,到底是为什么?配置:maxIdle 5 maxActive 10,idleTimeout 5sec 。本人 php,尝试用 go 跑个微服务,愧于学术浅

7 回复

我猜你程序里根本一个连接都没用到
info clients 里的 1 估计还是你 shell 用的那个 client

试试在程序里在用到 redis 的地方,一直让它处于 wait 状态,不要释放,这样你 client 数量应该就上去了

更多关于Golang Go语言中redigo尝试使用连接池,shell循环跑1000为啥redis的连接数还是1?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


串行执行的吧。

你的 shell 循环是不是类似这样的?

#!/bin/bash

for((i=1;i<=1000;i++));
do
./redigo_demo
done

虽然不知道是不是,但是我成功被你逗笑了

目测是这样了…

在 1 和 0 之间跳动 大部分时间是 1

在Golang中使用redigo库与Redis进行交互时,如果观察到连接池中的连接数始终为1,即便在shell脚本中循环运行了1000次请求,这通常意味着连接池的配置或使用方式可能存在问题。以下是一些可能的原因和解决方案:

  1. 连接池配置:检查你的连接池配置。redigo允许你自定义连接池的大小,包括最大空闲连接数、最大活跃连接数等。如果未正确设置这些参数,连接池可能默认只保持一个连接。确保在创建连接池时,设置了合理的MaxIdleMaxActive值。

  2. 连接复用:确认你的代码是否有效复用了连接池中的连接。每次请求都应从连接池中获取连接,并在操作完成后释放回连接池。这通常通过调用Get()获取连接,Close()释放连接来实现,但注意这里的Close()不应关闭底层的TCP连接,而是将其归还给连接池。

  3. 并发控制:如果你的应用是顺序执行而非并发执行,即使设置了较大的连接池,也可能只看到一个连接被使用。尝试增加并发性,比如使用goroutines来同时处理多个请求。

  4. 监控与日志:增加日志记录,监控连接池的状态和Redis服务器的连接数,这有助于诊断问题。

总之,检查连接池的配置、确保连接的正确复用、增加并发处理可能是解决这一问题的关键。如果问题依旧存在,可能需要更详细地审查代码逻辑或寻求社区的帮助。

回到顶部