Pipeline功能实现Redis批处理(项目批量查询点赞情况的应用)

在本项目中代码实现很简单,但因为第一次使用,所以专门写一下方便复习

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

  1. executePipelined方法内部将connection设置为管道模式

  2. connection仍然是同一个连接对象

  3. 但在管道模式下,命令不会立即发送,而是被缓存起来

  4. 当RedisCallback执行完毕后,所有缓存的命令一起发送

重点:

复制代码
调用 executePipelined()后管道开启,然后执行RedisCallback中的代码(收集所有的命令),收集完成后管道就自动关闭了
复制代码
管道自动关闭后,收集到的命令一次性发送给Redis服务器,服务器再批量执行命令,最后批量返回结果并存储到List<Objects>中

然后是对代码中return null;的解释:

null是RedisCallback函数的返回值,而我们所需要查询的数据在执行命令后就存储到List<Objects>中,以供后续使用

相关推荐
SelectDB21 分钟前
天翼云与飞轮科技达成战略合作,共筑云数融合新生态
大数据·数据库·数据分析
编程爱好者熊浪35 分钟前
RedisBloom使用
java
苇柠1 小时前
Spring框架基础(1)
java·后端·spring
yics.1 小时前
数据结构——栈和队列
java·数据结构
学习网安的doro1 小时前
3a服务器的基本功能1之身份认证
服务器·网络·学习·安全·身份认证·ac
Lovyk1 小时前
DNS 服务器
运维·服务器
望获linux1 小时前
【实时Linux实战系列】实时数据流处理框架分析
linux·运维·前端·数据库·chrome·操作系统·wpf
架构师沉默1 小时前
我用一个 Postgres 实现一整套后端架构!
java·spring boot·程序人生·架构·tdd
xiucai_cs1 小时前
布隆过滤器原理与Spring Boot实战
java·spring boot·后端·布隆过滤器
向阳花自开1 小时前
Spring Boot 常用注解速查表
java·spring boot·后端