使用Go語言實現了一個Memcached的客戶端,源代碼放在 github 上。第一次把本身寫的代碼開源,心情有一點點緊張。把 源代碼 地址公佈在這裏,但願對有須要的人有一點幫助,同時也但願能和志同道合的同窗交流。git
個人想法是客戶端同時實現 Memcached 的文本和二進制協議,目前,只實現了文本協議。接下來是完善代碼的封裝,而後再進行二進制協議的實現。github
客戶端的代碼架構很是簡單,核心的部分是:TCP鏈接池 和 服務器選擇 兩部分。緩存
TCP鏈接池服務器
Memcached協議中提議將與服務器的鏈接緩存起來,減小開銷,提升效率。鏈接池的實現,其實是使用了 channel,這樣能夠避免使用同步鎖。架構
考慮到會配置多個Memcached服務端,因此是每一個服務端,對應一個鏈接池。如下是建立鏈接池的代碼:memcached
pool := &ConnectionPool{ pools : make([]chan net.Conn, 0, len(config.Servers)), config : config, }
服務器選擇ui
同一個key,不管什麼狀況下,都應該選中同一臺服務器。目前服務器選擇的實現原理是,先取得 key 的hash code,而後再與服務器數量取餘 來進行定位。這樣作有一個缺點,若是對於的 Memcached 服務器故障,這個key永遠沒法進行緩存(已經在考慮怎麼解決)。code
hashCode := crc32.ChecksumIEEE([]byte(key)) index = hashCode % uint32(len(servers))
先簡單的介紹一下,詳細如何使用,請到 github 查看。server