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

这篇具有很好参考价值的文章主要介绍了SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

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

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

适用对象2

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

注:

博客:
霸道流氓气质的博客_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;
        }
    }

示例效果

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

 文章来源地址https://www.toymoban.com/news/detail-408590.html

到了这里,关于SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中redis进行模糊查询(keys()、scan()、scan_iter())

    python中使用redis进行模糊查询,可以使用scan()命令模糊匹配key。 keys命令 :简单粗暴,但是由于Redis是单线程,keys命令是以阻塞的方式执行的,keys是以遍历的方式实现的复杂度是 O(n),Redis库中的key越多,查找实现代价越大,产生的阻塞时间越长。 scan命令 : 以非阻塞的方式

    2024年02月07日
    浏览(35)
  • 恶意IP检测API接口,恶意IP威胁情报查询,通过大数据查询IP是否存在威胁或恶意。

    恶意IP检测,是指使用多种手段来检测IP地址是否存在威胁或恶意。在当前的网络安全环境下,恶意攻击已经成为常态化,各种类型的攻击不断涌现,其中大部分的攻击都是通过IP地址发起的。因此,对IP地址的安全性进行监控和检测,是保障网络安全的重要手段之一。 恶意

    2024年02月06日
    浏览(56)
  • springboot监听Redis 缓存过期(Key 失效)事件

    事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 故需要开启 redis 的事件监听与发布 修改 redis.conf 文件(Windows上是redis.windows.conf和redis.windows-service.conf) 通过开启key过期的事件通知,当key过期时,会发布过期事件;我们定义key过期事件的监听器,当key过期时,就能收到

    2024年02月12日
    浏览(43)
  • Kubernetes_21_查询所有命名空间下的所有资源(kubectl查询操作)

    查询所有命名空间下常用资源 如下: 缺点:这种方法 kubectl get all 其实查询出来不是全部资源,仅仅是常用资源,仅仅是 service - deployment/statefulset/daemonset/job/cronjob - replicaset - pod 这个绑定链资源,还有 rbac 的 role rolebinding,配置文件 configmap secrets,服务账号 serviceAccount ,se

    2023年04月08日
    浏览(42)
  • redis集群的多key原子性操作如何实现?

    在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。 比如说有一个双删场景,要保证原子性同时删除 k1 和 k2 。 可以用lua双删 也可以用事务双删 但是在redis的集群中,key被hash到不同的slot,slot又被分配到多个不同redis实例。那么多key原子性操作如何

    2024年02月07日
    浏览(44)
  • Kubernetes_kubectl操作_查询所有命名空间下的所有资源

    查询所有命名空间下常用资源 如下: 缺点:这种方法 kubectl get all 其实查询出来不是全部资源,仅仅是常用资源,仅仅是 service - deployment/statefulset/daemonset/job/cronjob - replicaset - pod 这个绑定链资源,还有 rbac 的 role rolebinding,配置文件 configmap secrets,服务账号 serviceAccount ,se

    2024年02月05日
    浏览(36)
  • 使用python在es中基本操作详解(添加索引、查询索引、删除索引、判断索引是否存在、添加数据、更新数据、查询数据)

    示例代码1: 运行结果: 示例代码2: 运行结果: 示例代码3: 运行结果: 注意: 对比上面几种建立索引的方法,是有一定区别的。根据响应结果可以看出: es. indices.create() 方法是标准的创建索引的方法,其它几种方法在创建索引的同时也会生成一条数据,并且生成mappin

    2024年02月11日
    浏览(197)
  • SpringBoot查找多级商品方案【一次sql查询所有数据,循环处理分层逻辑】

    一、查找所有商品 1、service CategoryServiceImpl.java this::category2CategoryVo 等价于 e - category2CategoryVo(e) 2、循环查找子目录 CategoryServiceImpl.java 3、直接拷贝数据 CategoryServiceImpl.java 二、根据categoryId查找多级商品 1、ProductServiceImpl.java 2、CategoryServiceImpl.java

    2024年02月12日
    浏览(48)
  • 【Redis】Redis 哈希 Hash 键值对集合操作 ( 哈希 Hash 键值对集合简介 | 查询操作 | 增加操作 | 修改操作 )

    Redis 中的 Hash 数据 是一个 键值对集合 , 类似于 Java 中的 Map 集合 ; Hash 数据底层数据结构是 : 压缩列表 ZipList : Hash 中的 键值对 长度较短时 使用 压缩列表 ; 哈希表 HashTable : Hash 中的 键值对 长度较长时 使用 哈希表 ; Redis 中存储对象的方式 : 存储序列化之后的数据 : 将 对象

    2024年02月15日
    浏览(44)
  • 通过C#学习redis02(哈希操作)

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包