场景

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&gt;&gt; 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;

}

原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/129896929

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50463.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注