導學:
如何學習?
本人建議先安裝redis,如何在命令敲一遍,最後再用go來實現效果更好。實戰!實戰!不實戰就是涼涼!!!!!!!
1.1什麼是redis?
redis:遠端字典服務,是一種執行在記憶體上的非關係型資料庫,它支援的資料型別有:字串,雜湊表,列表,集合(集合分有序/無序)。redisd的所有操作均是原子性的,redis不僅多個操作支援事務,而且還有非常高的讀寫效能。為什麼redis效能比redis高,一個重要的原因就是redis執行在記憶體上面,從物理層就比mysql更有優勢;除此之外,redis使用的演算法是以雜湊為主,時間複雜度為O(1),mysql則主要使用B+樹演算法,時間複雜度為O(logn)當然了,redis是透過空間複雜度來換取時間複雜度。
1.2redis可以幹什麼?
在redis是什麼中,我們沒有提到redis具有key過期這一特性。其實這個特性的是廣泛使用在驗證服務上面,例如卡密,驗證碼等等。。。
當然了,redis是一個高效能nosql資料庫,主要功能就是來存取資料。在一些對效能要求較高的地方,使用的比較多。不過redis也是有缺點的,如果儲存的資料過多,那麼勢必會導致效能有所下降,計算成本也會增加。
1.3使用go操作redis
檢視go的官方文件,我們可以使用使用包:github.com/garyburd/redigo/redis來操作我們的redis。
下載redis包:
go get github.com/garyburd/redigo/redis
1.4連線redis
首先得有redis才能連線,就像MySQL一樣,我們先得在機器上安裝redis
redis的GitHub開源地址:
安裝教程:
連線程式碼如下:
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Println("conn redis failed,", err) return } fmt.Println("redis conn success") defer c.Close()//夾尾巴 }
開啟連線,記得夾尾巴,哈哈哈
1.4.1 string的get 、set操作
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Println("conn redis failed,", err) return } defer c.Close() _, err = c.Do("Set", "abc", 100) if err != nil { fmt.Println(err) return } r, err := redis.Int(c.Do("Get", "abc")) if err != nil { fmt.Println("get abc failed,", err) return } fmt.Println(r) }
注意:
Redis被配置為儲存資料庫快照,但它目前不能持久化到硬碟。用來修改集合資料的命令不能用。請檢視Redis日誌的詳細錯誤資訊。
原因:
強制關閉Redis快照導致不能持久化。
解決方案:
執行config set stop-writes-on-bgsave-error no 命令後,關閉配置項stop-writes-on-bgsave-error解決該問題。
1.4.2 string批次操作
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Println("conn redis failed,", err) return } defer c.Close() _, err = c.Do("MSet", "abc", 100, "efg", 300) if err != nil { fmt.Println(err) return } r, err := redis.Ints(c.Do("MGet", "abc", "efg")) if err != nil { fmt.Println("get abc failed,", err) return } for _, v := range r { fmt.Println(v) } }
1.4.3 設定key過期時間
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Println("conn redis failed,", err) return } defer c.Close() _, err = c.Do("expire", "abc", 10) if err != nil { fmt.Println(err) return } }
1.4.4 list操作
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Println("conn redis failed,", err) return } defer c.Close() _, err = c.Do("lpush", "book_list", "abc", "ceg", 300) if err != nil { fmt.Println(err) return } r, err := redis.String(c.Do("lpop", "book_list")) if err != nil { fmt.Println("get abc failed,", err) return } fmt.Println(r) }
1.4.5 hash表
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Println("conn redis failed,", err) return } defer c.Close() _, err = c.Do("HSet", "books", "abc", 100) if err != nil { fmt.Println(err) return } r, err := redis.Int(c.Do("HGet", "books", "abc")) if err != nil { fmt.Println("get abc failed,", err) return } fmt.Println(r) }
1.4.6 redis連線池
package main import( "fmt" "github.com/garyburd/redigo/redis" ) var pool *redis.Pool //建立redis連線池 func init(){ pool = &redis.Pool{ //例項化一個連線池 MaxIdle:16, //最初的連線數量 // MaxActive:1000000, //最大連線數量 MaxActive:0, //連線池最大連線數量,不確定可以用0(0表示自動定義),按需分配 IdleTimeout:300, //連線關閉時間 300秒 (300秒不使用自動關閉) Dial: func() (redis.Conn ,error){ //要連線的redis資料庫 return redis.Dial("tcp","localhost:6379") }, } } func main(){ c := pool.Get() //從連線池,取一個連結 defer c.Close() //函式執行結束 ,把連線放回連線池 _,err := c.Do("Set","abc",200) if err != nil { fmt.Println(err) return } r,err := redis.Int(c.Do("Get","abc")) if err != nil { fmt.Println("get abc faild :",err) return } fmt.Println(r) pool.Close() //關閉連線池 }