詳解如何通過Go來操作Redis實現(xiàn)簡單的讀寫操作
為什么要使用Redis?
對于這個問題,最近看到有種比較清晰的說法,想要記錄下來:
在微服務(wù)的場景下,我們有多臺服務(wù)器。這多臺的服務(wù)器需要去并發(fā)地操作同一個變量。在這種情況下,顯然不能只存放在單個的服務(wù)器上面,而應(yīng)該存放在一個公共的地方——分布式緩存。
我們有時候需要加載大量的數(shù)據(jù)放入緩存。如果說在每臺服務(wù)器上面,都開辟一個很大的內(nèi)存空間來存放這些數(shù)據(jù)的話,顯然非常消耗內(nèi)存。此時我們應(yīng)該也把它們挪到一個公共的地方——分布式緩存
導(dǎo)入對應(yīng)的包
go get github.com/redis/go-redis/v9
創(chuàng)建一個操作Redis的一個客戶端
client := redis.NewClient(&redis.Options{ Addr:"127.0.0.1:6379", //地址,這里使用本地服務(wù)器的默認端口 Password:"123456", //訪問Redis的密碼 DB:0, //使用默認的0號DB }) ctx :=conetxt.TODO() //創(chuàng)建一個默認的context
寫入和讀寫string類型的值
func string(ctx context.Context, client *redis.Client) { key := "name" value := "大臉貓" err := client.Set(ctx, key, value, 1*time.Second).Err() //1秒后失效。0表示永不失效 //錯誤處理 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } //通過Expire設(shè)置3秒后失效 client.Expire(ctx, key, 3*time.Second) v2, err := client.Get(ctx, key).Result() //錯誤處理 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } fmt.Println(v2) //刪除鍵 client.Del(ctx, key) }
string
函數(shù)展示了如何與Redis數(shù)據(jù)庫進行交互,包括設(shè)置鍵值對、設(shè)置過期時間、獲取值以及刪除鍵的操作。下面是詳細的解釋:
func string(ctx context.Context, client *redis.Client)
該函數(shù)接受兩個參數(shù):ctx
是一個類型為context.Context
的上下文對象,client
是與Redis服務(wù)器建立連接的redis.Client
實例。key := "name"
value := "大臉貓"
定義一個鍵(key
)和一個值(value
)。在這里,鍵被設(shè)置為 "name",而值被設(shè)置為 "大臉貓"。這些將作為數(shù)據(jù)存儲在Redis中。err := client.Set(ctx, key, value, 1*time.Second).Err()
這一行代碼使用client.Set
方法來設(shè)置鍵值對的參數(shù)到Redis中。它接受四個參數(shù):ctx
:上下文對象,用于處理操作的超時和取消。key
:要設(shè)置的鍵。value
:要設(shè)置的值。1*time.Second
:過期時間,這里設(shè)置為1秒,表示在1秒后鍵值對會失效。如果將過期時間設(shè)置為0,鍵值對將永不失效。
client.Expire(ctx, key, 3*time.Second)
這是一種另外的方式來設(shè)置鍵的過期時間:通過client.Expire
方法設(shè)置鍵 "name" 在3秒后過期失效。v2, err := client.Get(ctx, key).Result()
通過使用client.Get
方法來獲取鍵"name"對應(yīng)的值。client.Del(ctx, key)
使用client.Del
方法刪除鍵"name",從而把這個鍵值對從Redis中刪除。
寫入和讀取list類型的值
func list(ctx context.Context, client *redis.Client) { key := "ids" values := []interface{}{1, "中", 3, 4} err := client.RPush(ctx, key, values...).Err() //向List右側(cè)插入。如果List不存在會先創(chuàng)建 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } v2, err := client.LRange(ctx, key, 0, -1).Result() //截取。雙閉區(qū)間 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } fmt.Println(v2) client.Del(ctx, key) }
list
函數(shù)展示了Redis的列表(List)數(shù)據(jù)結(jié)構(gòu)的操作,包括向列表右側(cè)插入值、獲取列表元素以及刪除列表。下面是詳細的解釋:
func list(ctx context.Context, client *redis.Client)
該函數(shù)接受兩個參數(shù):ctx
是一個類型為context.Context
的上下文對象,client
是與Redis服務(wù)器建立連接的redis.Client
實例。key := "ids"
values := []interface{}{1, "中", 3, 4}
定義了一個鍵(key
)和一個值的切片(values
)。在這里,鍵被設(shè)置為 "ids",而值的切片包含了多個元素,包括整數(shù)1、字符串 "中"、整數(shù)3和整數(shù)4。這些將作為列表存儲在Redis中。err := client.RPush(ctx, key, values...).Err()
RPush
方法用于將值添加到列表的右側(cè),如果列表不存在,它會先創(chuàng)建一個新的列表。在這里,我們將值1、"中"、3和4依次插入到列表 "ids" 中。
這里的client.RPush
方法向名為 "ids" 的列表右側(cè)插入多個值。它接受三個參數(shù):ctx
:上下文對象,用于處理操作的超時和取消。key
:要插入值的列表的鍵。values...
:要插入的多個值。在這里,我們使用了values...
來將切片values
的元素展開作為參數(shù)。
v2, err := client.LRange(ctx, key, 0, -1).Result()
LRange
方法用于獲取列表中的元素,返回一個字符串切片。在這里,我們將獲取到的元素存儲在v2
變量中。這里使用client.LRange
方法來獲取列表 "ids" 中的所有元素。它接受三個參數(shù):ctx
:上下文對象,用于處理操作的超時和取消。key
:要獲取元素的列表的鍵。0
和-1
:表示要獲取的元素范圍,這里是從列表的第一個元素(下標0)到最后一個元素(-1)。這相當于獲取整個列表。
client.Del(ctx, key)
使用client.Del
方法刪除了鍵為 "ids" 的列表,從而把這個列表從Redis中刪除。
寫入和讀取hashtable類型的
func hashtable(ctx context.Context, client *redis.Client) { //key field1 value1 field2 value2 ... err := client.HSet(ctx, "學(xué)生1", "Name", "張三", "Age", 18, "Height", 173.5).Err() //錯誤處理 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } err = client.HSet(ctx, "學(xué)生2", "Name", "李四", "Age", 20, "Height", 180.0).Err() //錯誤處理 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } age, err := client.HGet(ctx, "學(xué)生2", "Age").Result() //錯誤處理 if err != nil { if err == redis.Nil { fmt.Println("key不存在") } else { fmt.Println(err) os.Exit(1) } } fmt.Println(age) for field, value := range client.HGetAll(ctx, "學(xué)生1").Val() { fmt.Println(field, value) } client.Del(ctx, "學(xué)生1") client.Del(ctx, "學(xué)生2") }
hashtable
函數(shù)具體展示了Redis的哈希表(Hash)數(shù)據(jù)結(jié)構(gòu)的操作,包括設(shè)置字段和值、獲取字段的值、獲取所有字段-值對以及刪除哈希表。下面是詳細的解釋:
func hashtable(ctx context.Context, client *redis.Client)
該函數(shù)接受兩個參數(shù):ctx
是一個類型為context.Context
的上下文對象,client
是與Redis服務(wù)器建立連接的redis.Client
實例。err := client.HSet(ctx, "學(xué)生1", "Name", "張三", "Age", 18, "Height", 173.5).Err()
使用client.HSet
方法向名為 "學(xué)生1" 的哈希表中設(shè)置多個字段(field)和對應(yīng)的值(value)。哈希表是一種鍵值對存儲結(jié)構(gòu),類似于字典。在這里,我們設(shè)置了三對字段和值: "Name" 和 "張三"、"Age" 和 18、"Height" 和 173.5。換言之,就是在 "學(xué)生1" 哈希表中存儲了學(xué)生的姓名、年齡和身高信息。age, err := client.HGet(ctx, "學(xué)生2", "Age").Result()
使用client.HGet
方法獲取名為 "學(xué)生2" 的哈希表中的 "Age" 字段對應(yīng)的值。在這里,我們獲取了學(xué)生的年齡信息,并將其存儲在age
變量中。
for field, value := range client.HGetAll(ctx, "學(xué)生1").Val() { fmt.Println(field, value) }
使用
client.HGetAll
方法獲取名為 "學(xué)生1" 的哈希表中的所有字段和對應(yīng)的值,并將它們以字段-值 對的形式遍歷并打印出來。這樣可以獲取并顯示學(xué)生1的所有信息。client.Del(ctx, "學(xué)生1")
client.Del(ctx, "學(xué)生2")
使用client.Del
方法刪除了 "學(xué)生1" 和 "學(xué)生2" 兩個哈希表。這將從Redis中刪除這兩個哈希表,清除了示例中使用的數(shù)據(jù)。
以上就是詳解如何通過Go來操作Redis實現(xiàn)簡單的讀寫操作的詳細內(nèi)容,更多關(guān)于Go操作Redis實現(xiàn)讀寫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
GoLang日志監(jiān)控系統(tǒng)實現(xiàn)
這篇文章主要介紹了GoLang日志監(jiān)控系統(tǒng)的實現(xiàn)流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12Golang中fsnotify包監(jiān)聽文件變化的原理詳解
Golang提供了一個強大的fsnotify包,它能夠幫助我們輕松實現(xiàn)文件系統(tǒng)的監(jiān)控,本文將深入探討fsnotify包的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12