2016-02-25 3 views
5

Ich habe die folgenden Schlüssel in Redis (Spring Data Redis),Frühling Redis Sortierschlüssel

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

Wenn ich sortieren möchten nach id/name/site, wie kann ich tun es in Spring Redis?

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

und

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

funktionieren nicht.

+0

Ich will nur erwähnen, die Schlüssel sind Hash-Operationen. localhost> HKeys Kunden "1+ {\" _ id ":" 1" , \ "Name \": \ "C5796 \", \ "Site \": \ "DRG1 \"} " " 2 + { "_ id": "2", "Name": "CX1XE", "Site": "DG1"} " " 3+ {"id": "3", " Name \ ": \" C553 \ ", \" Site \ ": \" DG1 \ "}" – ashK

Antwort

2

Der Code ist auf der letzten der Post, wenn Sie mit dem Prinzip der Multi-hset-Schlüssel in redis sortieren, überspringe den folgenden Inhalt und direkt den Code lesen.

Redis Sort soll Felder in List/Set/Zset sortieren, aber diese Methode kann verwendet werden, um Multi-Keys basierend auf der angegebenen Metrik zu sortieren. Wir können "sort" verwenden, um Multi-hset-Schlüssel nach dem angegebenen Feld zu sortieren, aber es gibt Einschränkungen bezüglich des Musters der hset-Schlüssel.
Wenn beispielsweise das Muster der hset-Schlüssel "hash {i}" ist (i ist eine ganze Zahl), können wir sie unter dieser Bedingung sortieren.

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

einen Blick auf den Inhalt von hash1 Nehmen:

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

Jeder Hash-Schlüssel enthält zwei Felder: "id", "name". Wenn wir diese hset-Schlüssel nach ihrer ID sortieren wollen. Was sollen wir machen ?

Fügen Sie zuerst einen Set-Schlüssel mit dem Namen "myset" hinzu. "Myset" ist ein Set-Schlüssel, der die Mitglieder {"1", "2", "3"} enthält.

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

anschließend den folgenden Befehl ausgeführt werden:

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, sort hash {1-3} durch seine ID.Hier
ist der Code of Spring Redis mit der Arbeit zu tun:

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; 
    } 
} 

Ergebnis redisTemplateSort(redisTemplate) läuft (wie sortiert nach Namen im Code):

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

Danke, ich arbeite gerade an spark und sobald ich fertig bin, muss ich wieder hierher kommen. Will überprüfen und akzeptieren Antwort – ashK

+0

@ sel-fish gibt es eine Möglichkeit zum Drucken/get Name des Schlüssels (wie hash1) in o/p "SORT myset BY Hash * -> ID GET Hash * -> ID GET Hash * - > Name "? – Bharat

2

Ich weiß nicht über Federdaten Redis. Lassen Sie mich Ihnen eine Probe geben, um dies in naiven Redis zu erreichen. Lassen Sie uns sagen, Sie haben Hash, die ID, Name und Site hat. und ich habe eine Liste, die die Schlüssel dieses Hashes darstellt.

Meine Struktur wie:

lpush("Values",1); 


hset("hash_1","id","1"),hset("hash_1","Name","C5796"),hset("hash_1","Site","DRG1") 

for second hash 
lpush("Values",2); 
... 

Ebenso für alle Werte, die Sie in Hash festlegen möchten. Jetzt für die Sortierung gefällt Ihnen diese

SORT "Values" BY hash_*->id get hash_*->id get hash_*->name get hash_*->site 

diese kehren Sie sortiert Hashmaps aufsteigend auf ID-Ergebnis basiert. Ähnlich können Sie für Namen/Site tun. Weitere Informationen über die Sortierung in redis: http://redis.io/commands/sort