当前位置: 首页 > news >正文

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

1.场景

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

2.引入注解@Resource

@Resourceprivate 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了吗

http://www.lryc.cn/news/367391.html

相关文章:

  • UR机器人通信汇总
  • AI学习指南机器学习篇-使用ID3算法构建决策树
  • React实战(一)初始化项目、配置router、redux、axios
  • 高质量 HarmonyOS 权限管控流程
  • java里面封装https请求工具类2
  • 前端面试题日常练-day59 【面试题】
  • 计算机小问题(4)--关闭联想电脑的小组件
  • mac无法读取windows分区怎么办 苹果硬盘怎么读取
  • 【设计模式】JAVA Design Patterns——State(状态模式)
  • Docker搭建可道云
  • 【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合
  • test 判断字符串不为空
  • Python数据分析I
  • Qt5/6使用SqlServer用户连接操作SqlServer数据库
  • [经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展
  • 数据挖掘--分类
  • 数据结构篇其六-串
  • 队列和栈的实现
  • lua vm 五: upvalue
  • React Native中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据
  • java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常
  • 深入了解反射
  • 5、搭建前端项目
  • LLM之Agent初探
  • 目录穿越漏洞CVE-2018-7171复现 又学到一招小技巧!!!!
  • 代码随想录算法训练营day41
  • 从0~1开发财务软件
  • Python实现连连看9
  • 项目验收总体计划书(实际项目验收原件参考Word)
  • C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字