sets 类型及操作
set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作, 操作中 key 理解为集合的名字。Redis 的 set 是 string 类型的无序集合。 set 元素最大可以包含(2 的 32 次方)个元素。set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。 hash table 会随着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表( skip list)来实现,跳表已经在 sortedset 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns中的好友推荐和 blog 的 tag 功能。下面详细介绍 set 相关命令:
127.0.0.1:6379> SADD myset "hello"(integer) 1127.0.0.1:6379> SADD myset "world"(integer) 1127.0.0.1:6379> SADD myset "world"(integer) 0127.0.0.1:6379> SMEMBERS myset1) "world"2) "hello"本例中,我们向 myset 中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以第三个元素没有添加成功,最后我们用 smembers 来查看 myset 中的所有元素127.0.0.1:6379> SMEMBERS myset1) "usa"2) "world"3) "hello"4) "china"127.0.0.1:6379> SREM myset "usa"(integer) 1127.0.0.1:6379> SREM myset "he"(integer) 0127.0.0.1:6379> SMEMBERS myset1) "world"2) "hello"3) "china" srem 来删除 usa 和 he,但由于元素中没有 he 所以,此条 srem 命令执行失败127.0.0.1:6379> SPOP myset :spop 来随机删除一个元素"china"127.0.0.1:6379> SMEMBERS myset1) "world"2) "hello"127.0.0.1:6379> SMEMBERS myset11) "hello"2) "china"127.0.0.1:6379> SDIFF myset myset1 :显示myset中与myset1不同的值1) "world"127.0.0.1:6379> SDIFF myset1 myset :显示myset1中与myset不同的值1) "china"127.0.0.1:6379> SDIFFSTORE myset2 myset myset1 :将myset 不在 myset1中的key。存入myset2中(integer) 1127.0.0.1:6379> SMEMBERS myset21) "world"127.0.0.1:6379> SINTER myset myset1 :取两集合的交集1) "hello"127.0.0.1:6379> SINTERSTORE myset3 myset myset1 :两集合交集并存储(integer) 1127.0.0.1:6379> SMEMBERS myset31) "hello"127.0.0.1:6379> SUNION myset myset1 :两集合并集1) "hello"2) "usa"3) "china"127.0.0.1:6379> SUNIONSTORE myset4 myset myset1 :两集合并集并存储(integer) 3127.0.0.1:6379> SMEMBERS myset41) "hello"2) "usa"3) "china"127.0.0.1:6379> SMEMBERS myset1) "usa"2) "hello"127.0.0.1:6379> SMEMBERS myset11) "hello"2) "china"127.0.0.1:6379> SMOVE myset myset1 "usa" :把myset的 "usa" 移动到 myset1(integer) 1127.0.0.1:6379> SMEMBERS myset11) "usa"2) "hello"3) "china"127.0.0.1:6379> SCARD myset1 :返回名称为 key 的 set 的元素个数(integer) 3127.0.0.1:6379> SISMEMBER myset1 "china" :测试 member 是否是名称为 key 的 set 的元素 1为真 0为假(integer) 1127.0.0.1:6379> SISMEMBER myset1 "ch"(integer) 0127.0.0.1:6379> SRANDMEMBER myset1 :随机返回名称为 key 的 set 的一个元素,但是不删除元素"china"sorted sets 类型及操作
sorted set 是 set 的一个升级版本, 它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后, zset 会自动重新按新的值调整顺序。可以理解为有两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。
和 set 一样 sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double类型的 score。 sorted set 的实现是 skip list 和 hash table 的混合体。
当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个元素获取 score 的开销是 O(1),另一个 score 到元素的映射被添加到 skip list,并按照 score 排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list 的开销一致,redis 的 skip list 实现用的是双向链表,这样就可以逆序从尾部取元素。 sorted set 最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的 id当元素存储。下面是 sorted set 相关命令:
127.0.0.1:6379> zadd myzset 1 "one"(integer) 1127.0.0.1:6379> zadd myzset 2 "two"(integer) 1127.0.0.1:6379> zadd myzset 3 "two"(integer) 0127.0.0.1:6379> 127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "one"2) "1"3) "two"4) "3"本例中我们向 myzset 中添加了 one 和 two,并且 two 被设置了 2 次,那么将以最后一次的设置为准,最后我们将所有元素都显示出来并显示出了元素的 score。127.0.0.1:6379> ZREM myzset two :删除名称为 key 的 zset 中的元素 member(integer) 1127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "one"2) "1"127.0.0.1:6379> ZINCRBY myzset 2 one :如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则向集合中添加该元素,其 score 的值为 increment"3"127.0.0.1:6379> ZINCRBY myzset 2 two"2"127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "two"2) "2"3) "one"4) "3"127.0.0.1:6379> ZRANK myzset one :取member在zset中的下标,不是 score(integer) 1127.0.0.1:6379> ZRANK myzset two(integer) 0127.0.0.1:6379> ZRANK myzset th(nil)127.0.0.1:6379> ZREVRANGE myzset 0 -1 withscores :从大到小排序1) "one"2) "3"3) "two"4) "2"127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "two"2) "2"3) "one"4) "3"5) "haha"6) "4"7) "hehe"8) "5"127.0.0.1:6379> ZRANGEBYSCORE myzset 2 3 withscores :返回集合中 score 在给定区间的元素1) "two"2) "2"3) "one"4) "3"127.0.0.1:6379> ZCOUNT myzset 2 3 :返回集合中 score 在给定区间的数量(integer) 2127.0.0.1:6379> ZCARD myzset :返回集合中元素个数(integer) 4127.0.0.1:6379> ZSCORE myzset "haha" :返回给定元素对应的 score"4"127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "two"2) "2"3) "one"4) "3"5) "haha"6) "4"7) "hehe"8) "5"127.0.0.1:6379> ZREMRANGEBYRANK myzset 3 3 :删除集合中排名在给定区间的元素(integer) 1127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "two"2) "2"3) "one"4) "3"5) "haha"6) "4"127.0.0.1:6379> ZREMRANGEBYRANK myzset 1 2(integer) 2127.0.0.1:6379> ZRANGE myzset 0 -1 withscores1) "two"2) "2"