概要
Redis的哈希操作multiGet()来从Redis中批量获取多个键对应的值
例如:
获取当前角色放在缓存的菜单列表。
整体架构流程
- 使用
hashOps.multiGet()
方法从Redis中批量获取CommonConstant.ROLE_MENU_PERMISSIONS
键对应的值。 sysRoleIds.stream().map(String::valueOf).collect(Collectors.toSet())
这部分代码是将sysRoleIds
列表中的每个元素转换为字符串,并使用Collectors.toSet()
方法将其收集到一个Set
集合中。这个Set
集合用于作为multiGet()
方法的参数,表示要获取哪些键对应的值。- 获取到的结果会存储在
List<List<MenuDataItemVo>>
类型的变量roleMenuIds
中,其中每个内部列表表示一个角色对应的菜单权限。
代码片段:
/**
* 从缓存中获取角色绑定的菜单
* @param sysRoleIds
* @return
*/
private List<MenuDataItemVo> listRoleMenuIdByCache(Set<Long> sysRoleIds) {
HashOperations<String, String, List<MenuDataItemVo>> hashOps = redisTemplate.opsForHash();
List<List<MenuDataItemVo>> roleMenuIds
= hashOps.multiGet(CommonConstant.ROLE_MENU_PERMISSIONS, sysRoleIds.stream().map(String::valueOf)
.collect(Collectors.toSet()));
// 对结果进行处理,将 List<List<Integer>> 转为 List<Integer>
return roleMenuIds.stream()
.filter(p -> !CollectionUtils.isEmpty(p))
.flatMap(List::stream).collect(Collectors.toList());
}
技术细节
假设我们有以下角色ID列表和对应的菜单权限:
List<String> sysRoleIds = Arrays.asList("1", "2", "3");
我们假设在Redis中有一个名为ROLE_MENU_PERMISSIONS
的哈希表,其中存储了每个角色对应的菜单权限。假设这个哈希表的结构如下:
Key: ROLE_MENU_PERMISSIONS
Field: "1" Value: [1, 2, 3]
Field: "2" Value: [4, 5, 6]
Field: "3" Value: []
现在,让我们来解释这段代码的逻辑:
-
使用
hashOps.multiGet()
方法从Redis中批量获取角色ID对应的菜单权限。这里会根据sysRoleIds
列表中的元素,即["1", "2", "3"]
,去Redis中获取对应的值。 -
获取到的结果将会是一个
List<List<MenuDataItemVo>>
类型的roleMenuIds
变量。在上述例子中,roleMenuIds
将会是以下列表:
[[MenuDataItemVo(id=1), MenuDataItemVo(id=2), MenuDataItemVo(id=3)], [MenuDataItemVo(id=4), MenuDataItemVo(id=5), MenuDataItemVo(id=6)], []]
3.接下来,代码会对结果进行处理。首先使用stream()
方法将roleMenuIds
转换为流(Stream)对象。
4.然后使用filter()
方法过滤掉空的菜单权限列表。在上述例子中,第三个列表是空的,所以会被过滤掉。
5.使用flatMap()
方法将每个内部列表展平为一个流(Stream)对象。在上述例子中,flatMap()
方法会将前两个列表展平为一个包含所有菜单权限的流。
6.最后,使用collect()
方法将流中的元素收集到一个List<Integer>
类型中。在上述例子中,最终返回的结果是:
[1, 2, 3, 4, 5, 6]
小结
总结起来,这段代码的作用是从Redis中获取一组角色对应的菜单权限,并将其转换为一个扁平化的整数列表返回。在上述例子中,返回的结果是包含所有菜单权限的列表。