P4
名稱 | 類型 | 數據存儲選項 | 查詢類型 | 附加功能 |
---|---|---|---|---|
Redis | 使用內存存儲(in-memory)的非關係數據庫 | 字符串、列表、哈希表、集合、有序集合 | 每種數據類型都有本身的專屬命令,另外還有批量操做(bulk operation)和不徹底(partial)的事務支持 | 發佈與訂閱,主從複製(master/slave replication) |
memcached | 使用內存存儲的鍵值緩存 | 鍵值之間的映射 | 增刪改查以及其餘幾個命令 | 爲提高性能而設的多線程服務器 |
MySQL | 關係數據庫 | 每一個數據庫能夠包含多個表,每一個表能夠包含多個行;能夠處理多個表的試圖(view);支持空間(spatial)和第三方擴展 | 增刪改查、函數、存儲過程 | 支持ACID性質(須要使用InnoDB),主從複製和主主複製(master/master replication) |
PostgreSQL | 關係數據庫 | 每一個數據庫能夠包含多個表,每一個表能夠包含多個行;能夠處理多個表的試圖;支持空間和第三方擴展;支持可定製類型 | 增刪改查、內置函數、自定義的存儲過程 | 支持ACID性質,主從複製,由第三方支持的多主複製(multi-master replication) |
MongoDB | 使用硬盤存儲(on-disk)的非關係文檔存儲 | 每一個數據庫能夠包含多個表,每一個表能夠包含多個無schema (schema-less) 的 BSON 文檔(Binary JSON,相似json的一種二進制格式) | 增刪改查 | 支持 map-reduce 操做,主從複製,分片,空間索引(spatial index) |
P4
P6
結構類型 | 結構存儲的值 | 結構的讀寫能力 |
---|---|---|
STRING | 能夠是字符串、整數或者浮點數 | 對整個字符串或者字符串的其中一部分執行操做;對整數和浮點數執行自增(increment)或者自減(decrement) |
LIST | 一個鏈表,鏈表上的每一個節點都包含了一個字符串 | 從鏈表的兩端推入或者彈出元素;根據偏移量對鏈表進行修剪(trim);讀取單個或者多個元素;根據值查找或者移除元素 |
HASH | 包含鍵值對的無序哈希表 | 添加、獲取、移除單個鍵值對;獲取全部鍵值對 |
SET | 包含字符串的無序收集器(unordered collection),而且被包含的每一個字符串都是獨一無2、各不相同的 | 添加、獲取、移除單個元素;檢查一個元素是否存在於集合中;計算交集、並集、差集;從集合裏面隨機獲取元素 |
ZSET(有序集合) | 字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定 | 添加、獲取、移除單個元素;根據分值範圍(range)或者成員來獲取元素 |
P8
STRING 存儲鍵值對,值既能夠是字符串,又能夠是數值(數值支持自增和自減)git
package main import ( "fmt" "github.com/gomodule/redigo/redis" "time" ) func main() { // 獲取鏈接 conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { // 鏈接失敗,則打印錯誤信息,並退出 fmt.Println(err) return } // 若是鏈接成功,則延遲執行 關閉 defer conn.Close() executeStringCommand(conn) } // 執行 STRING 的相關命令 func executeStringCommand(conn redis.Conn) { fmt.Println("--------- executeStringCommand start ---------") // 設置 鍵爲 hello 的值爲 world,永久有效 result, err := conn.Do("SET", "hello", "world") handleResult(result, err) // 獲取 鍵爲 hello 的剩餘時間(TTL -> 秒,PTTL -> 毫秒) result, err = redis.Int(conn.Do("TTL", "hello")) handleResult(result, err) // 獲取 鍵爲 hello 的值 result, err = redis.String(conn.Do("GET", "hello")) handleResult(result, err) // 設置 鍵爲 hello 的值爲 world,有效時間爲 1000ms(EX -> 秒,PX -> 毫秒;不可同時使用) result, err = conn.Do("SET", "hello", "world", "EX", "1") handleResult(result, err) // 獲取 鍵爲 hello 的剩餘時間(TTL -> 秒,PTTL -> 毫秒) result, err = redis.Int(conn.Do("PTTL", "hello")) handleResult(result, err) time.Sleep(time.Second * 2) // 獲取 鍵爲 hello 的剩餘時間(TTL -> 秒,PTTL -> 毫秒) result, err = redis.Int(conn.Do("PTTL", "hello")) handleResult(result, err) // 設置 鍵爲 hello 的值爲 world,永久有效(NX -> 鍵不存在時,才進行設置操做;XX -> 鍵已經存在時,才進行設置操做) result, err = conn.Do("SET", "hello", "world!", "XX") handleResult(result, err) // 設置 鍵爲 hello 的值爲 world,永久有效(NX -> 鍵不存在時,才進行設置操做;XX -> 鍵已經存在時,才進行設置操做) result, err = conn.Do("SET", "hello", "world!", "NX") handleResult(result, err) // 刪除 鍵爲 hello 的值(能夠用於全部類型) result, err = conn.Do("DEL", "hello") handleResult(result, err) // 獲取 鍵爲 hello 的值 result, err = redis.String(conn.Do("GET", "hello")) handleResult(result, err) fmt.Println("--------- executeStringCommand end ---------") } // 處理操做 redis 的結果 func handleResult(result interface{}, err error) { if err != nil { fmt.Println("ERROR: ", err) return } fmt.Println(result) }
P9
// 執行 LIST 的相關命令 func executeListCommand(conn redis.Conn) { fmt.Println("--------- executeListCommand start ---------") // 在 list 列表的 右端 插入值 result, err := conn.Do("RPUSH", "list", "item-1", "item-2") handleResult(result, err) // 在 list 列表的 左端 插入值 result, err = conn.Do("LPUSH", "list", "item-3", "item-4") handleResult(result, err) // 在 list 列表中 以左端爲頭獲取 [1, 3] 範圍內的全部值(結束索引爲 -1 表示能夠取出到列表尾的全部元素;沒有 RRANGE 命令) result, err = redis.Strings(conn.Do("LRANGE", "list", "1", "-1")) handleResult(result, err) // 在 list 列表中 以左端爲頭獲取 下標爲 0(沒有 RINDEX 命令) result, err = redis.String(conn.Do("LINDEX", "list", "0")) handleResult(result, err) // 在 list 列表的 右端 彈出並一個值 result, err = redis.String(conn.Do("RPOP", "list")) handleResult(result, err) // 在 list 列表的 左端 彈出並一個值 result, err = redis.String(conn.Do("LPOP", "list")) handleResult(result, err) // 刪除 鍵爲 list 的值(能夠用於全部類型) result, err = conn.Do("DEL", "list") handleResult(result, err) // 在 list 列表中 以左端爲頭獲取全部值 result, err = redis.Strings(conn.Do("LRANGE", "list", "0", "-1")) handleResult(result, err) fmt.Println("--------- executeListCommand end ---------") }
P10
// 執行 SET 的相關命令 func executeSetCommand(conn redis.Conn) { fmt.Println("--------- executeSetCommand start ---------") // 在 set 集合中 添加值 result, err := conn.Do("SADD", "set", "item-1", "item-2", "item-2", "item-3", "item-4") handleResult(result, err) // 從 set 集合中 刪除值 result, err = conn.Do("SREM", "set", "item-2", "item-3") handleResult(result, err) // 判斷一個值是否在 set 集合中 result, err = redis.Bool(conn.Do("SISMEMBER", "set", "item-2")) handleResult(result, err) // 獲取 set 集合中 的全部值(不推薦使用,大 key 執行慢) result, err = redis.Strings(conn.Do("SMEMBERS", "set")) handleResult(result, err) // 刪除 鍵爲 set 的值(能夠用於全部類型) result, err = conn.Do("DEL", "set") handleResult(result, err) fmt.Println("--------- executeSetCommand end ---------") }
P11
HASH 能夠存儲多個鍵值對之間的映射,和 STRING 同樣,存儲的值既能夠是字符串,又能夠是數值(數值支持自增和自減)github
// 執行 HASH 的相關命令 func executeHashCommand(conn redis.Conn) { fmt.Println("--------- executeHashCommand start ---------") // 在 hash 哈希表中 添加一個鍵值對 result, err := conn.Do("HSET", "hash", "key-1", "item-1") handleResult(result, err) // 在 hash 哈希表中 添加多個鍵值對 result, err = conn.Do("HMSET", "hash", "key-2", "item-2", "key-3", "item-3", "key-4", "item-4", "key-5", "item-5") handleResult(result, err) // 從 hash 哈希表中 獲取鍵 爲 key-1 的值 result, err = redis.String(conn.Do("HGET", "hash", "key-1")) handleResult(result, err) // 從 hash 哈希表中 獲取多個鍵值對(返回值的順序和傳入參數的順序同樣) result, err = redis.Strings(conn.Do("HMGET", "hash", "key-2", "key-1")) handleResult(result, err) // 刪除 hash 哈希表中鍵爲 key-1 的值(能夠用於全部類型) result, err = conn.Do("HDEL", "hash", "key-1") handleResult(result, err) // 從 hash 哈希表中 獲取全部鍵值對(不推薦使用,大 key 執行慢) result, err = redis.StringMap(conn.Do("HGETALL", "hash")) handleResult(result, err) // 刪除 鍵爲 hash 的值(能夠用於全部類型) result, err = conn.Do("DEL", "hash") handleResult(result, err) fmt.Println("--------- executeHashCommand end ---------") }
P12
ZSET 和 HASH 同樣,都用於存儲鍵值對。ZSET 的鍵被稱爲成員(member),每一個成員都是各不相同的;值被稱爲分值(score),分值必須爲浮點數。ZSET 是 Redis 裏面惟一一個既能夠根據成員訪問元素,又能夠根據分值以及分值的排列順序來訪問元素的結構。redis
// 執行 ZSET 的相關命令 func executeZsetCommand(conn redis.Conn) { fmt.Println("--------- executeZsetCommand start ---------") // 在 zset 有序集合中 添加值 result, err := conn.Do("ZADD", "zset", "0", "item-1", "12.34", "item-1", "-12.34", "item-2", "56.78", "item-3", "-56.78", "item-4", "-56.78", "item-5") handleResult(result, err) // 從 zset 有序集合中 刪除值 result, err = conn.Do("ZREM", "zset", "item-2", "item-3") handleResult(result, err) // 獲取 zset 有序集合中 指定範圍的值(結束索引爲 -1 表示從開始索引到結束的全部值) // 成員的位置按 score 值遞增(從小到大)來排序,相同 score 值的成員按字典序升序來排列 // WITHSCORES 選項可讓成員和它的 score 值一併返回,返回列表格式:value1,score1, ..., valueN,scoreN result, err = redis.Strings(conn.Do("ZRANGE", "zset", "0", "-1", "WITHSCORES")) handleResult(result, err) // 獲取 zset 有序集合中 指定範圍的值(結束索引爲 -1 表示從開始索引到結束的全部值) // 成員的位置按 score 值遞減(從小到大)來排序,相同 score 值的成員按字典序降序來排列 // WITHSCORES 選項可讓成員和它的 score 值一併返回,返回列表格式:value1,score1, ..., valueN,scoreN result, err = redis.Strings(conn.Do("ZREVRANGE", "zset", "0", "-1", "WITHSCORES")) handleResult(result, err) // 獲取 zset 有序集合中 score 在指定範圍 min, max 的值(-inf:負無窮,+inf 正無窮;默認爲閉區間,數字前加 ( 表示開區間) // 成員的位置按 score 值遞增(從小到大)來排序,相同 score 值的成員按字典序升序來排列 // WITHSCORES 選項可讓成員和它的 score 值一併返回,返回列表格式:value1,score1, ..., valueN,scoreN // LIMIT offset, count 和 SQL 中 limit 同樣,指定返回結果的數量及區間 result, err = redis.Strings(conn.Do("ZRANGEBYSCORE", "zset", "-inf", "+inf", "WITHSCORES")) handleResult(result, err) // 獲取 zset 有序集合中 score 在指定範圍 max, min 的值(-inf:負無窮,+inf 正無窮;默認爲閉區間,數字前加 ( 表示開區間) // 成員的位置按 score 值遞減(從小到大)來排序,相同 score 值的成員按字典序降序來排列 // WITHSCORES 選項可讓成員和它的 score 值一併返回,返回列表格式:value1,score1, ..., valueN,scoreN // LIMIT offset, count 和 SQL 中 limit 同樣,指定返回結果的數量及區間 result, err = redis.Strings(conn.Do("ZREVRANGEBYSCORE", "zset", "(12.34", "-inf", "WITHSCORES", "LIMIT", "1", "1")) handleResult(result, err) // 刪除 鍵爲 zset 的值(能夠用於全部類型) result, err = conn.Do("DEL", "zset") handleResult(result, err) fmt.Println("--------- executeZsetCommand end ---------") }
本文首發於公衆號:滿賦諸機(點擊查看原文) 開源在 GitHub :reading-notes/redis-in-action
數據庫