当前位置: 首页 > 面试题库 >

Spring Redis排序键

蒯翰墨
2023-03-14
问题内容

我在Redis(Spring Data Redis)中有以下键,

localhost>Keys *
"1+ { \"_id":"1", \"Name\" : \"C5796\" , \"Site\" : \"DRG1\"}"
"2+ { \"_id":"2", \"Name\" : \"CX1XE\" , \"Site\" : \"DG1\"}"
"3+ { \"_id":"3", \"Name\" : \"C553\" , \"Site\" : \"DG1\"}"

如果要根据 ID /名称/站点 进行排序,该怎么做Spring Redis

List<Object> keys = redistemplate.sort(SortQueryBuilder.sort("Customer").build());

和,

SortQuery<String> sort = SortQueryBuilder.sort(key).noSort().get(field).build(); 
List<?> keys = redistemplate.boundHashOps(key).getOperations().sort(sort);

不工作。


问题答案:

该代码位于文章的最后,如果您熟悉redis中的多hset键排序的原理,请跳过以下内容并直接阅读代码。

Redis Sort旨在对List / Set /
Zset中的字段进行排序,但是该方法可用于根据所需的指定指标对多键进行排序。我们可以使用“
sort”按指定字段对多个hset键进行排序,但是关于hset键的模式存在一些限制。
例如,如果hset键的模式为“ hash {i}”(i为整数),则在这种情况下我们可以对其进行排序。


127.0.0.1:6379> keys hash*
1) "hash3"
2) "hash2"
3) "hash1"

看一下hash1的内容:

127.0.0.1:6379> hgetall hash1
1) "id"
2) "24"
3) "name"
4) "kobe"

每个哈希键包含两个字段:“ id”,“ name”。如果我们要按ID对这些hset键进行排序。我们应该做什么 ?

首先,添加一个名为“ myset”的设置键。“ myset”是包含成员{“ 1”,“ 2”,“ 3”}的设置键。

127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"

然后运行以下命令:

127.0.0.1:6379> SORT myset BY hash*->id GET hash*->id GET hash*->name
1) "3"
2) "wade"
3) "24"
4) "kobe"
5) "30"
6) "curry"

尤里卡(Eureka),按ID对哈希{1-3}进行排序。
这是使用Spring Redis完成这项工作的代码:

public static String getRandomStr() {
    return String.valueOf(new Random().nextInt(100));
}

public static void redisTemplateSort(RedisTemplate redisTemplate) {
    String sortKey = "sortKey";

    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

    redisTemplate.setKeySerializer(stringRedisSerializer);
    redisTemplate.setValueSerializer(stringRedisSerializer);
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    redisTemplate.setHashValueSerializer(stringRedisSerializer);

    redisTemplate.delete(sortKey);
    if (!redisTemplate.hasKey(sortKey)) {
        for (int i = 0; i < 10; i++) {
            redisTemplate.boundSetOps(sortKey).add(String.valueOf(i));
            String hashKey = "hash" + i,
                    strId = String.valueOf(i),
                    strName = getRandomStr(),
                    strSite = getRandomStr();
            redisTemplate.boundHashOps(hashKey).put("_id", strId);
            redisTemplate.boundHashOps(hashKey).put("Name", strName);
            redisTemplate.boundHashOps(hashKey).put("Site", strSite);

            System.out.printf("%s : {\"_id\": %s, \"Name\": %s, \"Site\", %s}\n",
                    hashKey, strId, strName, strSite);
        }
    }

    SortQuery<String> sortQuery = SortQueryBuilder.sort(sortKey).by("hash*->Name")
            .get("hash*->_id").get("hash*->Name").get("hash*->Site").build();
    List<String> sortRslt = redisTemplate.sort(sortQuery);

    for (int i = 0; i < sortRslt.size(); ) {
        System.out.printf("{\"_id\": %s, \"Name\": %s, \"Site\", %s}\n", sortRslt.get(i+2), sortRslt.get(i+1), sortRslt.get(i));
        i += 3;
    }
}

运行结果redisTemplateSort(redisTemplate)(按代码中的名称排序):

