文档章节

redis05集合

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 978
阅读 1
收藏 0
点赞 0
评论 0

无序集合

集合数据类型与列表数据类型相似,它们都可以存储多个元素;集合数据类型具备的特性是,根据两个集合求左差、右差、相交和去重合并;下面列出集合类型和列表类型的区别。

- 集合类型 列表类型
存储内容(长度) 4, 294, 967, 295 4, 294, 967, 295
有序性 无序 有序
唯一性

有序集合

在集合类型的基础上为每个元素增加了一个分数,针对该分数扩展提供了分片功能,比如说可以获取分数最高(或最低)的前N个元素、获取制定分数范围内的元素等操作(虽然集合中每个元素都是不同的,但是它们的分数却可以相同)。

公共代码片段

import redis
from _functools import partial

# 连接redis
r = redis.StrictRedis('192.168.1.124', decode_responses=True)

# 清空所有键
for number, key in enumerate(r.keys()):
    r.delete(key)

# 准备数据
r.zadd('scoreboard',
       Tom=89, Peter=67, David=100,
       Jerry=56, Wendy=92, Yvonne=67,
       Anna=32, Eric=47, Jack=77,
       Adam=80, Michael=97, William=49)

元素分片

# 打印所有数据
print(r.zrange('scoreboard', 0, -1, withscores=True))
# 显示结果
[('Anna', 32.0), ('Eric', 47.0), ('William', 49.0), ('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]

备注:有序集合默认获取的数据就是按照score分数来排列顺序的。

分数分片

# 查看数据
print(r.zrangebyscore('scoreboard', 50, 90, withscores=True))

# 显示结果
[('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0)]

分数中的条件

# 筛选分数大于60分的人
print(r.zrangebyscore('scoreboard', 60, '+inf', withscores=True))
# 显示结果
[('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]

# 筛选分数大于60分且分数最低的三个人
print(r.zrangebyscore('scoreboard', 60, '+inf', start=0, num=3, withscores=True))
# 显示结果
[('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0)]

# 筛选分数大于60分且分数最高的三个人
print(r.zrevrangebyscore('scoreboard', '+inf', 60, start=0, num=3, withscores=True))
# 显示结果
[('David', 100.0), ('Michael', 97.0), ('Wendy', 92.0)]

获取元素排名

# 打印所有数据
print(r.zrange('scoreboard', 0, -1, withscores=True))
# 查看结果
[('Anna', 32.0), ('Eric', 47.0), ('William', 49.0), ('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]


# 打印Tom元素的排名,它会根据当前元素的分数进行排列并计算出Tom的排名。
print(r.zrank('scoreboard', 'Tom'))
# 查看结果
8

有序集合的交集

# 准备第二组数据, 其中Jack在两组数据中都是存在的.
r.zadd('scoreboard_2',
       Daniel=10, Alex=20, Jack=6)

# 提取交集,zinterstore默认会将两组数据中相同的名字的分数进行相加.
# 有序集合在这里会将提取出来的结果存放到一个独立的键值对象中(在这里是scoreboard_result).
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'))

# 打印结果
print(r.zrange('scoreboard_result', 0, -1, withscores=True))

# 显示结果
[('Jack', 83.0)]


# zinterstore的可选参数:aggregate
# 它有三个固定参数:sum, max, min
# sum是默认参数,表示相同名字的分数相加
# max表示相同名字的分数取最大的那个
# min表示相同名字的分数取最小的那个
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'), aggregate='min')
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 显示结果
[('Jack', 6.0)]


r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'), aggregate='max')
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 显示结果
[('Jack', 77.0)]

有序集合的去重合并

# 准备第二组数据, 其中Jack在两组数据中都是存在的.
r.zadd('scoreboard_2',
       Daniel=10, Alex=20, Jack=6)

# 去重合并,分数相加(默认情况下aggregate等于sum)
r.zunionstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'))
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 显示结果
[('Daniel', 10.0), ('Alex', 20.0), ('Anna', 32.0), ('Eric', 47.0), ('William', 49.0), ('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Adam', 80.0), ('Jack', 83.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]

 
 

Sets / 集合类型命令(14)
- - - - -
SADD SCARD SDIFF SDIFFSTORE SINTER
SINTERSTORE SISMEMBER SMEMBERS SMOVE SPOP
SRANDMEMBER SREMSSCAN SUNION SUNIONSTORE

 

Sorted Sets / 有序集合类型命令(21)
- - - -
ZADD ZCARD ZCOUNT ZINCRBY
ZINTERSTORE ZLEXCOUNT ZRANGE ZRANGEBYLEX
ZRANGEBYSCORE ZRANK ZREM ZREMRANGEBYLEX
ZREMRANGEBYRANK ZREMRANGEBYSCORE ZSCAN ZREVRANGEBYLEX
ZREVRANGE ZREVRANGEBYSCORE ZSCORE ZREVRANK
ZUNIONSTORE

 
 

参考

本文转载自:http://www.jianshu.com/p/8e19cc0c41a1

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2634
码字总数 82983
作品 0
程序员
Python基础手册14——集合

一、集合 这表示无序的,有限的,不重复的对象集合。因为是无序的,所以它们不能被任何下标索引。一个集合的行为很像一个无值的字典的键,但是它还支持额外的操作。集合只能包含不可变的对象...

常大鹏
01/12
0
0
一文带你了解Python集合与基本的集合运算

选自DataCamp,作者:Michael Galarnyk,机器之心编译。 一般我们熟悉 Python 中列表、元组及字典等数据结构,但集合可能用得稍微少一点。但集合独特的元素唯一性与 O(1) 时间复杂度的成员检...

机器之心
06/25
0
0
Java集合框架的知识总结(1)

说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。 1、综述 所有集合类都位于java.util包下。集合中只能保存对象(保...

dong.li
2012/04/24
0
0
Objective-C 语法之集合对象

集合对象的关键字是NSSet与NSMutableSet。前者是不可变集合,后者是可变集合,Objective-C语言中大部分数据结构都存在可变与不可变两种数据。这里的集合很像Java语言与C语言中的Set,用法基本...

鉴客
2011/10/04
1K
0
chapter 7 summarize

chapter 7,dictionary dictionary: 字典是通过这样的算法来比较的: 首先是字典的大小,然后是键,最 后是值。 dictionary内建函数和工厂函数: str(),cmp(),dict() len(),hash() 字符串和...

happyliferao
2015/10/12
2
0
Redis探索之旅(9)- Redis数据类型之集合类型

在本文,我将对Redis中的集合类型进行说明,包含都支持什么操作以及一些需要注意的地方。 集合本身就有一些操作,如插入,删除等,但是集合之间还是有所关系的,集合之间的运算按理说也应该被...

andamajing
2016/09/04
0
0
Python入门笔记(11):集合 -----集合

一、目录 1、集合概述 2、关于集合的操作符、关系符号 3、集合的一系列操作(添加、更新、访问、删除) 4、关于集合的内建函数、内建方法 5、小结 二、集合概述 集合(set):把不同的元素组成一...

Airship
2016/04/22
22
0
小蚂蚁学习Redis笔记(6)——Redis数据类型之无序集合set类型

无序集合set类型 set集合,它是string类型的无序集合。set是通过hash table实现的,添加删除和查找的复杂度都是0(1)。对集合我们可以取并集,交集,差集。通过这些操作我们可以实现sns中的...

嗜学如命的小蚂蚁
2015/11/15
0
0
Python数据结构之集合概览

Python数据结构之集合概览 集合(collection),正如其名称所示,是可以作为概念性的单位来处理的一组零个或多个项。几乎软件的每一个重要部分都涉及集合的使用。尽管我们在计算机科学中所学...

异步社区
2017/12/25
0
0
入门 | 一文带你了解Python集合与基本的集合运算

  选自DataCamp   作者:Michael Galarnyk   机器之心编译   参与:Geek Ai、思源      一般我们熟悉 Python 中列表、元组及字典等数据结构,但集合可能用得稍微少一点。但集合独...

机器之心
06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

回想过往,分析当下,着眼未来

好久没有真正的在纸质笔记本上写过东西了,感觉都快不会写字了,笔画都不知道怎么写了。接下来就说说咱们的正事。 2018年7月22日,我做了一个决定,那就是去参加安全培训(可能是我职业生涯中...

yeahlife
41分钟前
1
0
关于工作中的人际交往

关于工作中的人际交往 Intro 写了篇发泄情绪的博客,但不会发布出来。 大概就是,要么忍,要么滚。 以及一些不那么符合社会主义核心价值观,不满于大资本家与小资本家剥削的废话。

uniqptr
46分钟前
0
0
springMVC的流程

1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(...

JavaSon712
今天
0
0
大数据教程(3.2):Linux系统软件安装之自动化脚本

博主前面文章有介绍过软件的安装,可以帮助IT人员顺利的完成功能软件安装;但是,对于我们运维人员或者需要管理软件安装的项目经理来说,有些应用一次行需要搭建很多台相同的软件环境(如tom...

em_aaron
今天
0
1
Spring Boot 2.0.3 JDBC整合Oracle 12

整合步骤 1. Oracle驱动引入 Oracle驱动一般不能通过maven仓库直接下载得到,需自行下载并导入到项目的lib目录下,建议通过如下pom依赖引入下载的Oracle驱动 <!-- Oracle 驱动 -->...

OSC_fly
今天
0
0
java 8 并行流 - 1

下面创建一个并行流,与顺序流 //顺序流Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .reduce(0L, Long::sum);//并行流Stream.iterate(0L, i -> i......

Canaan_
今天
0
0
数据结构与算法5

二分法采用向下取整的方法 使用有序数组的好处是查找的速度比无序数组快的多,不好的方面是因为要将所有靠后的数据移开,所以速度较慢,有序数组和无序数组的删除操作都很慢。 有序数组在查找...

沉迷于编程的小菜菜
昨天
1
1
SpringBoot | 第十一章:Redis的集成和简单使用

前言 上几节讲了利用Mybatis-Plus这个第三方的ORM框架进行数据库访问,在实际工作中,在存储一些非结构化或者缓存一些临时数据及热点数据时,一般上都会用上mongodb和redis进行这方面的需求。...

oKong
昨天
5
0
对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
昨天
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部