Redis
 sql >> Database >  >> NoSQL >> Redis

Chiavi di ordinamento Redis di primavera

Il codice si trova nell'ultimo post, se hai familiarità con il principio delle chiavi multi hset ordina in redis, salta il seguente contenuto e leggi direttamente il codice.

Redis Sort ha lo scopo di ordinare i campi all'interno di List/Set/Zset, ma questo metodo può essere utilizzato per ordinare più chiavi in ​​base alla metrica specificata che desideriamo. Possiamo usare "sort" per ordinare più chiavi hset in base al campo specificato, ma c'è una limitazione sullo schema delle chiavi hset.
Ad esempio, se lo schema delle chiavi hset è "hash{i}"(i è un intero), in questa condizione possiamo ordinarlo.

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

Dai un'occhiata al contenuto di hash1:

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

Ogni chiave hash contiene due campi:"id", "name". Se vogliamo ordinare queste chiavi hset in base al suo id. Cosa dobbiamo fare?

Innanzitutto, aggiungi una chiave set denominata "myset". "myset" è una chiave set che contiene i membri {"1", "2", "3"}.

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

Quindi esegui il seguente comando:

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, ordina l'hash{1-3} in base al suo ID.
Ecco il codice per utilizzare Spring Redis per eseguire il lavoro:

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

Risultato dell'esecuzione di redisTemplateSort(redisTemplate) (come ordina per nome nel codice) :

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}