场景
SpringBoot中集成Redis实现对redis中数据的解析和存储:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/129853784
在上面集成Redis并存取数据的基础上,下面记录两个特殊操作。
1、查询所有以指定前缀开头的key的数据并解析,比如这里是以card:card开头的数据。
2、查询并解析value值为对象数组的list。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
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; }