go實踐十三 使用redis

2021-09-25 12:18:23 字數 1889 閱讀 1322

使用 go run testcolly.go 執行該檔案即可

//redis set 10秒生存時間

_, err = client.setnx("test", "value", 10*time.second).result()

if(err != nil)

//redis get

value := client.get("test");

if err != nil

fmt.println("test", value)

// 自定義redis命令

cmd1 := client.do("get", "test")

client.process(cmd1)

test, err := cmd1.result()

if err != nil else

//使用管道 pipeline 獲取資料

_, err = client.setnx("test1", "value1", 10*time.second).result()

_, err = client.setnx("test2", "value2", 10*time.second).result()

_, err = client.setnx("test3", "value3", 10*time.second).result()

/*redis的pipeline功能的原理是 client通過一次性將多條redis命令發往redis server,減少了每條命令分別傳輸的io開銷。同時減少了系統呼叫的次數,因此提公升了整體的吞吐能力。

我們在主-從模式的redis中,pipeline功能應該用的很多,但是cluster模式下,估計還沒有幾個人用過。

我們知道 redis cluster 預設分配了 16384 個slot,當我們set乙個key 時,會用crc16演算法來取模得到所屬的slot,然後將這個key 分到雜湊槽區間的節點上,具體演算法就是:crc16(key) % 16384。如果我們使用pipeline功能,乙個批次中包含的多條命令,每條命令涉及的key可能屬於不同的slot

go-redis 為了解決這個問題, 分為3步

原始碼可以閱讀 defaultprocesspipeline

1) 將計算command 所屬的slot, 根據slot選擇合適的cluster node

2)將同乙個cluster node 的所有command,放在乙個批次中傳送(併發操作)

3)接收結果

*/ pipe := client.pipeline()

pipe.get("test1")

pipe.get("test2")

pipe.get("test3")

cmders, err := pipe.exec()

if err != nil

for _, cmder := range cmders

fmt.println("str", str) }}

//初始化鏈結

func redisinits() error)

pong, err := client.ping().result()

if(err != nil)

fmt.println(pong)

// output: pong return nil

}參考:

參考:

go實踐二十三 使用正則

使用 go run testregexp.go 執行該檔案即可 通過正則判斷是否匹配 regexp包中含有三個函式用來判斷是否匹配,如果匹配返回true,否則返回false func match pattern string,b byte matched bool,error error func ...

go實踐十五 使用redis快取操作普通佇列

目錄架構 http伺服器 redis 熱重啟的參考 下面說的是使用redis快取佇列 和 操作普通佇列fifo 先進先出 package model 普通佇列 使用先進先出fifo type normalqueue struct 佇列長度 func queue normalqueue length ...

Redis(十三)redis事務

redis作為乙個非關係型資料庫,其也是有事務操作的。redis 事務可以一次執行多個命令,並且帶有以下三個重要的保證 1 批量操作在傳送 exec 命令前被放入佇列快取。2 收到 exec 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。3 在事務執行過程,其他客戶端提交的命令請...