golang操做Redis(redigo基礎篇)


如今的redis大紅大紫,並且不少應用場景都適合使用Reids來作緩存或者直接作存儲,典型的如mysql前端緩存、手遊裏面的排行榜等。那麼咱們怎樣用golang來操做redis呢?html

熟悉redis的同窗,確定第一反應就是按照redis的協議,實現一個客戶端與redis服務進行通訊便可。不熟悉redis的同窗,可能會說用cgo封裝下官方的c客戶端,妥妥的。是的,這兩種方法均可以。既然redis這麼火,那麼這些工做有沒有人作呢?答案是確定的。在redis的官方網站的客戶端列表裏就有衆多golang的客戶端。這個時候,可能你又要犯難了,我該用哪個呢?前端

熟悉reids的同窗都知道,官網加星星的客戶端都是好客戶端,就像棒子天上的星星同樣神奇。但是坑爹的時,golang不一樣於python有兩個都是加星星的,這孰真孰假呢?python

具體我也瞭解,不過大概瀏覽了下源碼,兩者都是用golang實現了redis得協議,不過radix的源碼感受不是那麼清晰,相對來講redigo的源碼能夠和命令對上,比較清晰,且redigo說其支持全部的redis命令。而後又網上搜了幾篇文章1/文章2,最終仍是選擇了redigo來嘗試。mysql

一、創建鏈接

conn , err := redis.DialTimeout("tcp", ":6379", 0, 1*time.Second, 1*time.Second)

參數的意義分別是網絡類型「tcp」、地址和端口、鏈接超時、讀超時和寫超時時間。有了鏈接後。咱們就能夠進行其餘操做了。先看下db的大小git

size ,err := conn.Do("DBSIZE")
fmt.Printf("size is %d \n",size)

//輸出:
size is 8

在使用完後,經過調用 conn.Close() 關閉鏈接。github

二、基本命令執行

對於最基本的命令使用,咱們統一調用:golang

Do(commandName string, args ...interface{}) (reply interface{}, err error)

這個接口,整個過程就和咱們使用redis命令同樣。redis

咱們知道在redis的協議中,都是按照字符流的,那麼Do函數是如何進行序列化的呢?下面是其轉換規則:sql

Go Type                 Conversion

[]byte                  Sent as is
string                  Sent as is
int, 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 type

error                   redis.Error
integer                 int64
simple string           string
bulk 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

相關文章
相關標籤/搜索