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>中,以供后续使用

相关推荐
xieliyu.4 分钟前
【JavaEE进阶】Spring Boot 日志:从 System.out 到 @Slf4j,6 个级别 + 4 类配置一篇讲透
java·spring boot·spring·java-ee·springboot·logback·slf4j
虚无的纽扣15 分钟前
【Linux】线程互斥:多线程改同一个变量,到底会出什么问题
linux·服务器·1024程序员节
lazy H21 分钟前
【计算机网络】第 5 篇:TCP 和 UDP 有什么区别?从 Java 后端场景理解两种传输协议
经验分享·后端·网络协议·tcp/ip·计算机网络·1024程序员节
程序员塔塔喵24 分钟前
【Redis进阶篇|第十四篇】redis构建全局唯一ID
redis·全局唯一id
东宇科技30 分钟前
crmeb开源版本安装步骤2026-10-20
后端·php·crmeb
l1t37 分钟前
在windows中测试musql数据库
数据库·sqlite·go·1024程序员节
IT_Octopus41 分钟前
Apollo 配置中心入门:一所“小学校“读懂 Portal、Meta Server、Config Service
java·后端·spring
cfm_291443 分钟前
偏向锁的Epoch优化机制
java
小南家的青蛙44 分钟前
华为云DCS全产品对比
redis·1024程序员节
深圳市恒星物联科技有限公司1 小时前
排水管网监测后期运维成本高吗?成本构成与控制策略分析
运维·缓存