Spring Redis 排序键
Spring Redis sort keys
我在 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<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);
不工作。
我不知道spring数据redis。让我给你一个示例,以在朴素的 Redis 中实现这一点。假设您有哈希,其中包含 ID、名称和站点。我有一个代表该哈希键的列表。
我的结构如下:
lpush("Values",1);
hset("hash_1","id","1"),hset("hash_1","Name","C5796"),hset("hash_1","Site","DRG1")
for second hash
lpush("Values",2);
...
同样适用于您要在散列中设置的所有值。现在排序你这样做
SORT "Values" BY hash_*->id get hash_*->id get hash_*->name get hash_*->site
这将 return 您根据 id 升序排序哈希映射结果。同样,您可以为 names/site 做。有关在 redis 中排序的更多信息:http://redis.io/commands/sort
代码在post最后,如果熟悉redis多hset keys排序的原理,请跳过后面的内容,直接阅读代码。
Redis Sort旨在对List/Set/Zset中的字段进行排序,但此方法可用于根据我们想要的指定指标对多键进行排序。我们可以使用"sort"来按指定字段对多个hset keys进行排序,但是hset keys的模式有限制。
比如hset keys的pattern是"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;
}
}
运行ning 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}
我在 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<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);
不工作。
我不知道spring数据redis。让我给你一个示例,以在朴素的 Redis 中实现这一点。假设您有哈希,其中包含 ID、名称和站点。我有一个代表该哈希键的列表。
我的结构如下:
lpush("Values",1);
hset("hash_1","id","1"),hset("hash_1","Name","C5796"),hset("hash_1","Site","DRG1")
for second hash
lpush("Values",2);
...
同样适用于您要在散列中设置的所有值。现在排序你这样做
SORT "Values" BY hash_*->id get hash_*->id get hash_*->name get hash_*->site
这将 return 您根据 id 升序排序哈希映射结果。同样,您可以为 names/site 做。有关在 redis 中排序的更多信息:http://redis.io/commands/sort
代码在post最后,如果熟悉redis多hset keys排序的原理,请跳过后面的内容,直接阅读代码。
Redis Sort旨在对List/Set/Zset中的字段进行排序,但此方法可用于根据我们想要的指定指标对多键进行排序。我们可以使用"sort"来按指定字段对多个hset keys进行排序,但是hset keys的模式有限制。
比如hset keys的pattern是"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;
}
}
运行ning 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}