最近看到這個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,可以檢視評論區的留言