• Redis自学笔记:4.3进阶-排序


    4.3排序

    4.3.1有序集合的集合操作

    有序集合没有zinter和zunion命令,使用其他命令实现方法:

    multi
    zinterstore tempKey ...
    zrange tempKey ...
    del tempKey
    exec
    

    4.3.2 sort命令

    sort key [alpha] [asc|desc] [limit offset count]
    sort命令可以对列表类型、集合类型和有序集合类型进行排序,并且完成与
    关系数据库中连接查询相类似的任务

    127.0.0.1:6379> lpush bar 1 23 6 98 999 55 6.3
    7
    127.0.0.1:6379> sort bar
    1
    6
    6.3
    23
    55
    98
    999
    

    在对有序集合类型排序会忽略元素的分组,只针对元素自身的值进行排序

    127.0.0.1:6379> zadd baz 100 9 800 2 500 5 700 3 400 6
    5
    127.0.0.1:6379> sort baz
    2
    3
    5
    6
    9
    127.0.0.1:6379> zrange baz 0 -1
    9
    6
    5
    3
    2
    

    sort命令还可以通过alpha参数实现按照字典顺序排列非数字元素

    127.0.0.1:6379> lpush quux book good look food wood tool
    6
    127.0.0.1:6379> sort quux alpha
    book
    food
    good
    look
    tool
    wood
    

    sort命令的desc参数可以实现将元素按照从大到小排列(默认asc升序)

    127.0.0.1:6379> sort quux alpha desc
    wood
    tool
    look
    good
    food
    book
    

    sort命令limit offset count参数,表示跳过前offset个元素并获取之后
    的count个元素.

    127.0.0.1:6379> sort quux alpha asc limit 1 3
    food
    good
    look
    

    4.3.3 by参数

    sort key ... by 参考键 [asc|desc]
    参考键可以是字符串类型或则散列类型键的某个字段(键名->)
    如果提供了by参数,sort命令将不再依据元素自身的值进行排序,
    而是对每个元素使用元素的值替换参考键中第一个"*"并获取其值,
    然后依据该值对元素排序.

    字符串类型:

    127.0.0.1:6379> lrange book 0 -1
    Python
    Tangshi
    Sanguo
    127.0.0.1:6379> get book:Python
    price:36
    127.0.0.1:6379> get book:Sanguo
    price:48
    127.0.0.1:6379> get book:Tangshi
    price:28
    127.0.0.1:6379> sort book by book:* alpha
    Tangshi
    Python
    Sanguo
    

    散列类型:

    127.0.0.1:6379> hset bok:Python price 36
    1
    127.0.0.1:6379> hset bok:Tangshi price 28
    1
    127.0.0.1:6379> hset bok:Sanguo price 48
    1
    127.0.0.1:6379> sort book by bok:*->price
    Tangshi
    Python
    Sanguo
    
    • 参考键的用来比较的值相同时,sort命令会再比较元素的大小来绝对二者顺序
    • 参考键虽然支持散列类型,但是 * 只能在 -> 前面.否则返回值是元素本身大小排序.

    4.3.4 get参数

    get参数不影响排序,它的作用是sort命令返回结果是get参数指定的键值.
    get参数的规则和by参数一样,get参数也支持字符串和散列类型,并使用 * 作为占位符.

    127.0.0.1:6379> hset bok:Sanguo name SanGuoYanYi
    1
    127.0.0.1:6379> hset bok:Tangshi name Tangshi300
    1
    127.0.0.1:6379> hset bok:Python name PythonStart
    1
    127.0.0.1:6379> sort book by bok:*->price get bok:*->name
    Tangshi300
    PythonStart
    SanGuoYanYi
    

    在一个sort命令可以有多个get参数(by参数只能一个).

    127.0.0.1:6379> hset bok:Python ZX 人民邮电出版社
    1
    127.0.0.1:6379> hset bok:Tangshi ZX 商务印书馆
    1
    127.0.0.1:6379> hset bok:Sanguo ZX 人民文学出版社
    1
    127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX
    Tangshi300
    商务印书馆
    PythonStart
    人民邮电出版社
    SanGuoYanYi
    人民文学出版社
    
    • get # 会返回元素本身的值
    127.0.0.1:6379> sort book by bok:*->price get # get bok:*->name get bok:*->ZX
    Tangshi
    Tangshi300
    商务印书馆
    Python
    PythonStart
    人民邮电出版社
    Sanguo
    SanGuoYanYi
    人民文学出版社
    

    4.3.5 store参数

    默认情况下sort会直接返回排序结果,使用store参数会保存结果.
    例如把结果存入book.view键

    127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX store book.view
    6
    127.0.0.1:6379> lrange book.view 0 -1
    Tangshi300
    商务印书馆
    PythonStart
    人民邮电出版社
    SanGuoYanYi
    人民文学出版社
    

    store参数常用来结合expire命令缓存排序结果,伪代码如下:

    # 判断是否存在之前排序结果的缓存
    $isCacheExists = EXISTS cache.sort
    if $isCacheExists is 1
        # 如果存在直接返回
        return lrange chache.sort 0, -1
    else
        # 如果不存在,则使用sort排序
        $sortResult = sort some.list store cache.sort
        # 设置缓存的过期时间为10分组
        expire cache.sort, 600
        # 返回排序结果
        return $sortResult
    

    4.3.6性能优化

    sort是redis最强大最复杂的命令之一.sortd命令时间复杂度为O(n+mlog(m)),
    其中n表示排序的的列表(集合或有序集合)中元素个数,m表示要返回的元素 个数.

    当n较大是sort命令性能相对较低.所以开发中使用sort命令应注意以下几点:

    1. 尽可能减少待排序键中元素的数量(使n尽可能少)
    2. 使用limit参数只获取需要的数据(使m尽可能少)
    3. 如果排序的数据量较大,尽可能使用store参数将结果缓存
  • 相关阅读:
    volatile 关键字介绍
    hystrix 线程数,超时时间设置测试
    idea git tag 管理
    wget 认知及常用命令【转载】
    yum 认知及使用
    zuul 性能分析
    java 内存分析
    eureka-8-Eureka 的健康检查
    eureka-7-多网卡下的ip选择
    鼠标拖动div宽/高值增加与减小
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10207129.html
Copyright © 2020-2023  润新知