美文网首页
redis05集合

redis05集合

作者: 极光火狐狸 | 来源:发表于2017-04-26 15:07 被阅读21次

无序集合

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

  •         | 集合类型         | 列表类型
    

--- |--- | ---
存储内容(长度) | 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 |

 
 

参考

相关文章

  • redis05集合

    无序集合 集合数据类型与列表数据类型相似,它们都可以存储多个元素;集合数据类型具备的特性是,根据两个集合求左差、右...

  • 我的Swift的学习总结 -->第二周

    集合 集合:Set,定义一个集合可以写成:var 集合名 : Set<集合类型> = [集合元素],具体的集合应用...

  • markdown 测试

    集合 集合 集合 引用

  • kotlin学习第五天:集合,高阶函数,Lambda表达式

    集合 list集合 list集合分为可变集合与不可变集合。由list of创建的集合为不可变集合,不能扩容,不能修...

  • kotlin练习 ---- 集合练习

    kotlin练习 - 集合练习 Set集合 Set集合创建 Set集合的使用 List集合 List集合创建 Li...

  • 集合总结

    集合 集合分为单列集合和双列集合两种: 一.单列集合: Collection是单列集合的顶级接口: 其中有三类集合...

  • Redis05——Redis Cluster 如何实现分布式集群

    前面一片文章,我们已经说了Redis的主从集群及其哨兵模式。本文将继续介绍Redis的分布式集群。 在高并发场景下...

  • 映射、元组、集合

    映射 元组 集合 集合之seq 集合之set 集合之map

  • 16.Collection集合

    主要内容: Collection 集合 迭代器 增强for List 集合 Set 集合 1,集合 集合是java...

  • 集合与有序集合

    集合分为有序集合 (zset) 和无序集合 (set), 一般无序集合也直接说成集合 无序集合 (set) 无序集...

网友评论

      本文标题:redis05集合

      本文链接:https://www.haomeiwen.com/subject/tgiizttx.html