sql >> Databasteknik >  >> NoSQL >> Redis

Spring Redis sorteringsnycklar

Koden finns sist i inlägget, om du är bekant med principen om multi hset-nycklar sortera i redis, hoppa över följande innehåll och läs koden direkt.

Redis Sort syftar till att sortera fält inuti List/Set/Zset, men den här metoden kan användas för att sortera flera nycklar baserat på specificerad metrik vi vill ha. Vi kan använda "sortera" för att sortera flera hset-nycklar efter specificerat fält, men det finns begränsningar för mönstret för hset-nycklar.
Till exempel, om mönstret för hset-nycklar är "hash{i}"(i är en heltal), under detta villkor kan vi sortera det.

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

Ta en titt på innehållet i hash1:

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

Varje hash-nyckel innehåller två fält:"id", "namn". Om vi ​​vill sortera dessa hset-nycklar efter dess id. Vad ska vi göra?

Lägg först till en uppsättningsnyckel som heter "myset". "myset" är en uppsättningsnyckel som innehåller medlemmarna {"1", "2", "3"}.

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

Kör sedan följande kommando:

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, sortera hash{1-3} efter dess id.
Här är koden för att använda Spring Redis för att göra jobbet:

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

Resultat av att köra redisTemplateSort(redisTemplate) (som sorteras efter namn i koden) :

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}


  1. Mongo unika index okänslig för skiftläge

  2. MongoDB $toObjectId

  3. Stöder Spring Data Redis (1.3.2.RELEASE) JedisSentinelPool of jedis?

  4. Är det möjligt att få enstaka resultat sammanlagt?