go操作redis

2023-03-02 15:00:12

導學:

如何學習?

本人建議先安裝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() //關閉連線池
}