Redis自学笔记:3.6入门-有序集合类型
3.6有序集合类型
3.6.1介绍
在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得
分数最高(最低)的前N个元素,可以获得指定范围内的元素等
- 有序集合中每个元素不同,但它们的分数却可以相同
有序集合和列表相同点:
- 都是有序的
- 都可以获得某一范围元素
有序集合和列表区别: - 列表是通过双链表实现的
有序集合是使用散列表和跳跃表实现的 - 列表中不能简单地调整某个元素
但是集合可以(通过更改这个元素的分数) - 有序集合要比列表更耗费内存
3.6.2命令
- 增加元素
zadd key score member [score member ...]- 如果该元素已经存在会用新的分数替换原有的分数
127.0.0.1:6379> zadd foo 89 tom 67 peter 100 david 3 127.0.0.1:6379> zadd foo 76 peter 0 - +inf和-inf分别表示正无穷和负无穷
- 如果该元素已经存在会用新的分数替换原有的分数
- 获得元素的分数
zscore key member
127.0.0.1:6379> zscore foo tom 89 - 获得排名在某个范围的元素列表
zrange key start stop [withscores]
按照元素分数从小到大顺序返回索引从start到stop之间的所有元素
时间复杂度为O(log n+m)
zrevrange key start stop [withscores]
按照元素分数从大到小顺序返回索引从start到stop之间的所有元素
127.0.0.1:6379> zrange foo 0 2 peter tom david 127.0.0.1:6379> zrevrange foo 0 -1 david tom peter 127.0.0.1:6379> zrange foo 0 -1 withscores peter 76 tom 89 david 100- withscores表示返回元素的分数
- 获得指定分数范围的元素
zrangebyscore key min max [withscores] [limit offset count]
127.0.0.1:6379> zrangebyscore foo 80 100 tom david 127.0.0.1:6379> zrangebyscore foo 80 (100 tom- (100 表示不包含100
127.0.0.1:6379> zrangebyscore foo (80 +inf tom david - 不知道最高分上限,获得80分以上的
127.0.0.1:6379> zrangebyscore bar 2 6 withscores limit 0 1 b 2 limit offset count:跳过offset条,显示count条,类似SQL里面语句
- (100 表示不包含100
- 增加某个元素的分数
zincrby key increment member
增加一个元素分数(increment为负数时即为减)
127.0.0.1:6379> zscore foo tom 89 127.0.0.1:6379> zincrby foo 5 tom 94 127.0.0.1:6379> zscore foo tom 94- 如果元素不存在,redis会先建立并将它的分数赋为0,再执行操作
3.6.3实践
- 实现点击率排序
以文章的ID作为元素,该文章的点击量作为该元素的分数.
该键命名为posts:page.view,每次用户访问一篇文章,博客程序就通过
zincrby posts:page.view 1文章ID更新访问量
需要按照点击量的顺序显示文章列表时,伪代码:
$postsPerPage = 10 $start = ($currentPage-1) * $postsPerPage $end = $current * $postsPerPage - 1 $postsID = zrevrange posts:page.view, $start, $end for each $id in $postsID $postData = hgetall post:$id print 文章标题: $postData.title- 注:3.2介绍的字符串类型
post:文章ID:page.view这个键不需要了
- 注:3.2介绍的字符串类型
- 改进时间排序
为了能够自由更改文章发布时间(3.4节posts:list),可以采用有序集合类型
代替列表类型.元素是文章ID,分数是Unix时间.
3.6.4命令拾遗
- 获得集合中元素数量:
zcard key
127.0.0.1:6379> zadd foo 1 a 2 b 3 c 4 d 4 127.0.0.1:6379> zcard foo 4 - 获得指定分数范围内元素:
zcount key min max
127.0.0.1:6379> zcount foo 2 3 2 - 删除一个或多个元素:
zrem key member [member ...]
127.0.0.1:6379> zrem foo a 1 127.0.0.1:6379> zrem foo d f b 2 - 按照排名范围删除元素
zremrangebyrank key start stop
127.0.0.1:6379> zadd foo 1 a 2 b 3 c 4 d 5 g 6 f 6 127.0.0.1:6379> zremrangebyrank foo 0 2 3 127.0.0.1:6379> zrange foo 0 -1 d g f - 按照分时范围删除元素
zremrangebyscore key min max
127.0.0.1:6379> zremrangebyscore foo 5 6 2 127.0.0.1:6379> zrange foo 0 -1 d - 获得元素的排名
zrank key member
升序时候的排名
zrevrank key member
降序时候排名
127.0.0.1:6379> zadd foo 33.3 a 99.9 b 72 c 88 d 21.333 f 5 127.0.0.1:6379> zrank foo b 4 127.0.0.1:6379> zrevrank foo b 0 计算有序集合交集
zinterstore destination numkey key [key...]
[weights weight [weight...]] [aggregate sum|min|max]①当aggregate为sum时(默认)
127.0.0.1:6379> zadd foo 1 a 2 b 3 c 3 127.0.0.1:6379> zadd bar 1 a 2 c 3 f 3 127.0.0.1:6379> zinterstore fred 2 foo bar 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 2 c 5
②当aggregate为min时
127.0.0.1:6379> zinterstore fred 2 foo bar aggregate min 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 1 c 2
③当aggregate为max时
127.0.0.1:6379> zinterstore fred 2 foo bar aggregate max 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 1 c 3
④weights设置每个集合的权重,每个集合在参与计算是元素的分数会被乘上
该集合的权重
127.0.0.1:6379> zinterstore fred 2 foo bar weights 2 0.5 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 2.5 c 7计算有序集合并集
zunionstore和zinterstore用法类似
Redis自学笔记:3.6入门-有序集合类型的更多相关文章
- Redis自学笔记:3.3入门-散列类型
3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...
- Redis自学笔记:3.5入门-集合类型
3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...
- Redis自学笔记:3.2入门-字符串类型
3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...
- Redis学习笔记(六)有序集合进阶
1.基础操作 ZCARD(获取成员数量) ZINCRBY key_name num member(将member的分数加num) ZCOUNT key_name min max(获取分数在min与ma ...
- Redis自学笔记:3.4入门-列表类型
3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...
- Redis自学笔记:3.1入门-热身
第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...
- Redis自学笔记 --Hash、List、Set类型简述
Hash类型 hset key f ...
- Redis 常用命令学四:有序集合类型命令
1.增加元素,修改存在元素的分数 127.0.0.1:6379> zadd score 99 a 88 b 66 c (integer) 3 127.0.0.1:6379> ZADD sc ...
- Redis常用命令入门5:有序集合类型
有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...
随机推荐
- Microsoft Visual Studio Community 2017 修改新建项目的默认位置
IDE: Microsoft Visual Studio Community 2017 15.5.2 通过修改默认的设置,在下一次新建项目时,就可以节省一些不必要的操作. 菜单:工具 > 选项, ...
- API接口加密方式说明
标签: 接口 2016年10月11日 19:41:20 13299人阅读 评论(0) 收藏 举报 分类: API(5) 版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog ...
- AI学习吧-结算中心
结算中心流程 在结算中心中,主要是对用户添加到购物车商品的结算,由于用户可能添加了多个课程,但是,结算时会选择性的进行支付.在结算时会选中课程id,和对应的价格策略.在后台,首先会对用户进行校验,验证 ...
- js里添加的标签
js里添加的标签.网页加载此标签绑定的js函数时,由于没有标签,故无法执行函数. 例如: js中添加了一个button: html1 += "<td><button typ ...
- 关于js渲染网页时爬取数据的思路和全过程(附源码)
于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...
- Python零基础入门之Tkinter的对话框
这篇博客主要是总结一下Tkinter中的对话框的使用,值得一提的是自从python3.0之后关于关于对话框的模块(messagebox.filedialog.colorchooser)都被收归到了tk ...
- OpenCV-Python入门教程6-Otsu阈值法
在说Otsu之前,先说几个概念 灰度直方图:将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率.其实就是每个值(0~255)的像素点个数统计. Otsu算法假设这副图片由前景色和背景色组成,通 ...
- Java开发环境笔记
在配置环境变量中 设置Java_home: 一是为了方便引用,比如,jdk安装在c:\jdk16.0目录里,则设置java_home为该目录路径,那么以后要使用这个路径的时候,只需输入%java_ho ...
- IT设备服务监控的方法论
有方法论提导,在技战术方面才不会偏离目录. 使用服务级别作为关键语,召示着承诺和责任. https://www.circonus.com/2018/06/comprehensive-container ...
- Docker常见命令
docker制作Images docker build -t 镜像名 .(“.”最后这一个点不能忽略) docker 运行Images docker run --name=容器名 --net=host ...