HashOperations 操作接口定义了怎样操作 Redis 的 hash 类型。在 RedisTemplate 中,可以通过 opsForHash() 方法获取该操作接口。代码如下:
HashOperations<String,String,String> ops = redisTemplate.opsForHash();
注意:HashOperations 泛型定义为 HashOperations<K,HK,HV>,其中:
K 用来指定存储到 Redis 中的键类型,如:k={k1:v1,k2:v2,...,kn:vn} 用来指定 k 的类型
HK 用来指定 HASH 中的 KEY 类型,如: k={k1:v1,k2:v2,...,kn:vn} 用来指定 k1、k2、...、kn 的类型
HV 用来指定 HASH 中的 VALUE 类型,如:k={k1:v1,k2:v2,...,kn:vn} 用来指定 v1、v2、...、vn 的类型
使用 put() 方法可以将一个 key-value 值设置到键的HASH中,方法定义如下:
void put(H key, HK hashKey, HV value) 将 hashKey 和 value 设置到键 key 的 hash
void putAll(H key, Map<? extends HK,? extends HV> m) 将指定的 Map 中所有的 Key-Value 设置到键 Key 的 hash
Boolean putIfAbsent(H key, HK hashKey, HV value) 仅当 hashKey 不存在时,才将 value 设置给键 key 中的 hashKey
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 写入一个 k-v 值 ops.put("hash-key", "key1", "value1"); // 写入多个 k-v 值 Map<String,String> multiKey = new HashMap<>(); multiKey.put("key2", "value2"); multiKey.put("key3", "value3"); ops.putAll("hash-key", multiKey); // 当 hashKey 不存在时,才写入 k-v 值 // key3 以及存在,修改失败 ops.putIfAbsent("hash-key", "key3", "value3-2"); ops.putIfAbsent("hash-key", "key4", "value4"); // 获取 hash 的所有值 Map<String,String> entries = ops.entries("hash-key"); for(Map.Entry<String,String> entry : entries.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); }
运行示例,输出结果:
key1=value1 key2=value2 key3=value3 key4=value4
使用 get() 方法获取 hash 中某个 key 的值,或者获取多个 key 的值。方法定义如下:
HV get(H key, Object hashKey) 从键的hash中获取 hashKey 对应的值
List<HV> multiGet(H key, Collection<HK> hashKeys) 从键的hash中获取 hashKeys 集合中指定的多个 key 的值
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); ops.put("hash-key", "key3", "value3"); ops.put("hash-key", "key4", "value4"); // 获取单个 key 的值 String value = ops.get("hash-key", "key2"); System.out.println("key2=" + value); // 获取多个 key 的值 List<String> values = ops.multiGet("hash-key", Arrays.asList("key1", "key3")); System.out.println(Arrays.toString(values.toArray()));
运行示例,输出结果:
key2=value2 [value1, value3]
使用 keys() 方法可以获取指定键的hash中所有的key,方法定义如下:
Set<HK> keys(H key) 获取指定键的hash的所有key
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); ops.put("hash-key", "key3", "value3"); ops.put("hash-key", "key4", "value4"); // 获取所有key Set<String> keySet = ops.keys("hash-key"); System.out.println(Arrays.toString(keySet.toArray()));
运行示例,输出结果:
[key1, key2, key3, key4]
使用 values() 方法可以获取指定键的hash中所有的值,方法定义如下:
List<HV> values(H key) 获取指定键的hash中的所有值
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); ops.put("hash-key", "key3", "value3"); ops.put("hash-key", "key4", "value4"); // 获取所有值 List<String> values = ops.values("hash-key"); System.out.println(Arrays.toString(values.toArray()));
运行示例,输出结果:
[value1, value2, value3, value4]
使用 delete() 方法可以从键的hash中删除某个键,方法定义如下:
Long delete(H key, Object... hashKeys) 从指定键的hash中删除 hashKeys 键值
示例:
List<String> values; HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); ops.put("hash-key", "key3", "value3"); ops.put("hash-key", "key4", "value4"); values = ops.multiGet("hash-key", Arrays.asList( "key1", "key2", "key3", "key4")); System.out.println(Arrays.toString(values.toArray())); // 删除 key2 和 key3 值 ops.delete("hash-key", "key2", "key3"); // 验证 values = ops.multiGet("hash-key", Arrays.asList( "key1", "key2", "key3", "key4")); System.out.println(Arrays.toString(values.toArray()));
运行示例,输出结果:
[value1, value2, value3, value4] [value1, null, null, value4]
当 hash 中存储的值为 double 或 long 时,我们可以使用 increment() 方法对这些值进行加 n 操作。方法定义如下:
Double increment(H key, HK hashKey, double delta) 对键的 hash 中 hashKey 的值添加 delta,delta 为 double 类型
Long increment(H key, HK hashKey, long delta) 对键的 hash 中 hashKey 的值添加 delta,delta 为 long 类型
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "1"); ops.put("hash-key", "key2", "2.1"); // 递增操作 ops.increment("hash-key", "key1", 10L); ops.increment("hash-key", "key2", 3.14D); // 获取值 System.out.println("key1=" + ops.get("hash-key", "key1")); System.out.println("key2=" + ops.get("hash-key", "key2"));
运行示例,输出结果:
key1=11 key2=5.24000000000000021
使用 hasKey() 方法可以判断某个 key 是否在指定键的 hash 中存在。方法定义如下:
Boolean hasKey(H key, Object hashKey) 确定给定的哈希 hashKey 是否存在。
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); Boolean flag = ops.hasKey("hash-key", "key2"); System.out.println("flag=" + flag); Boolean flag2 = ops.hasKey("hash-key", "key3"); System.out.println("flag2=" + flag2);
运行示例,输出结果:
flag=true flag2=false
使用 size() 方法可以获取指定键 hash 的大小,方法定义如下:
Long size(H key) 获取 key 对应 hash 的大小
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); Long size = ops.size("hash-key"); System.out.println("size=" + size);
运行示例,输出结果:
size=2
使用 entries() 方法获取指定键的的所有键值对,返回一个 Map 对象。方法定义如下:
Map<HK,HV> entries(H key) 将指定键的 hash 存储到 Map 对象
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); ops.put("hash-key", "key3", "value3"); ops.put("hash-key", "key4", "value4"); // 遍历hash Map<String,String> entries = ops.entries("hash-key"); for(Map.Entry<String,String> entry : entries.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); }
运行示例,输出结果:
key1=value1 key2=value2 key3=value3 key4=value4
使用 scan() 方法可以迭代键的HASH,方法定义如下:
Cursor<Map.Entry<HK,HV>> scan(H key, ScanOptions options) 使用 Cursor 迭代键的 HASH 中的条目
示例:
HashOperations<String,String,String> ops = redisTemplate.opsForHash(); // 准备数据 ops.put("hash-key", "key1", "value1"); ops.put("hash-key", "key2", "value2"); ops.put("hash-key", "ekey3", "value3"); ops.put("hash-key", "ekey4", "value4"); ops.put("hash-key", "ekey5", "value4"); // 扫描HASH ScanOptions scanOptions = ScanOptions.scanOptions() .match("e*").count(1).build(); Cursor<Map.Entry<String,String>> cursor = ops.scan("hash-key", scanOptions); while(cursor.hasNext()) { Map.Entry<String,String> entry = cursor.next(); System.out.println(entry.getKey() + "=" + entry.getValue()); }
运行示例,输出结果:
ekey3=value3 ekey4=value4 ekey5=value4