Spring Data Redis 教程

HashOperations 操作接口

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]

获取HASH所有KEY

使用 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]

获取 hash 所有值

使用 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]

删除 hash 值

使用 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]

value 自增

当 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

判断 hash 是否存在 key

使用 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

获取 hash 的大小

使用 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

遍历 hash

使用 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

迭代 HASH

使用 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
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号