GO 語言操作 redis 數據庫


GO 語言操作 redis 數據庫

​Redis 介紹

NoSQL:一類新出現的數據庫(not only sql)

  • 泛指緩存型的數據庫
  • 不支持 SQL 語法
  • 存儲結構跟傳統關係型數據庫中的那種關係表完全不同,NoSQL 中存儲的數據都是KV 形式
  • NoSQL 的世界中沒有一種通用的語言,每種 NoSQL 數據庫都有自己的 api 和語法,以及擅長的業務場景
  • NoSQL中的產品種類相當多:
    • Redis
    • Mongodb
    • Hbase hadoop
    • Cassandra hadoop

NoSQL 和 SQL 數據庫的比較:

  • 適用場景不同:SQL 數據庫適合用於關係特別複雜的數據查詢場景,NoSQL 反之
  • 事務 特性的支持:SQL 對事務的支持非常完善,而 NoSQL 基本不支持事務
  • 兩者在不斷地取長補短,呈現融合趨勢

Redis 簡介

  • Redis 是一個開源的使用 ANSIC 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。從 2010 年 3 月 15 日起,Redis 的開發工作由 VMware 主持。從 2013 年 5 月開始,Redis 的開發由 Pivotal 贊助。
  • Redis 是 NoSQL 技術陣營中的一員,它通過多種鍵值數據類型來適應不同場景下的存儲需求,藉助一些高層級的接口使用其可以勝任,如緩存、隊列系統的不同角色

Redis 特性

  • Redis 與其他 key - value 緩存產品有以下三個特點:
  • Redis 支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
  • Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。五大類型:string,hash,list(鏈表),set(無序集合),zset(有序集合)
  • Redis 支持數據的備份,即 master-slave 模式的數據備份。

Redis 優勢

  • 性能極高 – Redis 能讀的速度是 110000次/s,寫的速度是 81000次/s 。
  • 豐富的數據類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
  • 原子 – Redis 的所有操作都是原子性的,同時 Redis 還支持對幾個操作全並後的原子性執行。
  • 豐富的特性 – Redis 還支持 publish/subscribe, 通知, key 過期等等特性。

Redis 應用場景

  • 用來做緩存(ehcache/memcached)——redis 的所有數據是放在內存中的(內存數據庫,cookie 和 session)
  • 可以在某些特定應用場景下替代傳統數據庫——比如社交類的應用
  • 在一些大型系統中,巧妙地實現一些特定的功能:session 共享、購物車
  • 只要你有豐富的想象力,redis 可以用在可以給你無限的驚喜…….
  • redis 中文官網(http://redis.cn/)
  • redis 官方網站(https://redis.io/)

與 go 語言交互

安裝測試

安裝 go 操作 redis 的包,命令如下:

<code>go get -u -v github.com/gomodule/redigo/redis/<code>

安裝完成後,回到家目錄創建 test.go,把下面代碼複製到 test.go 裡面,編譯執行test.go,之後在 redis 中查找到鍵 c1 值為 hello,說明安裝成功

<code>package main
import ( "github.com/gomodule/redigo/redis")
func main(){
        conn,_ := redis.Dial("tcp", ":6379")
        defer conn.Close()
        conn.Do("set", "c1", "hello")
}/<code>

操作方法

redigo 包的使用文檔 :https://godoc.org/github.com/gomodule/redigo/redis

連接數據庫

<code>Dial(network, address string)(conn,err)/<code>

執行數據庫的命令

<code>Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)/<code>

Send 函數發出指令,flush 將連接的輸出緩衝區刷新到服務器,Receive 接收服務器返回的數據

示例:

<code>c.Send("SET", "foo", "bar")
c.Flush()//把緩衝區命令發到服務器
v, err = c.Receive() // 接收set請求傳輸的數據/<code>

另一種執行數據庫操作命令(常用)

<code>Do(commandName string, args ...interface{}) (reply interface{}, err error)/<code>

Bool,Int,Bytes,map,String,Strings 和 Values 函數將回復轉換為特定類型的值。為了方便地包含對連接 Do 和 Receive 方法的調用,這些函數採用了類型為 error 的第二個參數。如果錯誤是非 nil,則輔助函數返回錯誤。如果錯誤為 nil,則該函數將回復轉換為指定的類型:

<code>exists, err := redis.Bool(c.Do("EXISTS", "foo"))
if err != nil {
//處理錯誤代碼
}
reflect.TypeOf(exists)//打印exists類型/<code>

Scan 函數

<code>func Scan(src [] interface {},dest ... interface {})([] interface {},error)/<code>

Scan 函數從 src 複製到 dest 指向的值。Dest 參數的值必須是整數,浮點數,布爾值,字符串,[]byte,interface{}或這些類型的切片。Scan使用標準的strconv包將批量字符串轉換為數字和布爾類型。


示例:

<code>var value1 int
var value2 string
reply, err := redis.Values(c.Do("MGET", "key1", "key2"))
if err != nil {
    //處理錯誤代碼
}
 if _, err := redis.Scan(reply, &value1, &value2); err != nil {
    // 處理錯誤代碼
}/<code>

與 struct 結合

序列化與反序列化

序列化

<code>var buffer bytes.Buffer//容器
enc :=gob.NewEncoder(&buffer)//編碼器
err:=enc.Encode(dest)//編碼/<code>


反序列化

<code>dec := gob.NewDecoder(bytes.NewReader(buffer.bytes()))//解碼器
dec.Decode(src)//解碼/<code>


......



分享到:


相關文章: