golang redis线程池优化

让我们先从pool的数据结构说起:

Dial:是必须要实现的,就是调用普通的的redis.Dial即可。

TestOnBorrow:在获取conn的时候会调用一次这个方法,来保证连接可用(其实也不是一定可用,因为test成功以后依然有可能被干掉),这个方法是可选项,一般这个方法是去调用一个redis的ping方法,看项目需求了,如果并发很高,想极限提高速度,这个可以不设置。如果想增加点连接可用性,还是加上比较好。看个人取舍了。

MaxIdle,idle,IdleTimeout:都是idle相关设置,MaxIdle决定idle的列表长度,IdleTimeout决定了idle列表中conn的生命周期,默认为0,即lifetime,如果设置了idleTimeout的话,在获取conn的时候会检查idle队列中的连接,把超时的连接关闭掉。

MaxActive:线程池的最大连接数。线程池都是优先复用已有的连接,但是不可避免总是会有新建连接的时候,那么这个值就是限定了连接数的上限。

Wait:当连接数已满,是否要阻塞等待获取连接。false表示不等待,直接返回错误。

下面我们分析一下核心的获取连接的方法

// get prunes stale connections and returns a connection from the idle list or

// creates a new connection.

func (p *Pool) get() (Conn, error) {

p.mu.Lock()

// Prune stale connections.

//检查超时的连接,如果超时,则从idle队列中移除

if timeout := p.IdleTimeout; timeout > 0 {

for i, n := 0, p.idle.Len(); i < n; i++ {

e := p.idle.Back()

if e == nil {

break

}

ic := e.Value.(idleConn)

if ic.t.Add(timeout).After(nowFunc()) {

break

}

p.idle.Remove(e)

p.release()

p.mu.Unlock()

ic.c.Close()

p.mu.Lock()

}

}

for {

// Get idle connection.

//从idle队列中复用已有的连接

for i, n := 0, p.idle.Len(); i < n; i++ {

e := p.idle.Front()

if e == nil {

break

}

ic := e.Value.(idleConn)

p.idle.Remove(e)

test := p.TestOnBorrow

p.mu.Unlock()

if test == nil || test(ic.c, ic.t) == nil {

return ic.c, nil

}

ic.c.Close()

p.mu.Lock()

p.release()

}

// Check for pool closed before dialing a new connection.

if p.closed {

p.mu.Unlock()

return nil, errors.New("redigo: get on closed pool")

}

// Dial new connection if under limit.

//还没达到最大连接数,idle中又没有可用的连接,那么就new一个连接出来

if p.MaxActive == 0 || p.active < p.MaxActive {

dial := p.Dial

p.active += 1

p.mu.Unlock()

c, err := dial()

if err != nil {

p.mu.Lock()

p.release()

p.mu.Unlock()

c = nil

}

return c, err

}

if !p.Wait {

p.mu.Unlock()

return nil, ErrPoolExhausted

}

if p.cond == nil {

p.cond = sync.NewCond(&p.mu)

}

p.cond.Wait()

}

}

综上可知,想提高redis的处理速度,可以把idle设置的大一点,当然active的值是一定要比idle大的(0表示不限制)。这里还有一点需要注意的redis本身支持的连接数设置问题,刚才分析的都是client端的情况,如果server只支持100的连接数,那客户端的pool设定再多也没有用,redis的连接数配置又是另外一个话题,这里就不展开讲。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 不支持上传文件,所以就复制过来了。作者信息什么的都没删。对前端基本属于一窍不通,所以没有任何修改,反正用着没问题就...
    全栈在路上阅读 1,926评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 一、官网关于自动释放池的说明截取 NSAutoreleasePool NSAutoreleasePool 类被用来...
    Mitchell阅读 13,949评论 5 40
  • 月亮森林,有眼泪种下的相思草,每次满月的时候,相思草疯长,于风中摇曳,笛声声声慢,他与她相会,煮一壶热茶,品一往深...
    轻拂一衣痕阅读 170评论 0 0
  • 呼兰河是我故乡的河,河上有船,但是不很多。河的对岸似乎没有人家,而是一片柳条林。再往远看,就不能知道那是什么地方了...
    柒木流言阅读 1,615评论 0 3