Operaciones con hashes en Redis usando RedisTemplate y HashOperations

private RedisTemplate<String, Object> redis;
private HashOperations<String, String, Object> hashOps;

@Before
public void setup() {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-redis.xml");
    redis = ctx.getBean("redisTemplate", RedisTemplate.class);
    hashOps = redis.opsForHash();
}

put(H key, HK hashKey, HV value)

Almacena un campo individual dentro de un hash. Si el campo ya existe, su valor se sobrescribe.

@Test
public void escribirCamposSueltos() {
    hashOps.put("perfil:100", "nombre", "Ana");
    hashOps.put("perfil:100", "rol", "admin");
    hashOps.put("perfil:100", "activo", true);

    Map<String, Object> resultado = hashOps.entries("perfil:100");
    System.out.println(resultado);
}

entries(H key)

Recupera todos los campos y valores del hash en forma de Map. El orden de los elementos no está garantizado.

putAll(H key, Map<? extends HK, ? extands HV> map)

Permite insertar varios pares campo/valor en una sola llamada, resultando útil para poblar un hash a partir de un mapa existente.

@Test
public void escribirMapaCompleto() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("sku", "ABC-123");
    datos.put("stock", 50);
    datos.put("precio", 19.99);

    hashOps.putAll("producto:1", datos);
    System.out.println(hashOps.entries("producto:1"));
}

delete(H key, Object... hashKeys)

Elimina uno o varios campos del hash indicado. Devuelve la cantidad de campos eliminados.

@Test
public void borrarCampos() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("marca", "Acme");
    datos.put("modelo", "X1");
    datos.put("anio", 2023);

    hashOps.putAll("vehiculo:10", datos);
    System.out.println(hashOps.entries("vehiculo:10"));

    hashOps.delete("vehiculo:10", "modelo");
    System.out.println(hashOps.entries("vehiculo:10"));
}

hasKey(H key, Object hashKey)

Verifica si un campo concreto existe dentro del hash.

@Test
public void comprobarExistenciaCampo() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("email", "ana@example.com");
    datos.put("telefono", "555-1234");

    hashOps.putAll("contacto:1", datos);

    System.out.println(hashOps.hasKey("contacto:1", "email"));
    System.out.println(hashOps.hasKey("contacto:1", "direccion"));
}

get(H key, Object hashKey)

Obtiene el valor de un único campo. Si el campo no existe, devuelve null.

@Test
public void leerCampoUnico() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("pais", "España");
    datos.put("ciudad", "Madrid");

    hashOps.putAll("ubicacion:5", datos);

    System.out.println(hashOps.get("ubicacion:5", "ciudad"));
    System.out.println(hashOps.get("ubicacion:5", "cp"));
}

multiGet(H key, Collection<HK> hashKeys)

Recupera los valores de varios campos simultáneamente, respetando el orden de la colección solicitada. Para campos inexistentes se devuelve null en su posición correspondiente.

@Test
public void leerMultiplesCampos() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("rojo", 10);
    datos.put("verde", 20);
    datos.put("azul", 30);

    hashOps.putAll("inventario:colores", datos);

    List<String> campos = Arrays.asList("rojo", "amarillo", "verde");
    System.out.println(hashOps.multiGet("inventario:colores", campos));
}

increment(H key, HK hashKey, long delta) e increment(H key, HK hashKey, double delta)

Incrementa numéricamente el valor de un campo. Existen dos variantes: una para enteros y otra para valores decimales. Si el valor del campo no es numérico, se produce un error.

@Test
public void incrementarValores() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("etiqueta", "promocion");
    datos.put("visitas", 100);

    hashOps.putAll("estadistica:1", datos);

    System.out.println(hashOps.increment("estadistica:1", "visitas", 5));
    System.out.println(hashOps.increment("estadistica:1", "visitas", 2.5));

    try {
        hashOps.increment("estadistica:1", "etiqueta", 1);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

keys(H key)

Devuelve un conjunto con los nombres de todos los campos del hash.

@Test
public void listarClavesHash() {
    redis.delete("config:app");

    Map<String, Object> datos = new LinkedHashMap<>();
    datos.put("timeout", 30);
    datos.put("retries", 3);
    datos.put("debug", false);

    hashOps.putAll("config:app", datos);
    System.out.println(hashOps.keys("config:app"));
}

size(H key)

Retorna el número total de campos contenidos en el hash.

@Test
public void contarCampos() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("host", "localhost");
    datos.put("port", 6379);
    datos.put("db", 0);
    datos.put("ssl", false);

    hashOps.putAll("conexion:redis", datos);
    System.out.println(hashOps.size("conexion:redis"));
}

putIfAbsent(H key, HK hashKey, HV value)

Asigna un valor solo si el campo no existe previamente. Devuelve true cuando realiza la inserción y false si el campo ya estaba presente.

@Test
public void escribirSiNoExiste() {
    System.out.println(hashOps.putIfAbsent("cache:token", "usuario:1", "abc123"));
    System.out.println(hashOps.putIfAbsent("cache:token", "usuario:1", "xyz789"));
}

values(H key)

Obtiene la lista de todos los valores almacenados en el hash, sin incluir los nombres de campo.

@Test
public void listarValoresHash() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("lunes", 8);
    datos.put("martes", 7);
    datos.put("miercoles", 9);

    hashOps.putAll("horas:semana:1", datos);
    System.out.println(hashOps.values("horas:semana:1"));
}

scan(H key, ScanOptions options)

Itera sobre los campos del hash de forma progresiva mediante un cursor, evitando bloquear el servidor con operaciones masivas.

@Test
public void recorrerConCursor() {
    Map<String, Object> datos = new HashMap<>();
    datos.put("a", 1);
    datos.put("b", 2);
    datos.put("c", 3);

    hashOps.putAll("metricas:sensor", datos);

    Cursor<Map.Entry<String, Object>> cursor =
            hashOps.scan("metricas:sensor", ScanOptions.NONE);

    while (cursor.hasNext()) {
        Map.Entry<String, Object> entry = cursor.next();
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
}

Etiquetas: Redis Spring Data Redis HashOperations redistemplate Spring Framework

Publicado el 7-9 20:13