SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list

场景

SpringBoot中集成Redis实现对redis中数据的解析和存储:

SpringBoot中集成Redis实现对redis中数据的解析和存储_霸道流氓气质的博客-CSDN博客

在上面集成Redis并存取数据的基础上,下面记录两个特殊操作。

1、查询所有以指定前缀开头的key的数据并解析,比如这里是以card:card开头的数据。

 

2、查询并解析value值为对象数组的list。

SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_第1张图片

 

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、针对第一种类似于模糊搜索的情况,很多时候想到的是通过card:card*来实现

但是如果已经知道card:card后面所有可能的数据源的情况下,不建议使用*模糊搜索的情况去查询。

接上面的博客,可在redis工具类RedisCache中新增批量查询的方法

    public  List getCacheList(Set keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }

然后获取到所有可能后缀的集合调用该方法

    public List> getAllCarKeys(List carInfoList) {
        try {
            // 拼接所有car的rediskey 便于快速精准key查找redis缓存 获取card:card点位
            Set cardKeys = new HashSet<>();
            for (CarInfoPO carInfo : carInfoList) {
                cardKeys.add(RedisConstants.CARD_CARD + carInfo.getLocationNumber());
            }
            List> cards = redisCache.getCacheList(cardKeys);
            return cards;
        }catch (Exception exception){
            System.out.println("getAllCarKeys:异常:"+exception);
            return new ArrayList<>();
        }
    }

这里carInfoList就是所有可能后缀的集合,然后遍历拼接上所有可能的key,调用该

方法进行批量查询。

SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_第2张图片

 

这里所有可能的后缀的集合共有64条,但是redis中只有5条对应后缀的数据

SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_第3张图片

 

批量查询之后遍历进行解析为对象

    public Stream convertToCardDTOs(List> cards) {
        try {
            cards.removeAll(Collections.singletonList(null));
            cards.forEach(car -> car.remove("@type"));
            Stream 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 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 getPersonOnCar(String locationNumber) {
        try {
            List> cacheObject = redisCache.getCacheObject(RedisConstants.PERSON_ON_CAR + locationNumber);
            List 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<>();
        }
    }

解析结果

SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_第4张图片

 

附对象实现

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TEmployee {
    /** 员工编号  */
    private Long cardNumber;

    /** 员工姓名 */
    private String employeeName;

    /** 工种名称 */
    private String workTypeName;

}

你可能感兴趣的:(SpringBoot,redis,spring,boot,list)