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