database.FindBeanRedisDb().RPush目前没有设置超时时间,这意味着在某些情况下可能会出现阻塞问题。
当前 Redis 客户端配置
查看beconfig/config.go和database/redis_db.go:
Go
17
// RedisConfig 结构体(beconfig/config.go:55) type RedisConfig struct { Enable bool `yaml:"enable"` Host string `yaml:"host"` Port int `yaml:"port"` Password string `yaml:"password"` DB int `yaml:"db"` // 缺少超时配置! } // NewRedisClient 初始化(database/redis_db.go:44) rdb := redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%d", conf.Host, conf.Port), Password: conf.Password, DB: conf.DB, // 没有设置任何超时参数! })潜在问题
| 场景 | 行为 | 风险 |
|---|---|---|
| Redis 服务器宕机 | RPush 会无限阻塞等待响应 | 导致 goroutine 泄漏,服务卡死 |
| 网络超时/中断 | 同样会无限阻塞 | 同上 |
| 连接池耗尽 | 获取连接时无限阻塞 | 服务不可用 |
建议的改进方案
1. 更新配置结构
Go
type RedisConfig struct { Enable bool `yaml:"enable"` Host string `yaml:"host"` Port int `yaml:"port"` Password string `yaml:"password"` DB int `yaml:"db"` DialTimeout time.Duration `yaml:"dialTimeout"` // 连接建立超时 ReadTimeout time.Duration `yaml:"readTimeout"` // 读操作超时 WriteTimeout time.Duration `yaml:"writeTimeout"` // 写操作超时 PoolTimeout time.Duration `yaml:"poolTimeout"` // 连接池获取超时 }2. 更新客户端初始化
Go
func NewRedisClient(conf *beconfig.RedisConfig) (*RedisDb, error) { if !conf.Enable { logrus.Info("redis disable") return &RedisDb{}, nil } // 设置默认超时时间 dialTimeout := conf.DialTimeout if dialTimeout == 0 { dialTimeout = 5 * time.Second } readTimeout := conf.ReadTimeout if readTimeout == 0 { readTimeout = 3 * time.Second } writeTimeout := conf.WriteTimeout if writeTimeout == 0 { writeTimeout = 3 * time.Second } poolTimeout := conf.PoolTimeout if poolTimeout == 0 { poolTimeout = 2 * time.Second } rdb := redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%d", conf.Host, conf.Port), Password: conf.Password, DB: conf.DB, DialTimeout: dialTimeout, ReadTimeout: readTimeout, WriteTimeout: writeTimeout, PoolTimeout: poolTimeout, }) // ... }总结
当前代码存在风险:RPush没有超时保护,如果 Redis 服务器不可用或网络异常,调用会无限阻塞。建议立即添加超时配置来避免服务稳定性问题。