您的位置:首页 > 数据库 > Redis

redis 基本命令学习二(sets、sorted sets)

2016-04-29 16:18 639 查看
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) 1
127.0.0.1:6379> SADD myset "world"
(integer) 1
127.0.0.1:6379> SADD myset "world"
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
本例中,我们向 myset 中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以第三个元素没有添加成功,最后我们用 smembers 来查看 myset 中的所有元素

127.0.0.1:6379> SMEMBERS myset
1) "usa"
2) "world"
3) "hello"
4) "china"
127.0.0.1:6379> SREM myset "usa"
(integer) 1
127.0.0.1:6379> SREM myset "he"
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "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 myset
1) "world"
2) "hello"
127.0.0.1:6379> SMEMBERS myset1
1) "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) 1
127.0.0.1:6379> SMEMBERS myset2
1) "world"
127.0.0.1:6379> SINTER myset myset1  :取两集合的交集
1) "hello"
127.0.0.1:6379> SINTERSTORE myset3 myset myset1   :两集合交集并存储
(integer) 1
127.0.0.1:6379> SMEMBERS myset3
1) "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) 3
127.0.0.1:6379> SMEMBERS myset4
1) "hello"
2) "usa"
3) "china"

127.0.0.1:6379> SMEMBERS myset
1) "usa"
2) "hello"
127.0.0.1:6379> SMEMBERS myset1
1) "hello"
2) "china"
127.0.0.1:6379> SMOVE myset myset1 "usa"  :把myset的 "usa" 移动到 myset1
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "usa"
2) "hello"
3) "china"
127.0.0.1:6379> SCARD myset1  :返回名称为 key 的 set 的元素个数
(integer) 3
127.0.0.1:6379> SISMEMBER myset1 "china"  :测试 member 是否是名称为 key 的 set 的元素  1为真 0为假
(integer) 1
127.0.0.1:6379> SISMEMBER myset1 "ch"
(integer) 0
127.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) 1
127.0.0.1:6379> zadd myzset 2 "two"
(integer) 1
127.0.0.1:6379> zadd myzset 3 "two"
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "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) 1
127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "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 withscores
1) "two"
2) "2"
3) "one"
4) "3"
127.0.0.1:6379> ZRANK myzset one :取member在zset中的下标,不是 score
(integer) 1
127.0.0.1:6379> ZRANK myzset two
(integer) 0
127.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 withscores
1) "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) 2
127.0.0.1:6379> ZCARD myzset  :返回集合中元素个数
(integer) 4
127.0.0.1:6379> ZSCORE myzset "haha" :返回给定元素对应的 score
"4"
127.0.0.1:6379> ZRANGE  myzset 0 -1 withscores
1) "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) 1
127.0.0.1:6379> ZRANGE  myzset 0 -1 withscores
1) "two"
2) "2"
3) "one"
4) "3"
5) "haha"
6) "4"
127.0.0.1:6379> ZREMRANGEBYRANK myzset 1 2
(integer) 2
127.0.0.1:6379> ZRANGE  myzset 0 -1 withscores
1) "two"
2) "2"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: