场景
SpringBoot中集成Redis实现对redis中数据的解析和存储:
在上面集成Redis并存取数据的基础上,下面记录两个特殊操作。
1、查询所有以指定前缀开头的key的数据并解析,比如这里是以card:card开头的数据。
2、查询并解析value值为对象数组的list。
实现
1、针对第一种类似于模糊搜索的情况,很多时候想到的是通过card:card*来实现
但是如果已经知道card:card后面所有可能的数据源的情况下,不建议使用*模糊搜索的情况去查询。
接上面的博客,可在redis工具类RedisCache中新增批量查询的方法
public <T> List<T> getCacheList(Set keys) {
return redisTemplate.opsForValue().multiGet(keys);
}
然后获取到所有可能后缀的集合调用该方法
public List<Map<String, Object>> getAllCarKeys(List<CarInfoPO> carInfoList) {
try {
// 拼接所有car的rediskey 便于快速精准key查找redis缓存 获取card:card点位
Set<String> cardKeys = new HashSet<>();
for (CarInfoPO carInfo : carInfoList) {
cardKeys.add(RedisConstants.CARD_CARD + carInfo.getLocationNumber());
}
List<Map<String, Object>> cards = redisCache.getCacheList(cardKeys);
return cards;
}catch (Exception exception){
System.out.println("getAllCarKeys:异常:"+exception);
return new ArrayList<>();
}
}
这里carInfoList就是所有可能后缀的集合,然后遍历拼接上所有可能的key,调用该
方法进行批量查询。
这里所有可能的后缀的集合共有64条,但是redis中只有5条对应后缀的数据
批量查询之后遍历进行解析为对象
public Stream<CardDTO> convertToCardDTOs(List<Map<String, Object>> cards) {
try {
cards.removeAll(Collections.singletonList(null));
cards.forEach(car -> car.remove("@type"));
Stream<CardDTO> cardDTOStream = JSON.parseArray(JSON.toJSONString(cards), CardDTO.class)
.stream();
return cardDTOStream;
}catch (Exception exception){
System.out.println("convertToCardDTOs异常:"+exception.getMessage());
return Stream.of();
}
}
附对象实现
@Data
public class CardDTO {
private Long cardNumber;
private double x;
private double y;
}
2、解析对象list的集合
redis中存储的数据如上面图中所示为对象的list
在存储时的操作为
List<TEmployee> persons = getPersonOnCar(key, car, loc);
if (persons.size() == 0) {
continue;
} else {
redisService.opsForValue().set(RedisPTConstants.PersonOnCar + key, persons, Long.parseLong(expireTime), TimeUnit.SECONDS);
}
其中redisService为RedisTemplate
那么在解析数据时
public List<TEmployee> getPersonOnCar(String locationNumber) {
try {
List<Map<String, Object>> cacheObject = redisCache.getCacheObject(RedisConstants.PERSON_ON_CAR + locationNumber);
List<TEmployee> personOnCarList = new LinkedList<>();
if (StringUtils.isNull(cacheObject)) {
return personOnCarList;
} else {
cacheObject.forEach(map ->
{
map.remove("@type");
personOnCarList.add(JSON.parseObject(JSON.toJSONString(map), TEmployee.class));
});
return personOnCarList;
}
}catch (Exception exception){
System.out.println("getPersonOnCar异常:"+exception.getMessage());
return new ArrayList<>();
}
}
解析结果
附对象实现
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TEmployee {
/** 员工编号 */
private Long cardNumber;
/** 员工姓名 */
private String employeeName;
/** 工种名称 */
private String workTypeName;
}