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