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>
......
閱讀更多 Python學習 的文章