天天看點

go gomemcache包源碼分析

因為beego中的cache子產品中的子子產品memcached引用了這個包,是以也對這包的源碼進行分析了下。花了一定的時間編寫整理這篇部落格,這個包一共兩個檔案, 源碼檔案

關于memcache學習,可以到

http://www.runoob.com/memcached/memcached-tutorial.html

這邊教程學習

1)func New(server ...string) *Client

用法:

mc := memcache.New("127.0.0.1:11211")

主要可以分為以下步驟:

1、傳入一個合法的memcached伺服器位址資訊

2、定義變量和指派

New方法流程圖如下,

點選下載下傳

2)func (c Client) Add(item Item) error

作用:

mc.Add(&memcache.Item{Key:"data",Value:[]byte("你好!")})

1、選擇一個memcache伺服器并擷取連接配接

2、發送資料到memcached伺服器

3、接收memcached資訊和處理連接配接

Add方法流程圖如下,

3)func (c Client) Set(item Item) error

mc.Set(&memcache.Item{Key:"data",Value:[]byte("你好!")})

主要分為以下步驟:

1、選擇一個memcached伺服器并進行連接配接

2、向連接配接的那個memcached伺服器發送資料并處理相關内容

3、連接配接處理(回收或釋放)

Set方法流程圖如下,

4)func (c Client) Get(key string) (item Item, err error)

i, err := mc.Get("data")

fmt.Println(i, err)

主要可分為三個步驟

1:擷取tcp連接配接

2:發送資料到memcached

3:處理memcached傳回消息和tcp連接配接處理(放入回收池或釋放)

Get方法流程圖如下,

5)func (c Client) GetMulti(keys []string) (map[string]Item, error)

items, err := mc.GetMulti([]string{"data1","data2","data3"})

GetMulti方法流程圖如下,

6)func (c *Client) Increment(key string, delta uint64) (newValue uint64, err error)

newVal, err := mc.Increment("test", 2)

fmt.Println(newVal, err)

作用:将原來鍵的值加上指定數,可分為以下兩種情況:

1、如果原來的是一個數字,則加上指定數,傳回修改後的值和nil

2、如果原來的不是一個數,則傳回0和報錯資訊

内部執行步驟:

1、連接配接memcached伺服器

3、斷開連接配接,對連接配接進行回收或釋放

Delete方法流程圖如下,

7)func (c *Client) Decrement(key string, delta uint64) (newValue uint64, err error)

newVal, err := mc.Decrement("test", 2)

作用:将原來鍵的值減去指定數,可分為以下兩種情況:

1、如果原來的是一個數字,則減去指定數,傳回修改後的值和nil

Decrement方法流程圖如下,

8)func (c Client) CompareAndSwap(item Item) error

mc.CompareAndSwap(&memcache.Item{Key:"data",

Value:[]byte("你好!")})
           

封裝發給memcached伺服器的指令是:cas data 0 0 9 0

1、選擇一個memcached伺服器位址并進行連接配接

2、向memcached伺服器發送資料和處理伺服器傳回的資訊

3、連接配接結束處理(回收或釋放)

CompareAndSwap方法流程圖如下,[點選下載下傳]

(

https://github.com/laijinhang/go-gomemcache-study/blob/master/CompareAndSwap

方法.odg)

9)func (c *Client) FlushAll() error

err := mc.FlushAll()

用于清理緩存中的所有 key=>value(鍵=>值) 對

1、往每個memcached伺服器發送資料和接收處理memcached資訊

2、和處理連接配接

FlushAll方法流程圖如下,

10)func (c *Client) Replace() error

err := mc.Replace()

發送replace指令到mecmached伺服器,該指令用于替換已存在的

key(鍵)的value(資料值)。

如果 key 不存在,則替換失敗,并且您将獲得響應 NOT_STORED。

Replace方法流程圖如下,

11)func (c *Client) Touch(key string, seconds int32) (err error)

err := mc.Touch("data", 120)

發送touch指令到mecmached伺服器,如果key不存在,則會傳回錯誤,

如果key存在,則會在設定的時間後自動删除。

1、擷取伺服器位址操作

2、往每個memcached伺服器發送資料和接收處理memcached資訊

Touch方法流程圖如下,

12)func (c *Client) Delete(key string) error

err := mc.Delete("test")

将原有key對應的内容删除

1、擷取連接配接

13)func (c *Client) DeleteAll() error

err := mc.DeleteAll()

将内容删除

(和Delete共用一套實作代碼)

DeleteAll方法流程圖如下,

相關連結:

源碼連結:

https://github.com/laijinhang/gomemcache

筆記連結:

https://github.com/laijinhang/go-gomemcache-study