使用RedissonClient的管道模式批量查询key

1.场景

遇到了一个场景,在客户给我们推送的数据中,咋1分钟左右,会有相同车辆vehicle 和时间 gpstime一样的数据,这类数据呢,我们认为是重复数据,需要过滤的
把相同 vehicle 和 gpstime 作为key存入到redis中,过期时间为1分钟,当推送过来数据时,查询一下redis中是否有值,有则过滤
推送过来的数据呢,是批量,所以我们要批量获取key的操作,在这儿记录下操作过程

2.引入注解@Resource

@Resource
    private RedissonClient redissonClient;

3.引入redisson的依赖

<!--redisson-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.14.1</version>
        </dependency>

4.推送的数据格式是json数组

JSONArray params

Map<String, RFuture<Object>> objectObject = new HashMap<>();
            params.forEach(json -> {
                try {
                    JSONObject jsonObjectBean = JSON.parseObject(JSON.toJSONString(json));
                    String gpsTime = jsonObjectBean.getString("lastDeviceTime");
                    String vehicleNo = jsonObjectBean.getString("vehicleNo");
                    String redisKey = "gps:mita:vehicle:gpstime:" + vehicleNo + ":" + gpsTime;
                    objectObject.put(redisKey, redissonClient.getBucket(redisKey).getAsync());
                } catch (Exception e) {
                    log.error("mita推送单个车辆信息异常(redis操作)=", e);
                }
            });

标记哪些是新增数据,那些是更新(已经存在的数据)
key对应的value给个1就行了,数据量小,不占内存

Map<String, Object> addDataMap = new HashMap<>();
            Map<String, Object> updateDataMap = new HashMap<>();
            for (String key : objectObject.keySet()) {
                Object value = objectObject.get(key).get();
                if (value == null) {
                    // redis中不存在
                    addDataMap.put(key, "1");
                } else {
                    // redis中已存在
                    updateDataMap.put(key, value);
                }
            }
// 开启批处理
            RBatch batch = redissonClient.createBatch();
            for (String redisKey : addDataMap.keySet()) {
                batch.getBucket(redisKey).setAsync(addDataMap.get(redisKey), 1, TimeUnit.MINUTES);
            }
            for (String redisKey : updateDataMap.keySet()) {
                batch.getBucket(redisKey).expireAsync(1, TimeUnit.MINUTES);
            }
            // 执行批处理
            batch.execute();
params.forEach(json -> {
JSONObject jsonObjectBean = JSON.parseObject(JSON.toJSONString(json));
String vehicleNo = jsonObjectBean.getString("vehicleNo");
String gpsTime = jsonObjectBean.getString("lastDeviceTime");
                        String redisKey = "gps:mita:vehicle:gpstime:" + vehicleNo + ":" + gpsTime;
if ("1".equals(addDataMap.get(redisKey))){
// 这里面就是新增的数据了(需要的),updateDataMap 里面是需要过滤的数据
}
  });

学会使用redis的管道模式来批量处理key了吗

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值