作者:施洪寶
一. go 基礎
- go通過鎖或者原子操作解決協程之間的競爭問題, 本文主要介紹鎖
- go通過通道(有緩衝和無緩衝)解決協程之間的通信問題, 一個協程可能同時與多個其他協程通信, 此時可以通過select進行處理
1.1 鎖
- mutex
- mutex即是一般的互斥鎖, 只有一個協程可以獲取鎖, 其他協程獲取時會被阻塞
- rwmutex
- rwmutex爲讀寫鎖, 某一時刻可能存在多個讀鎖或者一個寫鎖
- lock可以獲取寫鎖, 該調用會一直阻塞直到其他協程釋放鎖, 寫鎖的優先級高於讀鎖; unlock釋放寫鎖
- rlock獲取讀鎖, 當只有讀鎖或者沒有鎖時可以成功獲取鎖, 否則被阻塞; runlock釋放讀鎖
1.2 select
select{
case communication clause:
statement(s)
case communication clause:
statement(s)
/* 可以定義任意多個case */
/* default也可以不定義 */
default:
statement(s)
}
- 每個case 必須是chan操作, 可以爲讀或者寫
- 如果只有一個case可以執行, 則執行該case
- 如果有多個case可以執行, 僞隨機一個case執行, 其他不執行
- 沒有case可以執行則執行default
- 沒有default並且沒有case可以執行則一直阻塞, 直到某個case可以執行
二. Codis
- Codis的結構圖如下(該圖來源於https://github.com/CodisLabs/...
- 從Codis結構圖中可以看出以下幾點
- codis-group由多個codis-server(也就是redis-server)構成,每個codis-group中存在一個master服務器和任意多個slave服務器
- codis-proxy與每個codis-group中的服務器建立連接,並且將自己註冊到zookeeper(或者etcd等)中, 客戶端從zookeeper中獲取可用的codis-proxy, 並與其建立連接, 之後由codis-proxy負責處理客戶端的請求
- codis-dashboard爲codis集羣管理工具: 能夠完成codis-proxy、codis-group、codis-server的增加以及刪除; 數據在codis-group之間的遷移(也就是slot遷移)
- codis-fe爲集羣管理頁面
Codis自帶的測試程序
- codis-fe默認監聽的端口爲9090
- codis-dashboard默認的監聽端口爲18080
- codis-proxy默認的監聽端口爲11080
- codis-server默認監聽的端口爲6379(也就是redis默認的監聽端口)