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"
相关文章推荐
- Redis安装部署
- Redis --> Redis架构设计
- redis在.net架构中的应用(1)--利用servicestack连接redis
- Redis+Keepalived高可用方案详细分析
- 利用redis + lua解决抢红包高并发的问题
- Redis安装及使用
- redis 订阅者发布者
- redis优缺点总结
- Redis关键点(自动bgrewriteaof)
- redis总结
- Java中使用Jedis操作Redis
- redis 与DB同步方案
- Redis --> 为redis分配新的端口
- Redis常用命令速查 <第二篇>
- Redis介绍及常用命令
- redis 基本命令学习一(strings、hashes、lists)
- redis安装过程
- Redis碎碎念
- windows 下 redis for php 配置
- Redis命令-集合-scard