GO語言中Redis的相關知識記錄

最近看到這個github。com/go-redis/redis/v8已經更新了,今天下載下來用用

這裡分享一個關於redis實戰的書籍,分享連結,可以查底下留言獲取

安裝Redis包

go get github。com/go-redis/redis/v8

由於這個`v8`版本,使用了`context`這個包,`context`這個包是做什麼的呢? 這個包提供上下文機制在`goroutine`之間傳遞`deadline`,`取消訊號 `或其請求相關的資訊,其實說白了就是,如何優雅的管理`goroutine`

context包基本使用

//伺服器會為每個程式建立一個根Context例項,

//goroutine接受根context的一個派生Context物件

//goroutine透過 context。Done()方法監聽取消訊號

//例子,WithCancel()的使用

//如何優雅地關閉一個goroutine

package main

import (

“context”

“fmt”

“time”

func f1(ctx context。Context) {

LOOPUP:

for {

fmt。Println(“我在執行”)

time。Sleep(time。Second)

//這裡是使用select監聽通道,如果發現ctx。done()中有值,則直接跳出迴圈

select {

case <-ctx。Done():

break LOOPUP

default:

}

}

}

func main() {

//建立一個取消訊號的根context例項

ctx,cancelFunc :=context。WithCancel(context。Background())

go f1(ctx)

time。Sleep(time。Second*5)

//執行5秒後,傳送退出訊號

cancelFunc()

}

//也可以使用WithDeadline() 指定到期時間觸發

nowtime :=time。Now()。Add(time。Second*3) //當前時間+3秒

//3秒後停止

//這裡的時間是一個time型別

ctx,_:=context。WithDeadline(context。Background(),nowtime)

go f1(ctx)

//也可以指定WithTimeout(),在多少秒後執行退出

//這裡的時間是一個time。Duration型別,用法一樣

func WithTimeout(parent Context, timeout time。Duration) (Context, CancelFunc)

redis的基本操作

以下的命令只是簡單演示幾個常用的,redis裡的命令,這個包都是支援的

建立Redis連線

package main

import (

“context”

“fmt”

“github。com/go-redis/redis/v8”

//定義一個根context物件

var ctx=context。Background()

var rdb *redis。Client

//建立連線物件,底層是使用的連結池

func init() {

rdb =redis。NewClient(&redis。Options{

Addr: “127。0。0。1:6379”,

Password: “”,

DB: 0,

})

}

字串操作

//這裡封裝了一個函式,這裡是基本的操作,別的命令都可以按這種寫法實現

func redisString() {

//設定值

err :=rdb。Set(ctx,“set1”,“name1”,0)。Err()

fmt。Println(err)

//獲取值

vaule ,_:=rdb。Get(ctx,“set1”)。Result()

fmt。Println(“值是,”,vaule)

//刪除 刪除成功 n>0

n,err :=rdb。Del(ctx,“set1”)。Result()

fmt。Println(“刪除,”,n,err)

}

Hash操作

//hash操作

func redisHash() {

//寫入資料

//第一種寫法

err:=rdb。HSet(ctx,“hash1”,“name”,“tom”,“age”,18)。Err()

//第二種

err =rdb。HSet(ctx,“hash2”,map[string]interface{}{“name”:“tom2”,“age”:18})。Err()

//第三種也可以使用切片來傳入,但是值得是一樣的型別

err =rdb。HSet(ctx,“hash3”,[]string{“name”,“tome3”,“age”,“182”})。Err()

//獲取值

res,_:=rdb。HGet(ctx,“hash1”,“name”)。Result()

fmt。Println(res)

//獲取所有的資訊 值

var reslutl map[string]string

reslutl,err=rdb。HGetAll(ctx,“hash2”)。Result()

fmt。Println(reslutl,err)

n,_:=rdb。HLen(ctx,“hash2”)。Result()

fmt。Println(“key的數量”,n)

}

Lists列表操作

//可以使用列表實現,佇列或棧的操作,也可以使用brpop或blpop實現阻塞佇列,這裡就不寫了

func redisLists() {

//向列表新增值

//err :=rdb。LPush(ctx,“list1”,“name1”,“name2”,“name3”)。Err()

//fmt。Println(err)

//檢視列表中的元素

var result []string

result,_ =rdb。LRange(ctx,“list1”,0,-1)。Result()

fmt。Println(“列表元素的值”,result)

//彈出元素

res,err :=rdb。LPop(ctx,“list1”)。Result()

fmt。Println(“彈出的元素”,res,err)

}

Set集合

//set集合,這個可以抽獎,去重等操作

func redisSet() {

//向集合裡新增資料

//err :=rdb。SAdd(ctx,“set11”,“mem1”,“mem2”,“mem3”)。Err()

//err =rdb。SAdd(ctx,“set22”,“mem2”,“mem3”,“mem4”)。Err()

var res []string

//檢視元素

res,_=rdb。SMembers(ctx,“set11”)。Result()

fmt。Println(“檢視元素”,res)

//檢視元素個數

n,_:=rdb。SCard(ctx,“set11”)。Result()

fmt。Println(“檢視元素個數”,n)

//取交集

res ,_=rdb。SInter(ctx,“set11”,“set22”)。Result()

fmt。Println(“交集”,res)

//取並集

res ,_ =rdb。SDiff(ctx,“set11”,“set22”)。Result()

fmt。Println(“並集”,res)

//取全集

res,_=rdb。SUnion(ctx,“set11”,“set22”)。Result()

fmt。Println(“全集”,res)

//刪除指定元素

n,err :=rdb。SRem(ctx,“set11”,“mem1”)。Result()

fmt。Println(n,err)

//隨機彈出

str:=rdb。SPop(ctx,“set22”)。Err()

fmt。Println(str)

}

Zset有序集合操作

//這個比較麻煩點,但是不難

func redisZset() {

//新增帶分數的元素

//err :=rdb。ZAdd(ctx,“zset1”,&redis。Z{Score: 50,Member: “tom1”},&redis。Z{Score: 60,Member: “tom2”}, &redis。Z{Score: 70,Member: “tom3”},&redis。Z{Score: 70,Member: “tom4”})。Err()

//_=rdb。ZAdd(ctx,“zset2”,&redis。Z{Score: 100,Member: “tom4”},&redis。Z{Score: 90,Member: “tom5”},&redis。Z{Score: 85,Member: “tom6”})。Err()

//fmt。Println(err)

//檢視集合裡的元素

//var res []string

//res ,_ =rdb。ZRange(ctx,“zset1”,0,-1)。Result()

////引數,透過分數查詢

//res,_=rdb。ZRangeByScore(ctx,“zset1”,&redis。ZRangeBy{

// Min: “0”,

// Max: “90”,

// Offset: 0,

// Count: 0,

//})。Result()

//fmt。Println(res)

//var res2 []redis。Z

////帶分數查詢

//res2,_=rdb。ZRangeArgsWithScores(ctx,redis。ZRangeArgs{

// Key: “zset1”,

// Start: 0,

// Stop: -1,

// ByScore: false,

// ByLex: false,

// Rev: true,

// Offset: 0,

// Count: 0,

//})。Result()

//fmt。Println(“集合中的元素”,res2)

//交集

var res []string

res ,_ =rdb。ZInter(ctx,&redis。ZStore{

Keys: []string{“zset1”,“zset2”},

Weights: nil,

Aggregate: “min”,//這裡 取值有,sum,min,max

})。Result()

fmt。Println(“交集的資料”,res)

var res2 []redis。Z

res2 ,_ =rdb。ZInterWithScores(ctx,&redis。ZStore{

Keys: []string{“zset1”,“zset2”},

Weights: nil,

Aggregate: “max”,//取交集分值大的那個值

})。Result()

fmt。Println(“交集帶分數的資料”,res2)

//並集

res,_=rdb。ZDiff(ctx,“zset1”,“zset2”)。Result()

fmt。Println(“並集”,res)

}

PS:

這裡只是列出了常用的基本資料結構,還有些別的命令沒有寫,比如關於地理位置的Geo,和bitmaps和redis事務,在這個包中都是支援的,由於篇幅有 限,這裡就不寫了

如果有需要redis場景實戰的pdf,可以檢視評論區的留言