GO 語言操做 redis 數據庫

redis數據庫

是一種高性能的Key-Value數據庫    NoSQL數據庫        緩存型數據庫 key-value型數據庫 錯誤的說法非關係型數據庫git

1.redis介紹

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

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

1.2 NoSQL和SQL數據庫的比較:

  • 適用場景不一樣:sql數據庫適合用於關係特別複雜的數據查詢場景,nosql反之
  • 事務 特性的支持:sql對事務的支持很是完善,而nosql基本不支持事務
  • 二者在不斷地取長補短,呈現融合趨勢

1.3 Redis簡介

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

1.4 Redis特性

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

1.5 Redis 優點

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

1.6 Redis應用場景

  • 用來作緩存(ehcache/memcached)——redis的全部數據是放在內存中的(內存數據庫,cookie和session)
  • 能夠在某些特定應用場景下替代傳統數據庫——好比社交類的應用
  • 在一些大型系統中,巧妙地實現一些特定的功能:session共享、購物車
  • 只要你有豐富的想象力,redis能夠用在能夠給你無限的驚喜…….

1.7 推薦閱讀

2.與go語言交互

2.1安裝測試

安裝go操做redis的包,命令以下:github

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

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

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

2.2操做方法

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

鏈接數據庫數據庫

Dial(network, address string)(conn,err)

執行數據庫的命令api

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

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

示例:服務器

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

另外一種執行數據庫操做命令(經常使用)cookie

Do(commandName string, args ...interface{}) (reply interface{}, err error)

reply helper functions(回覆助手函數) 網絡

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

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

Scan函數

func Scan(src [] interface {},dest ... interface {})([] interface {},error)

Scan函數從src複製到dest指向的值。

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

示例:

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 {
    // 處理錯誤代碼
}

2.3與struct結合

序列化與反序列化

序列化

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

反序列化

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

視頻和資料直接評論獲取

相關文章
相關標籤/搜索