sql >> Base de Datos >  >> NoSQL >> Redis

Claves de ordenación Spring Redis

El código se encuentra al final de la publicación, si está familiarizado con el principio de ordenación de claves multi hset en redis, omita el siguiente contenido y lea directamente el código.

Redis Sort tiene como objetivo ordenar los campos dentro de List/Set/Zset, pero este método se puede usar para ordenar varias claves en función de la métrica específica que queremos. Podemos usar "ordenar" para ordenar varias claves de hset por campo específico, pero existe una limitación sobre el patrón de las claves de hset.
Por ejemplo, si el patrón de las claves de hset es "hash{i}"(i es un entero), bajo esta condición podemos ordenarlo.

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

Echa un vistazo al contenido de hash1:

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

Cada clave hash contiene dos campos:"id", "nombre". Si queremos ordenar estas claves hset por su id. ¿Qué debemos hacer?

Primero, agregue una clave establecida llamada "myset". "myset" es una clave de conjunto que contiene los miembros {"1", "2", "3"}.

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

Luego ejecute el siguiente 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, ordene hash{1-3} por su id.
Aquí está el código para usar Spring Redis para hacer el trabajo:

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

Resultado de ejecutar redisTemplateSort(redisTemplate) (como ordenar por nombre en el código):

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}