我在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 / name / site进行排序,我该如何在Spring Redis中进行排序?
List
和,
SortQuery
不工作.
最佳答案
代码位于帖子的最后,如果您熟悉redis中多个hset键排序的原理,请跳过以下内容并直接阅读代码.
原文链接:https://www.f2er.com/spring/432804.htmlRedis 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”的set键. “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
运行redisTemplateSort(redisTemplate)的结果(在代码中按名称排序):
hash0 : {"_id": 0,"Name": 59,"Site",60}
hash1 : {"_id": 1,"Name": 37,57}
hash2 : {"_id": 2,"Name": 6,40}
hash3 : {"_id": 3,"Name": 91,58}
hash4 : {"_id": 4,"Name": 39,32}
hash5 : {"_id": 5,"Name": 27,82}
hash6 : {"_id": 6,"Name": 43,10}
hash7 : {"_id": 7,"Name": 17,55}
hash8 : {"_id": 8,"Name": 14,91}
hash9 : {"_id": 9,91}
{"_id": 40,2}
{"_id": 91,8}
{"_id": 55,7}
{"_id": 82,5}
{"_id": 57,1}
{"_id": 32,4}
{"_id": 91,9}
{"_id": 10,6}
{"_id": 60,0}
{"_id": 58,3}