文档章节

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

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

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

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

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

机器之心
06/25
0
0
Python入门笔记(11):集合 -----集合

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

Airship
2016/04/22
22
0
Objective-C 语法之集合对象

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

鉴客
2011/10/04
1K
0
Java集合框架的知识总结(1)

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

dong.li
2012/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python基础案例教程

一、超市买薯片 # 用户输入薯片的单价danjia = float(input("薯片的单价"))# 用户输入购买袋数daishu = int(input("购买的袋数"))# 计算总价zongjia = danjia * daishu# 输出结果...

linuxprobe16
46分钟前
0
0
采用CXF框架发布webservice

package cn.it.ws.cxf.a;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;@WebService(serviceName="languageManager")public interface ......

江戸川
48分钟前
0
0
HashMap工作原理及实现

HashMap工作原理及实现 1. 概述 什么时候会使用HashMap?他有什么特点? 知道HashMap的工作原理吗? 知道get和put的原理吗? 知道hash的实现吗?为什么要这样实现? 如果HashMap的大小超过了...

傅小水water
55分钟前
1
0
swagger如何屏蔽某些接口,不对外公开--使用@ApiIgnore

@ApiIgnore@RestController@RequestMapping(value = "/i18nTest")public class I18nTestController {// @Resource// private LocaleMessageSourceService localeMessageSourceSe......

karma123
59分钟前
1
0
大数据技术学习,大数据处理为何选择Spark,而不是Hadoop

大数据处理为何选择Spark,而不是Hadoop。 一.基础知识 1.Spark Spark是一个用来实现快速而通用的集群计算的平台。 在速度方面,Spark扩展了广泛使用的MapReduce计算模型,而且高效地支持更多...

董黎明
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部