真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何進行Redigo源碼淺析

今天就跟大家聊聊有關(guān)如何進行Redigo源碼淺析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),南和企業(yè)網(wǎng)站建設(shè),南和品牌網(wǎng)站建設(shè),網(wǎng)站定制,南和網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,南和網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

使用 Redigo 比較多,為了方便學習。進而閱讀了它的源碼,加深理解。

// 一段 redigo demo
redisConn = &redis.Pool{
		MaxIdle:     setting.RedisSetting.MaxIdle,
		MaxActive:   setting.RedisSetting.MaxActive,
		IdleTimeout: setting.RedisSetting.IdleTimeout,
		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial("tcp", setting.RedisSetting.Host)
			if err != nil {
				return nil, err
			}
			if setting.RedisSetting.Password != "" {
				if _, err := c.Do("AUTH", setting.RedisSetting.Password); err != nil {
					c.Close()
					return nil, err
				}
			}
			return c, err
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			_, err := c.Do("PING")
			return err
		},
	}
  
conn := RedisConn.Get()
reply, err := redis.Bytes(conn.Do("GET", key))
conn.Close()

這段代碼主要是用來初始化 redis.Pool 的,順著代碼往下走。 用來獲取連接池中的一個 conn 對象。

type Pool struct {
	Dial func() (Conn, error)
	TestOnBorrow func(c Conn, t time.Time) error
	MaxIdle int
	MaxActive int
	IdleTimeout time.Duration
	Wait bool
	MaxConnLifetime time.Duration
	chInitialized uint32 // set to 1 when field ch is initialized

	mu     sync.Mutex    // mu protects the following fields
	closed bool          // set to true when the pool is closed.
	active int           // the number of open connections in the pool
	ch     chan struct{} // limits open connections when p.Wait is true
	idle   idleList      // idle connections
}

type idleList struct {
	count       int
	front, back *poolConn
}

type poolConn struct {
	c          Conn
	t          time.Time
	created    time.Time
	next, prev *poolConn
}

type conn struct {
	// Shared
	mu      sync.Mutex
	pending int
	err     error
	conn    net.Conn

	// Read
	readTimeout time.Duration
	br          *bufio.Reader

	// Write
	writeTimeout time.Duration
	bw           *bufio.Writer

	// Scratch space for formatting argument length.
	// '*' or '$', length, "\r\n"
	lenScratch [32]byte

	// Scratch space for formatting integers and floats.
	numScratch [40]byte
}

RedisConn.Get()

func (p *Pool) get(ctx interface {
	Done() <-chan struct{}
	Err() error
}) (*poolConn, error) {
  ...
  p.active++
	p.mu.Unlock()
	c, err := p.Dial()
	if err != nil {
		c = nil
		p.mu.Lock()
		p.active--
		if p.ch != nil && !p.closed {
			p.ch <- struct{}{}
		}
		p.mu.Unlock()
	}
	return &poolConn{c: c, created: nowFunc()}, err
}

首次連接:

  • 連接池在首次進入的時候是空的,會先進行自定義的 Dial 函數(shù)(匿名函數(shù))進行連接,生成 conn 連接對象。 連接數(shù)+1,并返回連接池對象 poolConn。

執(zhí)行操作:

  • 從連接池中獲取一個可用 conn 連接對象。 并通過 DoWithTimeout 函數(shù)向 conn 輸出緩沖區(qū)寫入數(shù)據(jù)。數(shù)據(jù)內(nèi)容遵從 RESP 協(xié)議。

關(guān)閉操作:

  • 1.因為 Get 拿到的是一個activeConn 對象,所以關(guān)閉連接調(diào)用的是 func (ac *activeConn) Close() 函數(shù)。

  • 2.首先會向 Redis 發(fā)送一個空字符的命令。(沒懂意義何在)

  • 3.緊接著不是刪除這次的鏈接而是把 conn 對象 put 到 idleList (雙向鏈表實現(xiàn)) 的前驅(qū)節(jié)點上 鏈表的長度由 MaxIdle 所限定,超出則拋棄

  • 4.繼續(xù)調(diào)用 conn 的 Close() 函數(shù), 跳轉(zhuǎn)到 net 的 Close() 函數(shù)

  • 5.通過 runtime.SetFinalizer(fd, nil) 解除綁定并執(zhí)行對應(yīng)函數(shù)下一次gc在進行清理 并關(guān)閉基礎(chǔ)文件描述符

看完上述內(nèi)容,你們對如何進行Redigo源碼淺析有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)頁標題:如何進行Redigo源碼淺析
文章URL:http://weahome.cn/article/pcecjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部