redis Redis 基本介紹 redis是nosql型資料庫,不是傳統的資料庫,性能很高,適合做緩存也適合做出持久化,,完全開源免費,高性能的分散式記憶體資料庫,,基於記憶體運行,並支持持久化,,最熱門的nosql資料庫之一,也稱為數據結構伺服器。 redis 兩種安裝方式,壓縮包型,和,安裝文件型 ...
redis
Redis 基本介紹
redis是nosql型資料庫,不是傳統的資料庫,性能很高,適合做緩存也適合做出持久化,,完全開源免費,高性能的分散式記憶體資料庫,,基於記憶體運行,並支持持久化,,最熱門的nosql資料庫之一,也稱為數據結構伺服器。
redis
兩種安裝方式,壓縮包型,和,安裝文件型,比較簡單,
若為壓縮包型:redis.server啟動服務,視窗不關,redis.client,客戶端操作數據;
略
Redis 的操作指令一覽
指令[http://redisdoc.com/]
redis 的基本使用:
說明: Redis 安裝好後,預設有 16 個資料庫,初始預設使用 0 號庫, 編號是 0...15
- 添加 key-val [set]
- 查看當前 redis 的 所有 key [keys *]
- 獲取 key 對應的值. [get key]
- 切換 redis 資料庫 [select index]
- 如何查看當前資料庫的 key-val 數量 [dbsize]
- 清空當前資料庫的 key-val 和清空所有資料庫的 key-val [flushdb flushall]
Redis 的 Crud 操作
Redis 的五大數據類型:
Redis 的五大數據類型是: String(字元串) 、Hash (哈希)、List(列表)、Set(集合)和 zset(sorted set:有序集合)
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 [email protected] [email protected]
說明 :
key : [email protected] [email protected] 就是二個元素
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 [email protected]
(integer) 1
127.0.0.1:6379> sadd emals [email protected]
(integer) 1
127.0.0.1:6379> smembers emals
1) "[email protected]"
2) "[email protected]"
127.0.0.1:6379> sismember emals [email protected]
(integer) 1
127.0.0.1:6379> sismember emals [email protected]
(integer) 0
127.0.0.1:6379> srem emals [email protected]
(integer) 1
127.0.0.1:6379> smembers emals
1) "[email protected]"
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)
}