標籤:golang redis
現在的redis大紅大紫,而且很多應用情境都適合使用Reids來做緩衝或者直接做儲存,典型的如mysql前端緩衝、手遊裡面的熱門排行榜等。那麼我們怎樣用golang來操作redis呢?
熟悉redis的同學,肯定第一反應就是按照redis的協議,實現一個用戶端與redis服務進行通訊即可。不熟悉redis的同學,可能會說用cgo封裝下官方的c用戶端,妥妥的。是的,這兩種方法都可以。既然redis這麼火,那麼這些工作有沒有人做呢?答案是肯定的。在redis的官方網站的用戶端列表裡就有眾多golang的用戶端。這個時候,可能你又要犯難了,我該用哪一個呢?
熟悉reids的同學都知道,官網加星星的用戶端都是好用戶端,就像棒子天上的星星一樣神奇。可是坑爹的時,golang不同於python有兩個都是加星星的,這孰真孰假呢?
具體我也瞭解,不過大概瀏覽了下源碼,二者都是用golang實現了redis得協議,不過radix的源碼感覺不是那麼清晰,相對來說redigo的源碼可以和命令對上,比較清晰,且redigo說其支援所有的redis命令。然後又網上搜了幾篇文章1/文章2,最終還是選擇了redigo來嘗試。
1、建立串連
conn , err := redis.DialTimeout("tcp", ":6379", 0, 1*time.Second, 1*time.Second)
參數的意義分別是網路類型“tcp”、地址和連接埠、連線逾時、讀逾時和寫逾時時間。有了串連後。我們就可以進行其他動作了。先看下db的大小
size ,err := conn.Do("DBSIZE")fmt.Printf("size is %d \n",size)//輸出:size is 8
在使用完後,通過調用 conn.Close()
關閉串連。
2、基本命令執行
對於最基本的命令使用,我們統一調用:
Do(commandName string, args ...interface{}) (reply interface{}, err error)
這個介面,整個過程就和我們使用redis命令一樣。
我們知道在redis的協議中,都是按照字元流的,那麼Do函數是如何進行序列化的呢?下面是其轉換規則:
Go Type Conversion[]byte Sent as isstring Sent as isint, int64 strconv.FormatInt(v)float64 strconv.FormatFloat(v, ‘g‘, -1, 64)bool true -> "1", false -> "0"nil ""all other types fmt.Print(v)
其實就是byte數組和字串不變,整形和浮點數轉換成對應的字串,bool用1或者0表示,nil為空白字串。
下面再看下執行後得到的結果傳回值的類型:
Redis type Go typeerror redis.Errorinteger int64simple string stringbulk string []byte or nil if value not present.array []interface{} or nil if value not present.
如上表,redis中得類型會對應的轉換成左邊go中得類型,無需多解釋。我們來看幾個例子:
conn , err := redis.DialTimeout("tcp", ":6379", 0, 1*time.Second, 1*time.Second)if err != nil { panic(err)}size ,err:= conn.Do("DBSIZE")fmt.Printf("size is %d \n",size)_,err = conn.Do("SET","user:user0",123)_,err = conn.Do("SET","user:user1",456)_,err = conn.Do("APPEND","user:user0",87)user0,err := redis.Int(conn.Do("GET","user:user0"))user1,err := redis.Int(conn.Do("GET","user:user1"))fmt.Printf("user0 is %d , user1 is %d \n",user0,user1)conn.Close()
從redis傳回來得普通對象(整形、字串、浮點數)。redis提供了類型轉換函式供轉換:
func Bool(reply interface{}, err error) (bool, error)func Bytes(reply interface{}, err error) ([]byte, error)func Float64(reply interface{}, err error) (float64, error)func Int(reply interface{}, err error) (int, error)func Int64(reply interface{}, err error) (int64, error)func String(reply interface{}, err error) (string, error)func Strings(reply interface{}, err error) ([]string, error)func Uint64(reply interface{}, err error) (uint64, error)
這裡只是舉了set和get命令。其他的例子可以參見redigo的conn_test.go