Golang 入門系列(七) Redis的使用

安裝

1. Redis 的安裝很簡單,我這裏測試直接用的是windows 的版本。如何安裝就不細說了。想了解的能夠看以前的文章:https://www.cnblogs.com/zhangweizhong/category/771056.html
 
2. golang 客戶端,用的是 go-redis,
  1.   go get github.com/go-redis
       2.  接着在代碼中導入此包便可: 
  import "github.com/go-redis/redis"
 

基本操做

建立Redis鏈接客戶端

經過 redis.NewClient 函數便可建立一個 redis 客戶端, 這個方法接收一個 redis.Options 對象參數, 經過這個參數, 咱們能夠配置 redis 相關的屬性, 例如 redis 服務器地址, 數據庫名, 數據庫密碼等。
// 建立 redis 客戶端
func GetRedisClient() *Client {
    redisdb := NewClient(&Options{
        Addr:     "127.0.0.1:6379",
        Password: "", // no password set
        DB:       0,                 // use default DB
    })

    pong, err := redisdb.Ping().Result()
    if err != nil {
        fmt.Println(pong, err)
    }
    return redisdb
}

經過 cient.Ping() 來檢查是否成功鏈接到了 redis 服務器html

 

String 操做

  S et(key, value):給數據庫中名稱爲key的string賦予值valueget(key):返回數據庫中名稱爲key的string的value
  GetSet(key, value):給名稱爲key的string賦予上一次的value
  MGet(key1, key2,…, key N):返回庫中多個string的value
  SetNX(key, value):添加string,名稱爲key,值爲value
  SetXX(key, time, value):向庫中添加string,設定過時時間time
  MSet(key N, value N):批量設置多個string的值
  MSetNX(key N, value N):若是全部名稱爲key i的string都不存在
  Incr(key):名稱爲key的string增1操做
  Incrby(key, integer):名稱爲key的string增長integer
  Decr(key):名稱爲key的string減1操做
  Decrby(key, integer):名稱爲key的string減小integer
  Append(key, value):名稱爲key的string的值附加valuesubstr(key, start, end):返回名稱爲key的string的value的子串
func StringDemo() {
    fmt.Println("-----------------------welcome to StringDemo-----------------------")
    redisClient:=GetRedisClient()
    if redisClient ==nil{
        fmt.Errorf("StringDemo redisClient is nil")
        return
    }

    name := "張三"
    key :="name:zhangsan"
    redisClient.Set(key , name,1 * time.Second)
    val := redisClient.Get(key)
    if val == nil {
        fmt.Errorf("StringDemo get error")
    }
    fmt.Println("name", val)
}

 

List 操做

  RPush(key, value):在名稱爲key的list尾添加一個值爲value的元素
  LPush(key, value):在名稱爲key的list頭添加一個值爲value的 元素
  LLen(key):返回名稱爲key的list的長度
  LRange(key, start, end):返回名稱爲key的list中start至end之間的元素
  LTrim(key, start, end):截取名稱爲key的list
  LIndex(key, index):返回名稱爲key的list中index位置的元素
  LSet(key, index, value):給名稱爲key的list中index位置的元素賦值
  LRem(key, count, value):刪除count個key的list中值爲value的元素
  LPop(key):返回並刪除名稱爲key的list中的首元素
  RPop(key):返回並刪除名稱爲key的list中的尾元素
  BLPop(key1, key2,… key N, timeout):lpop命令的block版本。
  BRPop(key1, key2,… key N, timeout):rpop的block版本。
  RPopLPush(srckey, dstkey):返回並刪除名稱爲srckey的list的尾元素,並將該元素添加到名稱爲dstkey的list的頭部
