SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法

news2024/11/15 9:39:28

场景

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

SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_霸道流氓气质的博客-CSDN博客

在上面讲操作redis中特殊操作时,对于通过key的集合批量查询所使用的工具方法,不能实现

通用对象适配,下面进行修改。

应用场景是所有业务数据会存储在mysql数据库中,使用redis作为msyql数据库的缓存。

但是redis中有的数据不一定全覆盖mysql中的数据。

那么在redis中进行缓存时会使用mysql中某个字段作为唯一标识缓存到redis中,将唯一标识作为

redis的key,那么如何通过所有可能的key的集合在redis中批量查询所有存在的key,并将value数据

进行解析为对应的对象。

比如以下两个redis中存储的数据

适用对象1

 

适用对象2

 

注:

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

实现

1、抽离公共操作redis的方法类

package com.badao.demo.utils;

import com.alibaba.fastjson.JSON;
import com.badao.demo.constant.RedisConstants;
import com.badao.demo.entity.*;
import com.ruoyi.common.core.domain.reportmanagement.BusCarEcu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 公共服务工具类
 */
@Component
public class CommonServiceUtils {


    @Autowired
    private  RedisCache redisCache;


    /**
     * 通过所有可能的key从redis中获取存在的key
     * @param allKeys
     * @return
     */
    public  List<Map<String, Object>> getExistKeys(Set<String> allKeys) {
        try {
            List<Map<String, Object>> keys = redisCache.getCacheList(allKeys);
            return keys;
        }catch (Exception exception){
            System.out.println("getExistKeys:异常:"+exception);
            return new ArrayList<>();
        }
    }

    /**
     * 数据转换为实体
     * @param
     * @return
     */
    public  Stream<Object> convertToDTOs(List<Map<String, Object>> objects) {
        try {
            objects.removeAll(Collections.singletonList(null));
            objects.forEach(car -> {
                    car.remove("@type");
                    if(car.containsKey("params")){
                        car.remove("params");
                        }
                    }
            );
            Stream<Object> objectStream = JSON.parseArray(JSON.toJSONString(objects), Object.class)
                    .stream();
            return objectStream;
        }catch (Exception exception){
            System.out.println("convertToDTOs异常:"+exception.getMessage());
            return Stream.of();
        }
    }
}

一个方法是传递所有可能的key的集合,然后从redis中批量查询。

一个是将查询到的数据移除空数据,这里移除@Type和移除params完全是根据自己业务来写,

在redis中存储时会有这两个字段,所以在映射为实体时需要将其移除掉。

如果自己业务中没有这两个字段,可以不用写这块。

然后返回Object的Stream。

2、在需要调用的地方

    @Autowired
    private CommonServiceUtils commonServiceUtils;

先引入依赖

