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

场景

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

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

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

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

 

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

 

注:

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

实现

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;

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道流氓气质

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值