在Golang中使用Redis的方法示例

2022-09-26 18:42:10 字數 2708 閱讀 3209

周五上班的主要任務是在公司老平台上用redis處理乙個佇列問題,順便複習了一下redis操作的基礎知識,回來後就想著在自己的部落格demo裡,用redis來優化一些使用場景,學習一下golang開發下redis的使用。

redis簡單介紹

簡介關於redis的討論,其實在現在的後台開發中已經是個老生常談的問題,基本上也是後端開發面試的基本考察點。其中 redis的背景介紹和細節說明在這裡就不贅述。不管怎麼介紹,核心在於redis是乙個基於記憶體的key-value的多資料結構儲存,並可以提供持久化服務。基於記憶體的特性決定了redis天然適合高併發的資料讀寫快取優化,同時也帶來了記憶體開銷過大的問題。所以在一些特定情景下,redis是一把無往不利的大殺器,值得深入學習。

學習redis的乙個難點或者說入門點,我個人感覺在於物件儲存理念的轉變。剛接觸 redis 時,我剛從大學畢業,腦子裡基本都是關係型資料儲存的理念,使用時總想著靠資料內的關係來建立資料之間的聯絡,用起來很不順手。後來慢慢入門了才感受到了一些操作的好處。舉個栗子,比如查詢使用者在某個文章下的評論,用 sql 的思路就是搜尋評論表裡面使用者id和文章id匹配的資料,有時還需要聯合查詢出其他資訊,但是如果是 redis 操作,以'字首:文章id:使用者id'為key,比如'comment:666:888'就可以快速取出使用者評論,十分方便。 redis 的程式設計客棧強大遠不僅如此,可以在實踐中慢慢體會。

主要資料結構

redis主要有五種基本資料結構,滿足了絕大多數快取結構的需要,如果你在使用一種結構儲存時感覺彆扭時,很有可能是選錯了儲存結構,可以考慮一下其他結構的正確實現。

常見使用場景

golang連線redis

使用 golang 開發的一大直觀感受就是,基本上你日常遇到的開發問題,都有官方或者第三方包幫你輔助實現,同時這些包都是開源的,只要你感興趣,都可以深入到包的內部實現去學習理程式設計客棧解包的實現思路和方法。當然這也有利有弊,第三包的不穩定和質量參差不齊也增加了一些開發成本,目前還是感受利大於弊。研究好的包原始碼實現,也是目前我的乙個學習方向。

garyburd/redigo 包簡介

garyburd/redigo包是網上很多博文都在推薦使用的乙個高star的 redis 連線包,但是當我自己去 github 的專案位址 garyburd/redigo 上檢視 api 時,發現這個專案目前是歸檔狀態,專案已經遷移到了 gomodule/redigo ,同時包的獲取也理所當然地改成了go get github.com/gomodule/redigo/redis,這已經不是我第一次感受了第三方包的不穩定,之前用 dep 進行包管理時,就遇到過 dep 拉取的包版本和本地包版本 api 衝突的問題,這個有時間單獨再說。總之,暫時不管這兩個包的詳細區別,以下就以新包為準,介紹下 redigo 包使用。

建立連線池

redigo pool 結構維護乙個 redis 連線池。應用程式呼叫 get 方法從池中獲取連線,並使用連線的 close 方法將連線的資源返回到池中。一般我們在系統初始化時宣告乙個全域性連線池,然後在需要操作 redis 時獲得連線,執行指令。

pool := &r

return c, nil

}}c:=pool.get()

defer c.close()

執行指令

檢視原始碼,發現conn介面有乙個執行 redis 命令的通用方法:

```//gomodule/redigo/redis/redis.go

// conn represents a connection to a redis server.

type conn inte***ce ) (reply inte***ce{}, err error)

// send writes the command to the client's output buffer.

send(commandname string, args ...inte***ce{}) error

// flush flushes the output buffer to the redis server.

flush() error

// receive receives a single reply from the redis server

receive() (reply inte***ce{}, err error)

}```

中的 redis 命令參考列出了可用的命令。 do 的引數和 redis-cli 命令引數格式一致,比如set key value ex 360對應函式呼叫為do("set", "key", "value","ex",360),常用的命令示例有:

c:=pool.get()

defer c.close()

//存值,

_, err := c.do("set", "key", "value")

//設定過期時間

_, err := c.do("set", "key", "value","ex",360)

//存int

_, err := c.do("set", "key", 2)

//取值

v,err:=redis.string(c.do("get","key"))

bytes, err := redis.bytes(c.do("get", "key"))

總結golang 中連線使用 redis 相對比較簡單,所以暫時也沒什麼其他好說的,如果後面自己使用過程中發現有遺漏再進行補充,關鍵還是在於熟悉redis-cli原生的指令操作。

本文標題: 在golang中使用redis的方法示例

本文位址:

Golang 在Golang中使用json

由於要開發乙個小型的web應用,而web應用大部分都會使用json作為資料傳輸的格式,所以有了這篇文章。包引用import 用於存放資料的結構體type mydata struct這裡需要注意的就是後面單引號中的內容。json item 這個的作用,就是name欄位在從結構體例項編碼到json資料格...

在 golang 中使用 Json

序列化物件將使用 encoding json 中的 marshal 函式。函式原型為 func marshal v inte ce byte,error 以下是官網給出的例子 package main import encoding json fmt os func main group color...

在Golang中使用Protobuf

本教程使用proto3版本的protocol buffer語言,提供了乙個基本的在go程式中使用protocol buffer的介紹。通過建立乙個簡單的示例應用程式,向你展示如何 它不是乙個全面的在go中使用protocol buffer的指南,更詳細的參考資訊請檢視前面的兩個教程。protobuf...