GO 語言操作 redis 數據庫

redis數據庫

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

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的包,命令如下:

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

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

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/redis

連接數據庫

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

執行數據庫的命令

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請求傳輸的數據

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

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)//解碼

redis數據庫

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

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的包,命令如下:

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

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

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/redis

連接數據庫

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

執行數據庫的命令

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請求傳輸的數據

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

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)//解碼

視頻和資料直接評論獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章