在本项目中代码实现很简单,但因为第一次使用,所以专门写一下方便复习
java
@Override
public Set<Long> isBizLiked(List<Long> bizIds) {
// 1.获取登录用户id
Long userId = UserContext.getUser();
// 2.查询点赞状态
List<Object> objects = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
//将通用的Redis连接对象转换为专门处理字符串类型的Redis连接对象
StringRedisConnection src = (StringRedisConnection) connection;
for (Long bizId : bizIds) {
String key = RedisConstants.LIKES_BIZ_KEY_PREFIX + bizId;
src.sIsMember(key, userId.toString());
}
return null;
});
// 3.返回结果
return IntStream.range(0, objects.size()) // 创建从0到集合size的流
.filter(i -> (boolean) objects.get(i)) // 遍历每个元素,保留结果为true的角标i
.mapToObj(bizIds::get)// 用角标i取bizIds中的对应数据,就是点赞过的id
.collect(Collectors.toSet());// 收集
}

在截图所示的代码中,用到了redis管道工具
整体理一遍:
首先调用executePipelined
-
executePipelined方法内部将connection设置为管道模式
-
connection仍然是同一个连接对象
-
但在管道模式下,命令不会立即发送,而是被缓存起来
-
当RedisCallback执行完毕后,所有缓存的命令一起发送
重点:
调用 executePipelined()后管道开启,然后执行RedisCallback中的代码(收集所有的命令),收集完成后管道就自动关闭了
管道自动关闭后,收集到的命令一次性发送给Redis服务器,服务器再批量执行命令,最后批量返回结果并存储到List<Objects>中
然后是对代码中return null;的解释:
null是RedisCallback函数的返回值,而我们所需要查询的数据在执行命令后就存储到List<Objects>中,以供后续使用