文档章节

redis操作数据-sorted set

wangma
 wangma
发布于 2014/12/13 00:31
字数 1157
阅读 36
收藏 0

1.关于sorted set我们可以理解为有一张表,表有两列,一列存value,还有一列存顺序,操作中的key理解为zset的名字.

    当元素被添加到集合中时候,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是o(1).另一个socre到元素的映射被添加到skip list,并按照score排序,所以就可以有序的获取集合中的元素.添加,删除操作开销都是o(log(N))和skip list的开销一致,redis的skip list实现用的是双向链表,这样就可以逆序从尾部取数据.

sorted set最常用的使用方式应该是作为索引来使用,我么可以把要排序的字段作为score存储,对象的id做元素存储,下面对sorted set相关命令介绍.

2.相关命令介绍:

    2.1 zadd ,向key中添加元素member,score用于排序.如果元素存在,则根据score更新改元素的顺序

127.0.0.1:6379> zadd myzset 1 id1
(integer) 1
127.0.0.1:6379> zadd myzset 2 id2
(integer) 1
127.0.0.1:6379> zadd myzset 3 id3
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id1"
2) "1"
3) "id2"
4) "2"
5) "id3"
6) "3"

zadd添加可以为myzset,member为id1,id2,id3,对应score分别为1,2,3的元素

如果一个member设置两次,那么以最后一次为准

zrange查看key为myzset中存在的元素,如果加上withscores,那么会显示members和score


2.2 zrem,删除key中对应member的元素
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id1"
2) "1"
3) "id2"
4) "2"
5) "id3"
6) "3"
127.0.0.1:6379> zrem myzset id2
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id1"
2) "1"
3) "id3"
4) "3"

可以看到key为myzset的member为id2的这条记录删除了

2.3 zincrby  如果名称为key的zset中已经存在元素member,则改元素的score增加increment;否则向集合中添加改元素,其score的值为increment
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id1"
2) "1"
3) "id3"
4) "3"
127.0.0.1:6379> zincrby myzset 2 id1
"3"
127.0.0.1:6379> zincrby myzset 2 id4
"2"
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id4"
2) "2"
3) "id1"
4) "3"
5) "id3"
6) "3"

可以看到id4是新增的,id1的score增加了2变为3

2.4 zrank ,返回名称为key的zset中member元素的排名(按照score从小到大的顺序排),值是下标
127.0.0.1:6379> zrank myzset id1
(integer) 1
127.0.0.1:6379> zrank myzset id3
(integer) 2
127.0.0.1:6379> zrank myzset id4
(integer) 0

下标从0开始的,一次id4最小排在最前面.

2.5 zrevrank ,返回名称为key的zset中member元素的排名(按照从大到校的顺序排),取的是小标值
127.0.0.1:6379> zrevrank myzset id4
(integer) 2
127.0.0.1:6379> zrevrank myzset id3
(integer) 0
127.0.0.1:6379> zrevrank myzset id1
(integer) 1

2.6 zrevrange ,返回名称为key的zset(按照score栋大到小排序)中的index从start到end的所有元素
127.0.0.1:6379> zrevrange myzset 0 -1 withscores
1) "id3"
2) "3"
3) "id1"
4) "3"
5) "id4"
6) "2"
127.0.0.1:6379> zrevrange myzset 0 1 withscores
1) "id3"
2) "3"
3) "id1"
4) "3"

首先按 score 从大到小排序,再取出全部元素

2.7 zrangebyscore ,返回集合中score在给定区间的元素
127.0.0.1:6379> zrangebyscore myzset 2 3 withscores
1) "id4"
2) "2"
3) "id1"
4) "3"
5) "id3"
6) "3"
127.0.0.1:6379> zrangebyscore myzset 3 3 withscores
1) "id1"
2) "3"
3) "id3"
4) "3"

2.8 zcount返回集合中score在给定区间的数量
127.0.0.1:6379> zcount myzset 3 3
(integer) 2
127.0.0.1:6379> zcount myzset 2 3
(integer) 3

值为3的有2个,值在2-3的有3个

2.9 zcard 返回集合中元素的个数
127.0.0.1:6379> zcard myzset
(integer) 3

可以发现key为myzset的集合有3个元素

2.10 zscore 返回给定元素对应的score
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id4"
2) "2"
3) "id1"
4) "3"
5) "id3"
6) "3"
127.0.0.1:6379> zscore myzset id1
"3"

2.11 zremrangebyrank ,删除集合中排名在给定区间的元素
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id4"
2) "2"
3) "id1"
4) "3"
5) "id3"
6) "3"
127.0.0.1:6379> zremrangebyrank myzset 2 2
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id4"
2) "2"
3) "id1"
4) "3"

可以看到排名区间第二到第二的是id3,因此把id3删除掉了

2.12 zremrangebyscore ,删除集合中score在给定区间的元素
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id4"
2) "2"
3) "id1"
4) "3"
127.0.0.1:6379> zremrangebyscore myzset 1 2
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "id1"
2) "3"

可以看到score从1-2的只有id4,因此id4被删除了

© 著作权归作者所有

wangma
粉丝 8
博文 46
码字总数 29223
作品 0
深圳
后端工程师
私信 提问
Redis中Key相关的常用指令详解

Redis是一个开源的使用ANSI C 语言编写、支持网络、同memcache相比在Redis下可以实现基于内存亦可持久化的日志型、Key-Value 类型的NoSQL数据库,且在Redis中Key的类型也更为丰富。所以较为广...

往事_Jim_遗
2017/11/02
0
0
Redis作者谈Redis应用场景

毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不...

chaoluo001
2017/07/06
0
0
redis 应用场景

毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不...

吹比龙
2016/09/05
4
0
redis使用总结-redis命令使用

redis五种数据类型的使用 1、String 常用命令: set,get,decr,incr,mget 等。 应用场景: String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。 实现方式...

飓风2000
2014/04/06
0
0
Redis作者谈Redis应用场景

作者:nosqlfan on 星期二, 六月 28, 2011 · 5条评论 【阅读:21,770 次】 毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大...

lvzjane
2014/04/17
0
1

没有更多内容

加载失败,请刷新页面

加载更多

程序员随想-关于分享

最早的时候,文字是贵族这些上层人士才会学习的,底层人士没有资格和渠道去学习,同样用文字、图像等其他载体承载的知识大部分也只有贵族阶层才能享受的。后来有了造纸术、印刷术,成本降低,...

Lubby
38分钟前
1
0
聊聊hibernate的session-level repeatable reads

序 本文主要研究一下hibernate的session-level repeatable reads 实例 doInTransaction(session -> { Product product = new Product(); product.setId(1L); product.setQuanti......

go4it
50分钟前
1
0
ubuntu或ubuntu kylin优麒麟中安装QQ、wechat微信、百度网盘

从中国国内的地址下载deepin wine,码云上的。这样网速比较快。然后,按照说明向下安装。 https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu...

gugudu
今天
2
0
基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
今天
14
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部