go-redis

redis

Redis 基本介紹

redis是nosql型數據庫,不是傳統的數據庫,性能很高,適合作緩存也適合作出持久化,,徹底開源免費,高性能的分佈式內存數據庫,,基於內存運行,並支持持久化,,最熱門的nosql數據庫之一,也稱爲數據結構服務器。git

redis

兩種安裝方式,壓縮包型,和,安裝文件型,比較簡單,
若爲壓縮包型:redis.server啓動服務,窗口不關,redis.client,客戶端操做數據;
github

Redis 的操做指令一覽

指令[http://redisdoc.com/]golang

redis 的基本使用:

說明: Redis 安裝好後,默認有 16 個數據庫,初始默認使用 0 號庫, 編號是 0...15redis

  1. 添加 key-val [set]
  2. 查看當前 redis 的 全部 key [keys *]
  3. 獲取 key 對應的值. [get key]
  4. 切換 redis 數據庫 [select index]
  5. 如何查看當前數據庫的 key-val 數量 [dbsize]
  6. 清空當前數據庫的 key-val 和清空全部數據庫的 key-val [flushdb flushall]

Redis 的 Crud 操做

Redis 的五大數據類型:

Redis 的五大數據類型是: String(字符串) 、Hash (哈希)、List(列表)、Set(集合)和 zset(sorted set:有序集合)sql

String(字符串) -介紹

string 是 redis 最基本的類型,一個 key 對應一個 value。
string 類型是二進制安全的。除普通的字符串外,也能夠存放圖片等數據redis 中字符串 value 最大是 512M數據庫

舉例,存放一個地址信息:
address 北京天安門
說明 :
key : address
value: 北京天安門

String(字符串) -CRUD
舉例說明 Redis 的 String 字符串的 CRUD 操做.
set[若是存在就至關於修改,不存在就是添加]/get/del

String(字符串)-使用細節和注意事項

setex(set with expire)鍵秒值(10s後,數據消失)
mset[同時設置一個或多個 key-value 對]
mget[同時獲取多個 key-val]緩存

Hash (哈希,相似 golang 裏的 Map)-介紹

基本的介紹
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

Hash(哈希,相似 golang 裏的 Map)-CRUD

舉例說明 Redis 的 Hash 的 CRUD 的基本操做.
hset/hget/hgetall/hdel
演示添加 user 信息的案例 (name,age )數據結構

Hash-使用細節和注意事項

在給 user 設置 name 和 age 時,前面咱們是一步一步設置,使用 hmset和 hmget 能夠一次性來設
置多個 filed 的值和返回多個 field 的值 。
hlen 統計一個 hash 有幾個元素.
hexists key field
查看哈希表 key 中,給定域 field 是否存在

List(列表)-介紹

列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列
表的頭部(左邊)或者尾部(右邊)。

List 本質是個鏈表, List 的元素 是有序的,元素的值能夠重複.

舉例, 存放多個地址信息:
city 北京 天津 上海
說明 :
key : city
北京 天津 上海 就是三個元素

List(列表)-CRUD(相似於管道)

舉例說明 Redis 的 List 的 CRUD 操做。
lpush/rpush/lrange/lpop/rpop/del/

List-使用細節和注意事項

1) 按索引獲取元素
2) llen key 獲取長度,若key不存在,key被解釋爲一個空列表,返回0
3) list能夠左插和右插
4) 若所有移除,對應的鍵就消失了

Set(集合) - 介紹

Redis 的 Set 是 string 類型的無序集合。
底層是 HashTable 數據結構, Set 也是存放不少字符串元素,字符串元素是無序
的,並且元素的值不能重複

舉例,存放多個郵件列表信息:
email sgg@sohu.com tom@sohu.com
說明 :
key : emailtn@sohu.com tom@sohu.com 就是二個元素
redis>sadd email xx xxx

Set(集合)- CRUD

舉例說明 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"

Golang 操做 Redis

安裝第三方開源 Redis 庫

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

Set/Get 接口

說明: 經過 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)
}

操做 Hash

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)

操做 List

說明: 經過 Golang 對 Redis 操做 List 數據類型

核心代碼:

_, err = c.Do("lpush", "heroList", "no1: 宋江", 30, "no2: 盧俊義", 28)
r, err := redis.String(c.Do("rpop", "heroList"))

Redis 連接池

說明: 經過 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)


}
相關文章
相關標籤/搜索