您好,登錄后才能下訂單哦!
周五上班的主要任務(wù)是在公司老平臺(tái)上用redis處理一個(gè)隊(duì)列問(wèn)題,順便復(fù)習(xí)了一下redis操作的基礎(chǔ)知識(shí),回來(lái)后就想著在自己的博客demo里,用redis來(lái)優(yōu)化一些使用場(chǎng)景,學(xué)習(xí)一下golang開(kāi)發(fā)下redis的使用。
Redis簡(jiǎn)單介紹
簡(jiǎn)介
關(guān)于Redis的討論,其實(shí)在現(xiàn)在的后臺(tái)開(kāi)發(fā)中已經(jīng)是個(gè)老生常談的問(wèn)題,基本上也是后端開(kāi)發(fā)面試的基本考察點(diǎn)。其中 Redis的背景介紹和細(xì)節(jié)說(shuō)明在這里就不贅述。不管怎么介紹,核心在于Redis是一個(gè)基于內(nèi)存的key-value的多數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),并可以提供持久化服務(wù)。基于內(nèi)存的特性決定了Redis天然適合高并發(fā)的數(shù)據(jù)讀寫(xiě)緩存優(yōu)化,同時(shí)也帶來(lái)了內(nèi)存開(kāi)銷(xiāo)過(guò)大的問(wèn)題。所以在一些特定情景下,Redis是一把無(wú)往不利的大殺器,值得深入學(xué)習(xí)。
學(xué)習(xí)Redis的一個(gè)難點(diǎn)或者說(shuō)入門(mén)點(diǎn),我個(gè)人感覺(jué)在于對(duì)象存儲(chǔ)理念的轉(zhuǎn)變。剛接觸 Redis 時(shí),我剛從大學(xué)畢業(yè),腦子里基本都是關(guān)系型數(shù)據(jù)存儲(chǔ)的理念,使用時(shí)總想著靠數(shù)據(jù)內(nèi)的關(guān)系來(lái)建立數(shù)據(jù)之間的聯(lián)系,用起來(lái)很不順手。后來(lái)慢慢入門(mén)了才感受到了一些操作的好處。舉個(gè)栗子,比如查詢(xún)用戶(hù)在某個(gè)文章下的評(píng)論,用 sql 的思路就是搜索評(píng)論表里面用戶(hù)ID和文章ID匹配的數(shù)據(jù),有時(shí)還需要聯(lián)合查詢(xún)出其他信息,但是如果是 Redis 操作,以'前綴:文章ID:用戶(hù)ID'為key,比如'comment:666:888'就可以快速取出用戶(hù)評(píng)論,十分方便。 Redis 的強(qiáng)大遠(yuǎn)不僅如此,可以在實(shí)踐中慢慢體會(huì)。
主要數(shù)據(jù)結(jié)構(gòu)
Redis主要有五種基本數(shù)據(jù)結(jié)構(gòu),滿(mǎn)足了絕大多數(shù)緩存結(jié)構(gòu)的需要,如果你在使用一種結(jié)構(gòu)存儲(chǔ)時(shí)感覺(jué)別扭時(shí),很有可能是選錯(cuò)了存儲(chǔ)結(jié)構(gòu),可以考慮一下其他結(jié)構(gòu)的正確實(shí)現(xiàn)。
LPUSH
、 LPOP
、 RPUSH
、 RPOP
等指令組合可以實(shí)現(xiàn)棧和隊(duì)列操作。常見(jiàn)使用場(chǎng)景
Golang連接Redis
使用 Golang 開(kāi)發(fā)的一大直觀感受就是,基本上你日常遇到的開(kāi)發(fā)問(wèn)題,都有官方或者第三方包幫你輔助實(shí)現(xiàn),同時(shí)這些包都是開(kāi)源的,只要你感興趣,都可以深入到包的內(nèi)部實(shí)現(xiàn)去學(xué)習(xí)理解包的實(shí)現(xiàn)思路和方法。當(dāng)然這也有利有弊,第三包的不穩(wěn)定和質(zhì)量參差不齊也增加了一些開(kāi)發(fā)成本,目前還是感受利大于弊。研究好的包源碼實(shí)現(xiàn),也是目前我的一個(gè)學(xué)習(xí)方向。
garyburd/redigo 包簡(jiǎn)介
garyburd/redigo
包是網(wǎng)上很多博文都在推薦使用的一個(gè)高Star的 Redis 連接包,但是當(dāng)我自己去 Github 的項(xiàng)目地址 garyburd/redigo 上查看 API 時(shí),發(fā)現(xiàn)這個(gè)項(xiàng)目目前是歸檔狀態(tài),項(xiàng)目已經(jīng)遷移到了 gomodule/redigo ,同時(shí)包的獲取也理所當(dāng)然地改成了 go get github.com/gomodule/redigo/redis
,這已經(jīng)不是我第一次感受了第三方包的不穩(wěn)定,之前用 dep 進(jìn)行包管理時(shí),就遇到過(guò) dep 拉取的包版本和本地包版本 API 沖突的問(wèn)題,這個(gè)有時(shí)間單獨(dú)再說(shuō)??傊?,暫時(shí)不管這兩個(gè)包的詳細(xì)區(qū)別,以下就以新包為準(zhǔn),介紹下 redigo 包使用。
建立連接池
Redigo Pool 結(jié)構(gòu)維護(hù)一個(gè) Redis 連接池。應(yīng)用程序調(diào)用 Get 方法從池中獲取連接,并使用連接的 Close 方法將連接的資源返回到池中。一般我們?cè)谙到y(tǒng)初始化時(shí)聲明一個(gè)全局連接池,然后在需要操作 redis 時(shí)獲得連接,執(zhí)行指令。
pool := &redis.Pool{ MaxIdle: 3, /*最大的空閑連接數(shù)*/ MaxActive: 8, /*最大的激活連接數(shù)*/ Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", '鏈接地址,例如127.0.0.1:6379', redis.DialPassword('密碼')) if err != nil { return nil, err } return c, nil } } c:=pool.Get() defer c.Close()
執(zhí)行指令
查看源碼,發(fā)現(xiàn) Conn
接口有一個(gè)執(zhí)行 Redis 命令的通用方法:
``` //gomodule/redigo/redis/redis.go // Conn represents a connection to a Redis server. type Conn interface { // Close closes the connection. Close() error // Err returns a non-nil value when the connection is not usable. Err() error // Do sends a command to the server and returns the received reply. Do(commandName string, args ...interface{}) (reply interface{}, err error) // Send writes the command to the client's output buffer. Send(commandName string, args ...interface{}) error // Flush flushes the output buffer to the Redis server. Flush() error // Receive receives a single reply from the Redis server Receive() (reply interface{}, err error) } ```
http://redis.io/commands 中的 Redis 命令參考列出了可用的命令。 do 的參數(shù)和 redis-cli 命令參數(shù)格式一致,比如 SET key value EX 360
對(duì)應(yīng)函數(shù)調(diào)用為 Do("SET", "key", "value","EX",360)
,常用的命令示例有:
c:=pool.Get() defer c.Close() //存值, _, err := c.Do("SET", "key", "value") //設(shè)置過(guò)期時(shí)間 _, 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"))
總結(jié)
golang 中連接使用 redis 相對(duì)比較簡(jiǎn)單,所以暫時(shí)也沒(méi)什么其他好說(shuō)的,如果后面自己使用過(guò)程中發(fā)現(xiàn)有遺漏再進(jìn)行補(bǔ)充,關(guān)鍵還是在于熟悉 redis-cli
原生的指令操作。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。