这节记录下Redis的Hash操作。主要是opsForHash方式和boundHashOps方式。
boundHashOps
和opsForHash
都是Spring Data Redis中用于操作Redis哈希数据结构的方法,但它们在使用方式和场景上存在一些区别。
boundHashOps
-
使用方式:
boundHashOps
方法通过RedisTemplate的boundHashOps(String key)
方法获取一个BoundHashOperations
实例。这个实例与特定的哈希键(key)绑定,使得后续的操作都是针对这个特定的哈希键进行的。- 这种方式使得操作更加直观和方便,因为一旦绑定了哈希键,就可以通过BoundHashOperations实例提供的方法直接对这个哈希键下的数据进行操作,而无需在每次操作中都指定哈希键。
-
适用场景:
- 当需要对某个特定的哈希键进行频繁的操作时,使用
boundHashOps
可以简化代码,提高开发效率。
- 当需要对某个特定的哈希键进行频繁的操作时,使用
opsForHash
-
使用方式:
opsForHash
方法通过RedisTemplate的opsForHash()
方法获取一个HashOperations
实例。这个实例不是与特定的哈希键绑定的,而是可以直接用于操作Redis中的所有哈希数据结构。- 在进行哈希操作时,需要显式地指定哈希键和字段名。
-
适用场景:
- 当需要在多个哈希键之间进行操作,或者操作的哈希键不是固定的时,使用
opsForHash
可能更加灵活。
- 当需要在多个哈希键之间进行操作,或者操作的哈希键不是固定的时,使用
区别总结
boundHashOps | opsForHash | |
---|---|---|
使用方式 | 通过RedisTemplate的boundHashOps(String key)方法获取与特定哈希键绑定的BoundHashOperations实例 | 通过RedisTemplate的opsForHash()方法获取可以直接操作所有哈希数据结构的HashOperations实例 |
操作对象 | 特定哈希键下的数据 | Redis中的所有哈希数据结构 |
操作便捷性 | 对特定哈希键的操作更加直观和方便,无需每次操作都指定哈希键 | 需要在每次操作中显式指定哈希键和字段名,但在操作多个哈希键时更加灵活 |
适用场景 | 对某个特定的哈希键进行频繁操作时更加适用 | 在多个哈希键之间进行操作,或者操作的哈希键不是固定时更加适用 |
在实际开发中,可以根据具体的需求和场景选择合适的方法来操作Redis中的哈希数据结构。
@PostMapping("/hash")
public void save(){
List<Student> list = studentService.list();
//通过boundHashOps进行hash方式数据处理,保存数据
BoundHashOperations<String,String,String> boundHashOperations = stringRedisTemplate.boundHashOps("studentList");
for(Student s:list){
boundHashOperations.put(String.valueOf(s.getId()),JSONUtil.toJsonStr(s));
}
//通过opsForHash进行hash方式数据处理,保存数据
HashOperations operations = stringRedisTemplate.opsForHash();
for(Student student:list){
operations.put("studentList",String.valueOf(student.getId()),JSONUtil.toJsonStr(student));
}
}
@DeleteMapping("/hash")
public void delete(){
List<Student> li = studentService.list();
//通过boundHashOps进行hash方式数据处理,删除指定key数据下的某个数据
BoundHashOperations<String,String,String> boundHashOperations = stringRedisTemplate.boundHashOps("studentList");
boundHashOperations.delete("10");
//通过opsForHash进行hash方式数据处理,删除指定key数据下的某个数据
stringRedisTemplate.opsForHash().delete("studentList","10");
//删除整个key数据
stringRedisTemplate.delete("studentList");
}
}
通过上面的2种方式我们可以看到,其实方法差不多,只是一个每次操作都要带上哈希键名,一个不需要。