文档章节

redis05集合

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 978
阅读 1
收藏 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

共有 人打赏支持
上一篇: sql注入
AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
Python入门笔记(11):集合 -----集合

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

Airship
2016/04/22
22
0
Python数据结构之集合概览

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

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

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

机器之心
2018/06/24
0
0
OC中的NSSet(集合)

NSSet(集合) 集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。 集合是一种哈希表,运用散列算法,查找集合中的...

Dumplings
2016/04/01
24
0
第十章 Scala 容器基础(二十二):合并有序集合

Problem 你想要把两个集合合并为一个集合,要么包含两集合所有的元素,要么包含两个集合的相同元素,要么包含两个集合的不同元素。 Solution 对于这个问题有很多解决方案,用哪种取决于你的需...

阿拉德大陆的魔法师
2016/04/18
538
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的Table API及SQL Programs

序 本文主要研究一下flink的Table API及SQL Programs 实例 // for batch programs use ExecutionEnvironment instead of StreamExecutionEnvironmentStreamExecutionEnvironment env = Stre......

go4it
17分钟前
0
0
mysqldump应用

备份单个库/表数据或库/表结构 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 备份文件名 1、导出数据库为dbname的表结构(其中用戶名為root,密码为dbpasswd,生成的...

阿dai
24分钟前
0
0
shell脚本与Python的交互

1、Python针对shell获取传入,输出参数 传入:"$num" 例如: $0表示文件名,$1表示shell获取的第一个参数 输出:通过打印shell结果的方式,输出参数给Python。 例如: echo "{$iplist}",Python调...

一口今心
27分钟前
0
0
Euler 今日问世!国内首个工业级的图深度学习开源框架,阿里妈妈造

阿里妹导读:千呼万唤始出来!阿里妈妈正式公布重磅开源项目——图深度学习框架Euler。这是国内首个在核心业务大规模应用后开源的图深度学习框架。此次开源,Euler内置了大量的算法供用户直接...

阿里云官方博客
34分钟前
0
0
TiDB 3.0 Beta Release Notes

2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。 TiDB 新特性 支持 Vi...

TiDB
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部