# Redis
* * * * *
--: 作者:洪波
時間:2018年8月15日
* * * * *
**優勢簡介:**
1:性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2:豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
3:原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執行。
4:豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
**go連接redis準備工作:**
1:github地址: https://github.com/garyburd/redigo
2:文檔地址: http://godoc.org/github.com/garyburd/redigo/redis
3:獲取類包:go get github.com/garyburd/redigo/redis
### 連接操作
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "Ip:Port",redis.DialPassword("Password"))
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
}
### String
### Hash
** Redis 哈希(Hash)
Redis hash 是一個string類型的field和value的映射表,hash特別適合用于存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)**
//HSET key field value 將哈希表 key 中的字段 field 的值設為 value
status,err := c.Do("HSET","hashKey1","field1","value1","field2","value2","field3",1) //返回添加成功的field個數
//HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中
status,err := c.Do("HMSET","hashKey1","a","a","b","b") //返回OK或FALSE即成功失敗
//HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值
status,err := c.Do("HSETNX","hashKey1","a","a") //返回添加成功的個數非0即1
//HKEYS key 獲取所有哈希表中的字段
status,err := redis.Strings(c.Do("HKEYS","hashKey1")) //返回key對應的所有field
//HVALS key 獲取哈希表中所有值
status,err := redis.Strings(c.Do("HVALS","hashKey1")) //返回添加成功的個數非0即1
//HGET key field 獲取存儲在哈希表中指定字段的值
status,err := redis.String(c.Do("HGET","hashKey2","field2")) // 返回field對應的二進制值使用redis.String轉換單個二進制
//HGETALL key 獲取在哈希表中指定 key 的所有字段和值
status,err := redis.Strings(c.Do("HGETALL","hashKey2")) //返回哈希對應的所有的field與Value
//HDEL key field1 [field2] 刪除一個或多個哈希表字段
status,err := c.Do("HDEL","hashKey1","field1") //返回刪除成功的field個數
//HEXISTS key field 查看哈希表 key 中,指定的字段是否存在
status,err := c.Do("HEXISTS","hashKey1","field2") // 返回個數 非0即1
//HINCRBY key field increment 為哈希表 key 中的指定字段的整數值加上增量 increment
status,err := c.Do("HINCRBY","hashKey1","field1",1) //返回自增后的數值 值不存在會從1開始自動創建
//HLEN key 獲取哈希表中字段的數量
status,err := c.Do("HLEN","hashKey1") //返回key對應field數量
fmt.Println(status,err)
### Set
** Redis 集合(Set)
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員))**
// SADD key member1 [member2] 向集合添加一個或多個成員
status,err := c.Do("SADD","s4",1,) //返回添加成功的個數
// SCARD key 獲取集合的成員數
status,err := c.Do("SCARD","s1") //返回集合成員的個數
// SDIFF key1 [key2] 返回給定所有集合的差集
status,err := redis.Strings(c.Do("SDIFF","s1","s2","s4")) //返回第一個集合與其他集合不相同的成員
// SINTER key1 [key2] 返回給定所有集合的交集
status,err := redis.Strings(c.Do("SINTER","s1","s2")) //返回第一個集合與其他集合相同的成員
// SUNION key1 [key2] 返回所有給定集合的并集
status,err := redis.Strings(c.Do("SUNION","s1","s2")) //返回去重的所有成員
// SISMEMBER key member 判斷 member 元素是否是集合 key 的成員
status,err := c.Do("SISMEMBER","s1",2) //返回0或1存在或不存在
// SMEMBERS key 返回集合中的所有成員
status,err := redis.Strings(c.Do("SMEMBERS","s1")) //返回0或1存在或不存在
//SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合
status,err := c.Do("SMOVE","s1","s2",1) //返回移動成功的個數
//SRANDMEMBER key [count] 返回集合中一個或多個隨機數
status,err := c.Do("SRANDMEMBER","s1",2) //隨即返回指定數量集合成員
//SPOP key 移除并返回集合中的一個隨機元素
status,err := redis.String(c.Do("SPOP","s1")) //隨即刪除一個集合成員并返回
//SREM key member1 [member2] 移除集合中一個或多個成員
status,err := c.Do("SREM","s1",2,3) //刪除指定成員
fmt.Println(status,err)
### Sorted Set
** Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)**
// ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數
status,err := c.Do("ZADD","z1",1,"a",2,"b",3,"c") //返回添加成功的個數
// ZCARD key 獲取有序集合的成員數
status,err := c.Do("ZCARD","z1") //返回成員的個數
// ZCOUNT key min max 計算在有序集合中指定區間分數的成員數
status,err := c.Do("ZCOUNT","z1",1,10) //返回符合的個數
// ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment
status,err := redis.String(c.Do("ZINCRBY","z1",10,"a")) //返回增長后的結果
//ZRANGE key start stop [WITHSCORES] 通過索引區間返回有序集合成指定區間內的成員
status,err := redis.Strings(c.Do("ZRANGE","z1",0,10)) //返回符合分數的成員
// ZRANGEBYLEX key min max [LIMIT offset count] 通過字典區間返回有序集合的成員
status,err := redis.Strings(c.Do("ZRANGEBYLEX","z1","-","(b")) //返回符合分數的成員 ?????
// ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通過分數返回有序集合指定區間內的成員
status,err := redis.Strings(c.Do("ZRANGEBYSCORE","z1",0,100,"WITHSCORES"))
// ZRANK key member 返回有序集合中指定成員的索引
status,err := c.Do("ZRANK","z1","a")
// ZREM key member [member ...] 移除有序集合中的一個或多個成員
status,err := c.Do("ZREM","z1","a")
// ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的所有成員
status,err := c.Do("ZREMRANGEBYLEX","z1","a","z") ???
//ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名(按照分數排序遞增)區間的所有成員
status,err := c.Do("ZREMRANGEBYRANK","myzset",1,2) //返回刪除的個數
//ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員
status,err := c.Do("ZREMRANGEBYSCORE","myzset",1,2) //返回刪除的個數
// ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定區間內的成員,通過索引,分數從高到底
status,err := redis.Strings(c.Do("ZREVRANGE","myzset",0,100,"WITHSCORES")) //返回符合分數區間的成員
//ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分數區間內的成員,分數從高到低排序
status,err := redis.Strings(c.Do("ZREVRANGEBYSCORE","myzset",0,100,"WITHSCORES")) ??
// ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
status,err := c.Do("ZREVRANK","myzset","c")
//ZSCORE key member 返回有序集中,成員的分數值
//status,err := redis.String(c.Do("ZSCORE","myzset","c"))
fmt.Println(status,err)
### List
** Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)**
//LPUSH key value1 [value2] 將一個或多個值插入到列表頭部
status,err := c.Do("LPUSH","l1",1,2,3,4) //返回添加成功的個數
// LPUSHX key value 將一個值插入到已存在的列表頭部
status,err := c.Do("LPUSHX","l2",100) //返回添加成功的個數
// LRANGE key start stop 獲取列表指定范圍內的元素(索引)
status,err := redis.Strings(c.Do("LRANGE","l1",0,-1)) //返回制定區間數據
//LREM key count value 移除列表元素 count=0 所有 count=1 從頭到末檢索 count=-1 從未到頭檢索
status,err := c.Do("LREM","l1",1,1) //返回刪除數量
// LSET key index value 通過索引設置列表元素的值(索引從0開始)
status,err := c.Do("LSET","l1",1,100)
// LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除
status,err := c.Do("LTRIM","l1",0,1)
//RPOP key 移除并獲取列表最后一個元素
status,err := c.Do("RPOP","l1") //返回刪除的元素
//LINDEX key index 通過索引獲取列表中的元素
status,err := redis.String(c.Do("LINDEX","l1",0)) //返回刪除的元素
fmt.Println(status,err)