2016-02-25 46 views
5

我在Redis的(春季数据Redis的)下列键,春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); 

不工作。

+0

只想提,密钥是散列操作。 localhost> HKeys Customer “1+ {\”_ id“:”1“,\”Name \“:\”C5796 \“,\”Site \“:\”DRG1 \“}” “ \“_id”:“2”,\“Name \”:\“CX1XE \”,\“Site \”:\“DG1 \”}“ ”3+ {\“_ id”:“3”名称\“:\”C553 \“,\”网站\“:\”DG1 \“}” – ashK

回答

2

如果您熟悉redis中多重hset键排序的原理,则跳过以下内容并直接读取代码,该代码位于最后的帖子中。

Redis Sort旨在对List/Set/Zset中的字段进行排序,但此方法可用于基于指定的度量标准对多个键进行排序。我们可以使用“排序”按指定的字段排序多个hset键,但hset键的模式有限制。
例如,如果hset键的模式是“hash {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”, “姓名”。如果我们想通过它的id对这些hset键进行排序。我们应该做什么 ?

首先,添加一个名为“myset”的设置密钥。 “myset”是包含成员{“1”,“2”,“3”}的集合键。通过它的id

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" 

尤里卡,排序散列{1-3}:

127.0.0.1:6379> smembers myset 
1) "1" 
2) "2" 
3) "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} 
+0

谢谢,我目前正在研究火花,一旦完成,我必须回到这里。将检查并接受回答 – ashK

+0

@ sel-fish有没有办法在/ o/p中打印/获取密钥的名称(如hash1)“SORT myset BY hash * - > id GET hash * - > id GET hash * >名称“? – Bharat

2

我不知道弹簧数据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 

这将返回您升序排序hashmaps结果基于id。同样你可以做名字/网站。有关在redis中排序的更多信息:http://redis.io/commands/sort