redis的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据哈希分子来存储和查找数据,理论上一个集合能够存储2的32次方-1(大约42亿)个元素,由于采用哈希表结构,因此对于redis集合的插入、删除和查找的复杂度都是O(1)。在redis中集合能够对于不一样的集合进行操做,如求两个或两个以上集合的差集和交集、并集等操做。
此外须要注意以下三点:
一、集合是无序的;
二、集合中元素是不重复的即惟一的,插入重复的元素会失败;
三、集合中每个元素都是String数据结构类型。
集合命令以下表所示:java
命令 | 说明 | 备注 |
---|---|---|
sadd key member1[member2...] | 给键为key的集合增长元素 | 能够同时增长多个元素 |
scard key | 统计键为key的集合成员数 | |
sdiff key1 [key2] | 找出两个集合的差集 | 若是为单个集合,则返回该集合的全部元素 |
sdiffstore des key1 [key2] | 先对两个集合求差集,而后将所求结果保存到集合des中 | |
sinter key1 [key2] | 求key1和key2两个集合的交集 | 若是为单个集合,则返回该集合的全部元素 |
sinterstore des key1 [key2] | 先对两个集合求交集,而后将所求结果保存到集合des中 | |
sismember key member | 判断member是不是键为key的集合元素 | 若是是返回1,不然返回0 |
smembers key | 返回集合中的全部元素 | 若是数据量很大,须要考虑迭代遍历的问题 |
smove src des member | 将成员member从集合src移动到集合des中 | |
spop key | 随机弹出集合中的一个元素 | 须要注意其随机性,由于集合是无序的 |
srandmember key [count] | 随机返回集合中一个或多个元素,count为返回元素的限制,若是为负数,则先求其绝对值 | count为整数,若是不填默认为1,若是大于集合元素总数,则返回所有元素 |
sunion key1[key2] | 求两个集合的并集 | 若是为单个集合,则返回该集合的全部元素 |
sunionstore des key1 key2 | 先对两个集合求并集,而后将所求结果保存到集合des中 |
示例以下所示:redis
有序集合和集合相似,而zset只是说明他是有序的,和无序集合的主要区别在于每个元素除了值以外,还多了一个分数。这个分数是浮点数,在java中是用双精度来表示的,redis根据这个分数就能够对分数进行从小到大或从大到小的排序。在有序集合中元素都是惟一的,可是对于不一样元素而言,它的分数能够同样。有序集合也是经过哈希结构实现的,所以添加、删除,查找的复杂度也是O(1)。
有序集合依赖key表示它是属于哪一个集合,而依赖分数进行排序,所以值和分数都是必须的。实际上不只能够对分数进行排序,在知足必定条件下也能够对值进行排序。
有序集合命令以下表所示:算法
命令 | 说明 | 备注 |
---|---|---|
zadd key score1 value1[score2 value2] ... | 向有序集合key增长一个或多个元素 | 若是没有存在的集合key则新建一个键为key的集合 |
zcard key | 获取有序集合的元素个数 | |
zcount key min max | 根据分数返回指定的成员列表 | min为最小值,max为最大值,默认包含min和max,采用数学区间表示,若是须要不包含,则在分数前面加上(,可是不支持[ |
zincrby key increment member | 给有序集合成员值为member的分数增长increment | |
zinterstore desKey numkeys key1[key2 key3]... | 求多个有序集合的交集,并将结果保存到desKey中 | numKeys是一个整数,表示有多少个有序集合 |
zlexcount key min max | 求有序集合key成员值在min和max的范围 | 这里的范围为key的成员值,redis借助数据区间的表示方法,[表示包含,(表示不包含 |
zrange key start stop [withscores] | 按照分值的大小返回指定范围内的成员,若是输入可选withscores,则连同分数一块儿返回 | |
zrank key member | 按从小到大求有序集合的排行 | 排名第一的为0,第二为1,以此类推... |
zrangebylex key min max [limit offset count] | 根据值的大小从小到大排序,min为最小值,max为最大值,limit为可选,当redis求出范围集合后,会产生下标0到n,而后根据偏移量offset和限定返回数count,返回对应的成员 | |
zrangebyscore key min max [withscores] [limit offset count ] | 根据分数的大小从小到大排序,min为最小值,max为最大值,limit为可选,当redis求出范围集合后,会产生下标0到n,而后根据偏移量offset和限定返回数count,返回对应的成员 | |
zremrangebyscore key start stop | 根据分数区间进行删除 | |
zremrangebyrank key start stop | 按照分数排行从小到大的排序删除,从0开始计算 | |
zremrangebylex key min max | 按照值的分布进行删除 | |
zrevrange key start stop [withscores] | 从大到小按分数进行排序 | 与zrange相同,只是排序从大到小 |
zrevrangebyscore key max min [withscores] | 从大到小按分数排序 | 与zrangebyscore相同,只是排序从大到小 |
zrevrank key member | 按照从大到小的顺序,求元素的排序 | 排名第一为0,第二为1,以此类推 |
zscore key member | 返回成员的分数值 | 返回成员的分数 |
zunionstore desKey numKeys key1[key2 key3 ...] | 求多个有序集合的并集,并将结果存储到deskey中,numKeys表示有多少个有序集合 |
基数是一种算法,基数的做用是评估大约须要多少个存储单元去存储数据,可是基数的算法通常会存在偏差(可控的偏差)。基数并不存储元素,存储元素对内存空间的消耗比较大,而是给某一个有重复数据的集合评估须要的空间单元数,因此基数是不存储元素的。
简要了解基数的经常使用命令便可,以下表所示:数据结构
命令 | 说明 | 备注 |
---|---|---|
pfadd key element | 添加指定元素到基数中 | 若是已经存在则返回为0,添加失败 |
pfcount key | 返回HyperLogLog的基数值 | |
pfmerge desKey key1[key2....] | 合并多个基数,并将其结果保存到desKey中 |