美文网首页
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集合

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