func ListDemo(){
    fmt.Println("-----------------------welcome to ListDemo-----------------------")
    redisClient:=GetRedisClient()
    if redisClient == nil {
        fmt.Errorf("ListDemo redisClient is nil")
        return
    }
    articleKey := "article"
    result,err:=redisClient.RPush(articleKey, "a","b","c").Result() //
    if err!=nil {
        fmt.Println(err)
        return
    }
    fmt.Println("result:",result)

    result,err = redisClient.LPush(articleKey, "d").Result() //
    if err!=nil {
        fmt.Println(err)
        return
    }
    fmt.Println("result:",result)

    length, err := redisClient.LLen(articleKey).Result()
    if err != nil {
        fmt.Println("ListDemo LLen is nil")
    }
    fmt.Println("length: ", length) // 長度

    mapOut,err1:=redisClient.LRange(articleKey,0,100).Result()
    if err1!=nil {
        fmt.Println(err1)
        return
    }
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
}

Hash 操做

  HSet(key, field, value):向名稱爲key的hash中添加元素field
  HGet(key, field):返回名稱爲key的hash中field對應的value
  HMget(key, (fields)):返回名稱爲key的hash中field i對應的value
  HMset(key, (fields)):向名稱爲key的hash中添加元素field
  HIncrby(key, field, integer):將名稱爲key的hash中field的value增長integer
  HExists(key, field):名稱爲key的hash中是否存在鍵爲field的域
  HDel(key, field):刪除名稱爲key的hash中鍵爲field的域
  HLen(key):返回名稱爲key的hash中元素個數
  HKeys(key):返回名稱爲key的hash中全部鍵
  HVals(key):返回名稱爲key的hash中全部鍵對應的value
  HGetall(key):返回名稱爲key的hash中全部的鍵(field)及其對應的value
 
func HashDemo() {
    fmt.Println("-----------------------welcome to HashDemo-----------------------")
    redisClient := GetRedisClient()
    if redisClient == nil {
        fmt.Errorf("HashDemo redisClient is nil")
        return
    }
    article := Article{18, "測試文章內容22222", "測試文章內容22222測試文章內容22222測試文章內容22222", 10, 0}
    articleKey := "article:18"
 
    redisClient.HMSet(articleKey, ToStringDictionary(&article))
    mapOut := redisClient.HGetAll(articleKey).Val()
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
    fmt.Print("\n")
 
    redisClient.HSet(articleKey, "Content", "測試文章內容")
    mapOut = redisClient.HGetAll(articleKey).Val()
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
    fmt.Print("\n")
 
    view, err := redisClient.HIncrBy(articleKey, "Views", 1).Result()
    if err != nil {
        fmt.Printf("\n HIncrBy error=%s ", err)
    } else {
        fmt.Printf("\n HIncrBy Views=%d ", view)
    }
    fmt.Print("\n")
 
    mapOut = redisClient.HGetAll(articleKey).Val()
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
    fmt.Print("\n")
 
}

 

鏈接池

go-redis 已經實現了 redis 的鏈接池管理, 所以咱們不須要本身手動管理 redis 的鏈接。
默認狀況下,鏈接池大小是10, 能夠經過 redis.Options 的 PoolSize 屬性, 咱們設置了 redis 鏈接池的大小爲5。
func GetRedisClientPool() *Client{
    redisdb := NewClient(&Options{
        Addr: "127.0.0.1:6379",
        Password: "",
        DB: 0,
        PoolSize: 5,})

    pong, err := redisdb.Ping().Result()
    if err != nil {
        fmt.Println(pong, err)
    }
    return redisdb
}
// 鏈接池測試
func connectPoolTest() {
    fmt.Println("-----------------------welcome to connect Pool Test-----------------------")
    client :=GetRedisClientPool()
    wg := sync.WaitGroup{}
    wg.Add(10)

    for i := 0; i < 10; i++ {
        go func() {
            defer wg.Done()

            for j := 0; j < 1000; j++ {
                client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err()
                client.Get(fmt.Sprintf("name%d", j)).Result()
            }

            fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().IdleConns);
        }()
    }

    wg.Wait()
}

完整代碼

package main

import (
    "fmt"
    . "github.com/go-redis/redis"
    . "redisDemo/models"
    "time"
    "sync"
)

func main() {
    fmt.Println("-----------------------welcome to redisdemo-----------------------")
    //StringDemo()
    //ListDemo()
    //HashDemo()
    connectPoolTest()
}