再获取所有所有可能的key的集合

        Set<String> allKeys = signalLightIdList.stream()
                .map(signal -> RedisConstants.SIGNALIGHT_XHD + signal)
                .collect(Collectors.toSet());
        List<Map<String, Object>> cards = commonServiceUtils.getExistKeys(allKeys);
        if(cards.size()>0) {
            Stream<Object> dtosStream = commonServiceUtils.convertToDTOs(cards);
            List<SignalrightDevsDTO> collect = dtosStream.map(dto -> {
                BusSignallightControl busSignallightControl = JSONObject.toJavaObject((JSON) dto, BusSignallightControl.class);

如果是映射其他对象也可以通用

        Set<String> allKeys = carInfoList.stream()
                .map(carInfoPO -> RedisConstants.CARD_CARD + carInfoPO.getLocationNumber())
                .collect(Collectors.toSet());
        List<Map<String, Object>> cards = commonServiceUtils.getExistKeys(allKeys);
        if(cards.size()>0){
            Stream<Object> cardDTOStream = commonServiceUtils.convertToDTOs(cards);
            try {
                List<CarPositionDTO> carPositionDTOList = cardDTOStream.map(cardDTO -> {
                    CardDTO cardDTOVO = JSONObject.toJavaObject((JSON) cardDTO, CardDTO.class);

一个完整业务示例代码

    public List<SignalrightDevsDTO> getSignalrightDevsDtoList(List<Long> signalLightIdList) {
        Set<String> allKeys = signalLightIdList.stream()
                .map(signal -> RedisConstants.SIGNALIGHT_XHD + signal)
                .collect(Collectors.toSet());
        List<Map<String, Object>> cards = commonServiceUtils.getExistKeys(allKeys);
        if(cards.size()>0) {
            Stream<Object> dtosStream = commonServiceUtils.convertToDTOs(cards);
            List<SignalrightDevsDTO> collect = dtosStream.map(dto -> {
                BusSignallightControl busSignallightControl = JSONObject.toJavaObject((JSON) dto, BusSignallightControl.class);
                return SignalrightDevsDTO.builder()
                        .mineCode(mineCode)
                        .mineName(mineName)
                        .equipmentCode(busSignallightControl.getId().toString())
                        .equipmentName(busSignallightControl.getSignalLightName())
                        .signalState(busSignallightControl.getLightState())
                        .build();
            }).collect(Collectors.toList());
            return collect;
        }else{
            return null;
        }
    }

示例效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/410987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【未来已来】人人都说GPT,人人都怕GPT,人人都用GPT

文章目录前言一、GPT是什么&#xff1f;二、当GPT和AI遇到摄影总结前言 ChatGPT是由美国OpenAI研发的能够通过自然语言驱动的人工智能技术工具&#xff0c;因为它强大的执行力和任务处理能力&#xff0c;一经亮相就引起了极大的关注。与之类似&#xff0c;在图像智能生成方面&…

Java 自学 - 接口与继承 接口

设计 Java 的接口 在设计 LOL 的时候&#xff0c;进攻类英雄有两种&#xff0c;一种是进行物理系攻击&#xff0c;一种是进行魔法系攻击 这时候&#xff0c;就可以使用接口来实现这个效果。 接口就像是一种约定&#xff0c;我们约定某些英雄是物理系英雄&#xff0c;那么他们…

交接机的基本原理

第七章&#xff1a;交接机的基本原理 在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备&#xff0c;了解以太网交换机的工作…

抽象轻松web

不管是求最大值&#xff0c;还是最小值&#xff0c;无论是整数还是小数&#xff0c;数据类型是不是一样的 它们的本质上都是判断&#xff0c;在判断的基础上不断的变换&#xff0c;增加判断条件&#xff0c;增加判断过程罢了 判断需要两个本质 1 &#xff1a;两个以上的元素…

Redis高可用高性能缓存的应用系列2 - 事务机制和IO多路复用、持久化

概述 Redis高可用高性能缓存的应用系列的第二篇&#xff0c;主要介绍Redis事务机制和IO多路复用、和持久化的知识点。 Redis事务机制 Redis事务机制&#xff0c;和Mysql有大的不同&#xff0c;分为4步进行执行&#xff1a; 1.事务提交前&#xff0c;先检查命令语法是否正确…

【2023版】基于部标JT808JT1078车载视频位置监控平台介绍-开源项目

演示地址&#xff1a;http://gps.lingx.com 账号&#xff1a;admin 密码&#xff1a;123456 部标/苏标设备入口 IP&#xff1a;47.100.112.218 &#xff1b; 端口&#xff1a;8808 1.项目背景 “GPS/GPRS车辆智能管理系统”具备车辆实时定位监控、远程监控调度、行驶路线偏移…

ChatGPT帮我和老板吵架,半分钟做了个思维导图...

大家好&#xff0c;我是小z&#xff0c;也可以叫我阿粥最近那个疑似成都电科的截图已经传疯了&#xff0c;贴一张图回味下&#xff1a;这种壮士断腕式的吵法&#xff0c;可以说几乎是单方面的虐杀。但是有朋友问了&#xff0c;在职场中还是有所顾忌&#xff0c;有没有更体面点的…

什么是浪涌保护器防雷过压保护

每年有数十万起雷击和过电压造成的损坏&#xff0c;造成的损失高达数千万元。过压保护装置是电气装置综合保护概念的一部分&#xff0c;可以可靠地防止过压造成的损坏。 过电压损坏 过电压是小于千分之一秒的短暂电压峰值&#xff0c;超过电气设备允许的设计工作电压的许多倍…

因为我没交周报,leader要罚款200元,怎么给他挖坑?能以敲诈勒索罪告他吗?...

没交周报就罚款&#xff0c;这种事你们遇到过吗&#xff1f;一位网友说&#xff1a;leader在群里通知不交周报就罚款&#xff0c;这周罚到他头上&#xff0c;要罚款200元&#xff0c;这种情况怎么办&#xff1f;能定他一个敲诈勒索罪或者抢劫罪吗&#xff1f;最差也要在离职后把…

paddle通过极简方案构建手写数字识别模型

参考&#xff1a; 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 前提条件 在数据处理前&#xff0c;首先要加载飞桨平台与“手写数字识别”模型相关的类库&#xff0c;实现方法如下。 #加载飞桨和相关类库 import paddle from paddle.nn import Linear import paddle.nn…

Spring 之循环依赖

Spring 框架是一个流行的Java应用程序框架&#xff0c;它提供了许多强大的功能&#xff0c;如依赖注入和面向切面编程。然而在使用 Spring 框架时&#xff0c;我们可能会遇到循环依赖的问题。 这种情况发生在两个或多个 Bean 之间相互依赖的情况下&#xff0c;其中一个 Bean 依…

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712 龙迅&#xff08;Lontium&#xff09;的LT8711/LT8712&#xff0c;是一款Type-C转HDMI 4K的视频转换芯片 通过USB Type-C连接器将DP RX视频信号转换为HDMI/DVI TX视频信号。DP…

【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

前端自动化测试之葵花宝典

首先聊一下概念&#xff0c;Web 前端自动化测试是一种通过编写代码来自动化执行 Web 应用程序的测试任务的方法&#xff0c;它通常使用 JavaScript 和测试框架 (如 Selenium、Appium 等) 来实现。 Web 前端自动化测试的优点是可以提高测试效率、减少测试时间和测试成本&#x…

DMA (Direct Memory Access)

DMA&#xff08;Direct Memory Access&#xff09;&#xff1a;直接存储器访问&#xff1b; 一、DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 DMA用来提供在外设和存储器之间或者存储器和存储…

初始SpringBoot

初始SpringBoot1. SpringBoot创建和运行1.1. SpringBoot的概念1.2. SpringBoot的优点1.3. SpringBoot的创建1.3.0. 前置工作:安装插件(这是社区版需要做的工作, 专业版可以忽略)1.3.1. 社区版创建方式1.3.2. 专业版创建方式1.3.3. 网页版创建方式1.4. 项目目录介绍1.5. SpringB…

Matlab在线IDE:MATLAB Online介绍与计算定积分案例

目录1、MATLAB Online介绍功能与特点命令行窗口和编辑器窗口适用场景计费方式使用方法2、注册登录3、计算定积分1、MATLAB Online介绍 MATLAB Online是一款在线IDE&#xff08;集成开发环境&#xff09;&#xff0c;允许用户在Web浏览器中运行MATLAB并使用MATLAB工具箱&#x…

网络安全:内网渗透实例,小白也能看懂内网渗透

一、前言 从 linux 打进去到域环境&#xff0c;到获取域控权限。全篇实操 二、外网打点 1、打开站点&#xff0c;很正常的一个登录界面 2、尝试登录后发现典型的 shiro 特征。 3、使用工具直接打 shiro 反序列化即可。 4、直接上冰蝎马&#xff0c;连接 【一>所有资源获取…

【三十天精通 Vue 3】 第四天 Vue 3的模板语法详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 模板语法概述1. Vue 3 模板语法的简介2. Vue 3 模板…

如虎添翼,强大插件让ChatGPT更加游刃有余

ChatGPT模型是当前人工智能领域中备受瞩目的存在。作为一款强大的自然语言处理模型&#xff0c;它具备跨时代的意义&#xff0c;将深刻影响我们的未来。而强大的插件不仅可以丰富ChatGPT的功能&#xff0c;提高其应对复杂问题的能力。还也可以解决一些常见的错误&#xff0c;如…