redis是nosql型數據庫,不是傳統的數據庫,性能很高,適合作緩存也適合作出持久化,,徹底開源免費,高性能的分佈式內存數據庫,,基於內存運行,並支持持久化,,最熱門的nosql數據庫之一,也稱爲數據結構服務器。git
兩種安裝方式,壓縮包型,和,安裝文件型,比較簡單,
若爲壓縮包型:redis.server啓動服務,窗口不關,redis.client,客戶端操做數據;
略github
指令[http://redisdoc.com/]golang
說明: Redis 安裝好後,默認有 16 個數據庫,初始默認使用 0 號庫, 編號是 0...15redis
Redis 的五大數據類型是: String(字符串) 、Hash (哈希)、List(列表)、Set(集合)和 zset(sorted set:有序集合)sql
string 是 redis 最基本的類型,一個 key 對應一個 value。
string 類型是二進制安全的。除普通的字符串外,也能夠存放圖片等數據redis 中字符串 value 最大是 512M數據庫
舉例,存放一個地址信息: address 北京天安門 說明 : key : address value: 北京天安門 String(字符串) -CRUD 舉例說明 Redis 的 String 字符串的 CRUD 操做. set[若是存在就至關於修改,不存在就是添加]/get/del
setex(set with expire)鍵秒值(10s後,數據消失)
mset[同時設置一個或多個 key-value 對]
mget[同時獲取多個 key-val]緩存
基本的介紹
Redis hash 是一個鍵值對集合。var user1 map[string]string
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對安全
舉例,存放一個 User 信息:(user1)服務器
user1 name "smith" age 30 job "golang coder" 說明 : key : user1 name 張三 和 age 30 就是兩對 field-value
舉例說明 Redis 的 Hash 的 CRUD 的基本操做.
hset/hget/hgetall/hdel
演示添加 user 信息的案例 (name,age )數據結構
在給 user 設置 name 和 age 時,前面咱們是一步一步設置,使用 hmset和 hmget 能夠一次性來設
置多個 filed 的值和返回多個 field 的值 。
hlen 統計一個 hash 有幾個元素.
hexists key field
查看哈希表 key 中,給定域 field 是否存在
列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列
表的頭部(左邊)或者尾部(右邊)。
List 本質是個鏈表, List 的元素 是有序的,元素的值能夠重複.
舉例, 存放多個地址信息: city 北京 天津 上海 說明 : key : city 北京 天津 上海 就是三個元素
舉例說明 Redis 的 List 的 CRUD 操做。
lpush/rpush/lrange/lpop/rpop/del/
1) 按索引獲取元素
2) llen key 獲取長度,若key不存在,key被解釋爲一個空列表,返回0
3) list能夠左插和右插
4) 若所有移除,對應的鍵就消失了
Redis 的 Set 是 string 類型的無序集合。
底層是 HashTable 數據結構, Set 也是存放不少字符串元素,字符串元素是無序
的,並且元素的值不能重複
舉例,存放多個郵件列表信息: email sgg@sohu.com tom@sohu.com 說明 : key : emailtn@sohu.com tom@sohu.com 就是二個元素 redis>sadd email xx xxx
舉例說明 Redis 的 Set 的 CRUD 操做.
sadd smembers[取出全部值] sismember[判斷值是不是成員] srem [刪除指定值]
以上基本操做的命令
127.0.0.1:6379> dbsize (integer) 4 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> setx name 10 hello,go (error) ERR unknown command 'setx' 127.0.0.1:6379> setex name 10 hello,go OK 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> setex name 10 hello,go OK 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name "hello,go" 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> mset name a name2 b OK 127.0.0.1:6379> get name "a" 127.0.0.1:6379> get name2 "b" 127.0.0.1:6379> dbsize (integer) 4 127.0.0.1:6379> get user01 (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> hget user01 (error) ERR wrong number of arguments for 'hget' command 127.0.0.1:6379> hset use1 name "ygj" (integer) 1 127.0.0.1:6379> hset use1 age 20 (integer) 1 127.0.0.1:6379> hget user1 (error) ERR wrong number of arguments for 'hget' command 127.0.0.1:6379> hget user1 name (nil) 127.0.0.1:6379> hget use1 name "ygj" 127.0.0.1:6379> hget use1 age "20" 127.0.0.1:6379> hgetall use1 1) "name" 2) "ygj" 3) "age" 4) "20" 127.0.0.1:6379> hget user01 name "john" 127.0.0.1:6379> desize (error) ERR unknown command 'desize' 127.0.0.1:6379> dbsize (integer) 5 127.0.0.1:6379> hlen user01 (integer) 2 127.0.0.1:6379> hlen usel1 (integer) 0 127.0.0.1:6379> hlen use1 (integer) 2 127.0.0.1:6379> lpush city a b c d (integer) 4 127.0.0.1:6379> lrange city 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> lrange city 0 2 1) "d" 2) "c" 3) "b" 127.0.0.1:6379> rpush e f g (integer) 2 127.0.0.1:6379> lrange city 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> rpush city e f g (integer) 7 127.0.0.1:6379> lrange city 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 5) "e" 6) "f" 7) "g" 127.0.0.1:6379> del e (integer) 1 127.0.0.1:6379> lrang e 0 -1 (error) ERR unknown command 'lrang' 127.0.0.1:6379> rrange city 0 -1 (error) ERR unknown command 'rrange' 127.0.0.1:6379> lrange city 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 5) "e" 6) "f" 7) "g" 127.0.0.1:6379> desize (error) ERR unknown command 'desize' 127.0.0.1:6379> dbsize (integer) 6 127.0.0.1:6379> sadd emals 179@qq.com (integer) 1 127.0.0.1:6379> sadd emals 156@qq.com (integer) 1 127.0.0.1:6379> smembers emals 1) "179@qq.com" 2) "156@qq.com" 127.0.0.1:6379> sismember emals 179@qq.com (integer) 1 127.0.0.1:6379> sismember emals 179@qq.co (integer) 0 127.0.0.1:6379> srem emals 179@qq.com (integer) 1 127.0.0.1:6379> smembers emals 1) "156@qq.com"
1) 使用第三方開源的 redis 庫: github.com/garyburd/redigo/redis
2) 在使用 Redis 前,先安裝第三方 Redis 庫,在 GOPATH 路徑下執行安裝指令:
D:\goproject>go get github.com/garyburd/redigo/redis
特別說明: 在安裝 Redis 庫前,確保已經安裝並配置了 Git, 由於 是從 github 下載安裝 Redis 庫的,
須要使用到 Git。 若是沒有安裝配置過 Git,請參考: 如何安裝配置 Git
說明: 經過 Golang 添加和獲取 key-value 【好比 name-tom~ 】
package main import ( "fmt" "github.com/garyburd/redigo/redis" //引入redis包 ) func main() { //經過go 向redis 寫入數據和讀取數據 //1. 連接到redis conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //關閉.. //2. 經過go 向redis寫入數據 string [key-val] _, err = conn.Do("Set", "name", "tomjerry貓貓") if err != nil { fmt.Println("set err=", err) return } //3. 經過go 向redis讀取數據 string [key-val] r, err := redis.String(conn.Do("Get", "name")) if err != nil { fmt.Println("set err=", err) return } //由於返回 r是 interface{} //由於 name 對應的值是string ,所以咱們須要轉換 //nameString := r.(string) fmt.Println("操做ok ", r) }
package main import ( "fmt" "github.com/garyburd/redigo/redis" //引入redis包 ) func main() { //經過go 向redis 寫入數據和讀取數據 //1. 連接到redis conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //關閉.. //2. 經過go 向redis寫入數據 string [key-val] _, err = conn.Do("HSet", "user01", "name", "john") if err != nil { fmt.Println("hset err=", err) return } _, err = conn.Do("HSet", "user01", "age", 18) if err != nil { fmt.Println("hset err=", err) return } //3. 經過go 向redis讀取數據 r1, err := redis.String(conn.Do("HGet","user01", "name")) if err != nil { fmt.Println("hget err=", err) return } r2, err := redis.Int(conn.Do("HGet","user01", "age")) if err != nil { fmt.Println("hget err=", err) return } //由於返回 r是 interface{} //由於 name 對應的值是string ,所以咱們須要轉換 //nameString := r.(string) fmt.Printf("操做ok r1=%v r2=%v \n", r1, r2) }
操做多個數據
package main import ( "fmt" "github.com/garyburd/redigo/redis" //引入redis包 ) func main() { //經過go 向redis 寫入數據和讀取數據 //1. 連接到redis conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //關閉.. //2. 經過go 向redis寫入數據 string [key-val] _, err = conn.Do("HMSet", "user02", "name", "john", "age", 19) if err != nil { fmt.Println("HMSet err=", err) return } //3. 經過go 向redis讀取數據 r, err := redis.Strings(conn.Do("HMGet","user02", "name", "age")) if err != nil { fmt.Println("hget err=", err) return } for i, v := range r { fmt.Printf("r[%d]=%s\n", i, v) } }
與此相似集合也能夠這樣操做
說明: 經過 Golang 對 Redis 操做,給 key-value 設置有效時間
核心代碼:
//給 name 數據設置有效時間爲 10s _, err = c.Do("expire", "name", 10)
說明: 經過 Golang 對 Redis 操做 List 數據類型
核心代碼:
_, err = c.Do("lpush", "heroList", "no1: 宋江", 30, "no2: 盧俊義", 28) r, err := redis.String(c.Do("rpop", "heroList"))
說明: 經過 Golang 對 Redis 操做, 還能夠經過 Redis 連接池, 流程以下:
1) 事先初始化必定數量的連接,放入到連接池
2) 當 Go 須要操做 Redis 時, 直接從 Redis 連接池取出連接便可。
3) 這樣能夠節省臨時 獲取 Redis 連接的時間,從而提升效率.
代碼示例
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) //定義一個全局的pool var pool *redis.Pool //當啓動程序時,就初始化鏈接池 func init() { pool = &redis.Pool{ MaxIdle: 8, //最大空閒連接數 MaxActive: 0, // 表示和數據庫的最大連接數, 0 表示沒有限制 IdleTimeout: 100, // 最大空閒時間 Dial: func() (redis.Conn, error) { // 初始化連接的代碼, 連接哪一個ip的redis return redis.Dial("tcp", "localhost:6379") }, } } func main() { //先從pool 取出一個連接 conn := pool.Get() defer conn.Close() _, err := conn.Do("Set", "name", "湯姆貓~~") if err != nil { fmt.Println("conn.Do err=", err) return } //取出 r, err := redis.String(conn.Do("Get", "name")) if err != nil { fmt.Println("conn.Do err=", err) return } fmt.Println("r=", r) //若是咱們要從pool 取出連接,必定保證連接池是沒有關閉 // pool.Close() conn2 := pool.Get() _, err = conn2.Do("Set", "name2", "湯姆貓~~2") if err != nil { fmt.Println("conn.Do err~~~~=", err) return } //取出 r2, err := redis.String(conn2.Do("Get", "name2")) if err != nil { fmt.Println("conn.Do err=", err) return } fmt.Println("r=", r2) //fmt.Println("conn2=", conn2) }