func StringDemo() {
    fmt.Println("-----------------------welcome to StringDemo-----------------------")
    redisClient:=GetRedisClient()
    if redisClient ==nil{
        fmt.Errorf("StringDemo redisClient is nil")
        return
    }

    name := "張三"
    key :="name:zhangsan"
    redisClient.Set(key , name,1 * time.Second)
    val := redisClient.Get(key)
    if val == nil {
        fmt.Errorf("StringDemo get error")
    }
    fmt.Println("name", val)
}

func ListDemo(){
    fmt.Println("-----------------------welcome to ListDemo-----------------------")
    redisClient:=GetRedisClient()
    if redisClient == nil {
        fmt.Errorf("ListDemo redisClient is nil")
        return
    }
    articleKey := "article"
    result,err:=redisClient.RPush(articleKey, "a","b","c").Result() //在名稱爲 key 的list尾添加一個值爲value的元素
    if err!=nil {
        fmt.Println(err)
        return
    }
    fmt.Println("result:",result)

    result,err = redisClient.LPush(articleKey, "d").Result() //在名稱爲 key 的list頭添加一個值爲value的元素
    if err!=nil {
        fmt.Println(err)
        return
    }
    fmt.Println("result:",result)

    length, err := redisClient.LLen(articleKey).Result()
    if err != nil {
        fmt.Println("ListDemo LLen is nil")
    }
    fmt.Println("length: ", length) // 長度

    mapOut,err1:=redisClient.LRange(articleKey,0,100).Result()
    if err1!=nil {
        fmt.Println(err1)
        return
    }
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
}

func HashDemo() {
    fmt.Println("-----------------------welcome to HashDemo-----------------------")
    redisClient := GetRedisClient()
    if redisClient == nil {
        fmt.Errorf("HashDemo redisClient is nil")
        return
    }
    article := Article{18, "測試文章內容22222", "測試文章內容22222測試文章內容22222測試文章內容22222", 10, 0}
    articleKey := "article:18"

    redisClient.HMSet(articleKey, ToStringDictionary(&article))
    mapOut := redisClient.HGetAll(articleKey).Val()
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
    fmt.Print("\n")

    redisClient.HSet(articleKey, "Content", "測試文章內容")
    mapOut = redisClient.HGetAll(articleKey).Val()
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
    fmt.Print("\n")

    view, err := redisClient.HIncrBy(articleKey, "Views", 1).Result()
    if err != nil {
        fmt.Printf("\n HIncrBy error=%s ", err)
    } else {
        fmt.Printf("\n HIncrBy Views=%d ", view)
    }
    fmt.Print("\n")

    mapOut = redisClient.HGetAll(articleKey).Val()
    for inx, item := range mapOut {
        fmt.Printf("\n %s:%s", inx, item)
    }
    fmt.Print("\n")

}

func GetRedisClient() *Client {
    redisdb := NewClient(&Options{
        Addr:     "127.0.0.1:6379",
        Password: "", // no password set
        DB:       0,                 // use default DB
    })

    pong, err := redisdb.Ping().Result()
    if err != nil {
        fmt.Println(pong, err)
    }
    return redisdb
}

func GetRedisClientPool() *Client{
    redisdb := NewClient(&Options{
        Addr: "127.0.0.1:6379",
        Password: "",
        DB: 0,
        PoolSize: 5,})

    pong, err := redisdb.Ping().Result()
    if err != nil {
        fmt.Println(pong, err)
    }
    return redisdb
}

// 鏈接池測試
func connectPoolTest() {
    fmt.Println("-----------------------welcome to connect Pool Test-----------------------")
    client :=GetRedisClientPool()
    wg := sync.WaitGroup{}
    wg.Add(10)

    for i := 0; i < 10; i++ {
        go func() {
            defer wg.Done()

            for j := 0; j < 1000; j++ {
                client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err()
                client.Get(fmt.Sprintf("name%d", j)).Result()
            }

            fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().IdleConns);
        }()
    }

    wg.Wait()
}

最後

1. go語言使用Redis 仍是很是簡單的,以上已經把Redis 的基本的用法講完了。你們能夠本身動手寫代碼試試。git

2. 完整代碼:點擊下載github

相關文章
相關標籤/搜索