hash0 : {"_id": 0, "Name": 59, "Site", 60}
hash1 : {"_id": 1, "Name": 37, "Site", 57}
hash2 : {"_id": 2, "Name": 6, "Site", 40}
hash3 : {"_id": 3, "Name": 91, "Site", 58}
hash4 : {"_id": 4, "Name": 39, "Site", 32}
hash5 : {"_id": 5, "Name": 27, "Site", 82}
hash6 : {"_id": 6, "Name": 43, "Site", 10}
hash7 : {"_id": 7, "Name": 17, "Site", 55}
hash8 : {"_id": 8, "Name": 14, "Site", 91}
hash9 : {"_id": 9, "Name": 39, "Site", 91}
{"_id": 40, "Name": 6, "Site", 2}
{"_id": 91, "Name": 14, "Site", 8}
{"_id": 55, "Name": 17, "Site", 7}
{"_id": 82, "Name": 27, "Site", 5}
{"_id": 57, "Name": 37, "Site", 1}
{"_id": 32, "Name": 39, "Site", 4}
{"_id": 91, "Name": 39, "Site", 9}
{"_id": 10, "Name": 43, "Site", 6}
{"_id": 60, "Name": 59, "Site", 0}
{"_id": 58, "Name": 91, "Site", 3}


 类似资料:
  • 本文向大家介绍PowerShell 排序:排序对象/排序,包括了PowerShell 排序:排序对象/排序的使用技巧和注意事项,需要的朋友参考一下 示例 按升序或降序对枚举进行排序 同义词: 假设: 升序排序是默认设置: 阿龙 阿龙 伯尼 查理· 丹尼 要请求降序排列: 丹尼· 查理 ·伯尼· 亚伦 ·亚伦 您可以使用表达式进行排序。 阿龙 阿龙 丹尼· 伯尼· 查理

  • 展示多条数据时,通常需要对数据按照用户指定的列进行排序。 Yii 使用 yii\data\Sort 对象来代表排序方案的有关信息。 特别地, attributes 指定 属性,数据按照其排序。 一个属性可以就是简单的一个 model attribute, 也可以是结合了多个 model 属性或者 DB 列的复合属性。下面将给出更多细节。 attributeOrders 给出每个属性当前设置的 排序

  • 基数排序 from typing import List def radix_sort(arr: List) -> List: """ 基础排序 核心思想: 一共有0-9为数字的桶,一共10个,一共循环数组中最大数的位数次(如最大数是1000则是4次个十百千位分别循环), 每一次循环依次从数中取出个、十、百、千、万...位数上的数值放到对应的桶中,如果该位上没有

  • 问题内容: 我正在尝试通过sequelize从数据库中输出所有对象列表,如下所示,并希望在我在where子句中添加id时对数据进行整理。 但是问题是渲染后,所有数据按如下进行整理。 正如我发现的那样,它既没有按ID也没有按名称排序。请帮我解决。 问题答案: 在序列化中,您可以轻松添加order by子句。 看看我如何添加对象数组? 编辑: 一旦在诺言中收到对象,您可能必须订购这些对象。查看有关根据

  • 问题内容: 表是由其主键本质上排序的吗?如果我有一个在BigInt标识列上具有主键的表,我可以相信查询将始终返回按键排序的数据,还是我明确需要添加“ ORDER BY”。性能差异很大。 问题答案: 数据通过聚簇索引进行物理存储,聚簇索引通常是主键,但不一定是主键。 如果没有ORDER BY子句,则不能保证SQL中的数据具有顺序。当您需要按特定顺序排列数据时,应始终指定ORDER BY子句。如果表已

  • 本文向大家介绍JavaScript希尔排序、快速排序、归并排序算法,包括了JavaScript希尔排序、快速排序、归并排序算法的使用技巧和注意事项,需要的朋友参考一下 以var a = [4,2,6,3,1,9,5,7,8,0];为例子。 1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。 过程输出: 由输出可以看到。第一轮间隔为5。依次对这些间隔的数组插入排序

  • 问题:Mergesort将一个数字列表分成两半,并对这两个数字进行递归调用。相反,您能在左半部分执行quicksort,在右半部分执行mergesort吗?如果是,则通过显示每个步骤来显示它将如何对下面的数字列表进行排序。如果没有,请解释为什么不能。 Iam应该使用MergeSort对数字列表进行排序。左半部分将使用快速排序进行排序? 我想出来了。安:是的,我们可以 使用mergeSort对数组的

  • 本文向大家介绍C#排序算法之堆排序,包括了C#排序算法之堆排序的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C#实现堆排序的具体代码,供大家参考,具体内容如下 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。