# 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)