- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我连接的 redis 服务器出现故障时,我正在努力让 go 快速失败,我想要一个强大的解决方案。
我正在使用 redigo我正在像这样设置一个连接池:
// This has other stuff in it in the code, use it as a
// central repository for things we want in memory
type State struct{
redisPool *redis.Pool
}
func (state *State) GetRedisConn() redis.Conn {
return state.redisPool.Get()
}
func main() {
state.redisPool = &redis.Pool{
MaxIdle: 200,
MaxActive: 9000,
IdleTimeout: time.Minute,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", *redisAddress,
redis.DialConnectTimeout(1*time.Second),
redis.DialReadTimeout(100*time.Millisecond),
redis.DialWriteTimeout(100*time.Millisecond),
)
},
}
}
然后请求新连接并像这样使用它们:
t0 := time.Now()
conn := state.GetRedisConn()
if conn != nil && conn.Err() == nil {
defer conn.Close()
// Do stuff
else {
log.Printf("no redis probably")
}
log.Println(time.Now().Sub(t0).Seconds())
当 redis 启动时,这很好用,事情发生在几毫秒内。当我使用 redis 时,我的第 75 个百分位数上升到 7+ 秒,我的第 99 个百分位数上升到 10 秒(我可以在普罗米修斯上看到这一点)
我做错了什么?为什么这不会更快超时?我的印象是 redis.DialConnectTimeout(1*time.Second)
会将问题限制在 1 秒,但事实并非如此。
编辑:事实证明这是由于我在普罗米修斯中犯了一个错误,将桶设置得太大,所以当 redis 在一秒钟后超时时,我的桶设置为 1s 桶和 10s bucket,所以我的请求(刚刚超过 1s)最终进入了 10s 的 bucket,从而扭曲了结果。不过,我相信这个讨论在某些时候会对某些人有用。
最佳答案
失败后的速率限制拨号尝试:
func main() {
var (
nextDial time.Time
mu sync.Mutex
)
state.redisPool = &redis.Pool{
MaxIdle: 200,
MaxActive: 9000,
IdleTimeout: time.Minute,
Dial: func() (redis.Conn, error) {
mu.Lock() // Dial can be called concurrently
defer mu.Unlock()
if time.Now().Before(nextDial) {
return nil, errors.New("waiting for dial")
}
c, err := redis.Dial("tcp", *redisAddress,
redis.DialConnectTimeout(1*time.Second),
redis.DialReadTimeout(100*time.Millisecond),
redis.DialWriteTimeout(100*time.Millisecond),
)
if err == nil {
nextDial = time.Time{}
} else {
nextDial = time.Now().Add(time.Second) // don't attempt dial for one second
}
return c, err
},
}
}
关于go - Redigo:当 Redis 服务器关闭时快速失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44675948/
我正在针对我的 redigo 函数运行这个测试,看看它是否支持大量并发写入,这是代码 import ( "github.com/gomodule/redigo/redis" "log"
我正在使用 Redigo通过golang连接到redis服务器。 redisConnection, err = redis.Dial("tcp", "...") redisConnection.Do(
Redis Connecting.....! panic: runtime error: invalid memory address or nil pointer dereference [sign
所以,我有必要连接到 3 个 redis 服务器。我创建了 3 个连接池,并初始化了它们中的每一个。但是 redigo 似乎只连接到单个 redis 服务器,尽管我使用不同的池获得连接。 使用 red
我以前一直在用这个: data, err := redis.Bytes(c.Do("GET", key)) 确保返回的数据是 byte slice 。 但是,我现在需要向 Redis 请求添加一个额外
Redigo 是 redis 数据库的 golang 客户端。它使用 struct Pool 来维护连接池。该结构持有一个互斥锁,用于并行放置和获取连接的应用程序。 type Pool struct
我需要从 Redis 队列执行一个简单的 lpop。在 go lang 中,如果我使用 blpop 使用阻塞弹出,则 foll 代码有效 reply, err := redis.Strings(con
我正在尝试将多个元素推送到一个 Redis 键。当前正在使用 https://github.com/gomodule/redigo 使用 redis 池连接. 如果我尝试将一个数组放入 rpush ,
我设法通过管道传输多个 HGETALL 命令,但我无法将它们转换为字符串。 我的示例代码是这样的: // Initialize Redis (Redigo) client on port 6379 /
我正在使用 redigo library 在 golang 中制作一个 redis 客户端的原型(prototype)获得键空间事件的通知。我修改了 redis.conf 以将 notify-keys
连接到 Redigo 并在函数内部操作数据就像黄油一样简单,但是当您必须重新使用它的连接时,问题就来了,显然是出于性能/实用性的原因。 在这样的函数中执行它是可行的: func main() {
我是redigo从 Go 连接到 redis 数据库。 如何将 []interface {}{[]byte{} []byte{}} 类型转换为一组字符串?在这种情况下,我会喜欢获取两个字符串 Hell
当我连接的 redis 服务器出现故障时,我正在努力让 go 快速失败,我想要一个强大的解决方案。 我正在使用 redigo我正在像这样设置一个连接池: // This has other stuff
我有一个代码: values, err := redis.Values(c.Do("hgetall", value)) if err != nil { fmt.Println("HGETALL
我尝试使用命令刷新脚本:“SCRIPT FLUSH”运行代码如下: c.Send("SCRIPT FLUSH") c.Flush() spew.Dump(c.Receive()) 但是我得到了这个输出
我正在使用库 redigo 将我的 go 程序连接到 redis。当我运行一个请求时,我得到了正确的结果。但是在负载测试中,使用 apache 基准测试工具,它在以下情况下起作用: ab -n 100
在此处的示例中 Redigo Docs for Pool redis 池在 func main 中设置为全局变量。这是做事的犹太洁食方式吗?您真的应该左右使用全局变量,还是有更好、更受欢迎的方法来完成
我需要从 redigo 读取一个 redis 散列。此散列具有可变键。这会导致问题,因为 ScanStruct 要求我事先知道这些键,所以我可以将它放在一个结构中并将 HGETALL 结果解压缩到该结
我正在使用 JSON 序列化结构创建字符串,并在 redis 连接上运行 PUBLISH 命令。 _, err := r.Do("PUBLISH", key, ncs) 此 go 服务用于处理/重新调
使用 redigo,我创建了一个池,类似这样: &redis.Pool{ MaxIdle: 80, MaxActive: 12000, // max number of conne
我是一名优秀的程序员,十分优秀!