达梦库批量操作重复数据及唯一主键冲突问题解决思路

背景

实时数据需要批量入历史表,频率高,数据量大。无法保障数据重复问题。之前我们一直用MongoDB,解决重复问题可用唯一索引解决,MongoDB在批插操作时,可以跳过批插过程中失败的数据继续插入。本次系统建设用的是达梦库,当前遇到的问题是批插时,一条失败,无法执行整个批插。网上找了一些资料,Mysql有insert ignor into …做为相应的解决方案。达梦库未到类似操作,网上建议用merge into,即在执行插入时通过判断是否存在违反唯一性原则 ,从而决定用upsert。由 于系统特点历史表数据量大,批插操作频繁,考虑到性能问题,该方法不打算采用。

待解决问题

考虑到数据量问题,历史表禁有重复数据

难点

1.历史表数据量大,按月做了分区,每月量估测在千万级别
2.批插操作频繁,不高于20s一次

思路

引用本地缓存 ,缓存历史数据,每次在入库前通过缓存数据判断去掉重复数据。我们唯一主键是编码类型和实时时间。实时时间会重复。
(1)缓存设 计如 下:
key:code_type;value:realTime 。每次存历史之前可以先去map中找到realTime,如果时间小于等于realTime,则这条移除不保存。
(2)考虑到数据量比较大,可以做个二级缓存。不说了,被催工作了,先上代码供参考吧。

SpringBoot集成 JetCahce

POM引依赖

这里有点小坑坑,注意版本。Jetcahce2.7之后的版本不能用@CreateCach注解了。上官网地址,自己去看看。

  <dependency>
                <groupId>com.alicp.jetcache</groupId>
                <artifactId>jetcache-starter-redis</artifactId>
                <version>2.6.7</version>
  </dependency>

配置文件配置

jetcache:
  # 统计间隔,默认0:表示不统计
  statIntervalMinutes: 0
  # areaName是否作为缓存key前缀,默认True
  areaInCacheName: false
  local:
    default:
      # 已支持可选:linkedhashmap、caffeine
      type: caffeine
      # key转换器的全局配置,当前只有:fastjson, @see com.alicp.jetcache.support.FastjsonKeyConvertor
      keyConvertor: fastjson
      # 每个缓存实例的最大元素的全局配置,仅local类型的缓存需要指定
      limit: 100
      # jetcache2.2以上,以毫秒为单位,指定多长时间没有访问,就让缓存失效,当前只有本地缓存支持。0表示不使用这个功能
  #      expireAfterAccessInMillis: 0
  remote:
    default:
      # 已支持可选:redis、tair
      type: redis
      # 连接格式@see:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details
      host: 127.0.0.1
      port: 6379
      password: Abd123
      keyConvertor: fastjson
      # 下面都是redis的配置
      poolConfig:
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
      # 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
      valueEncoder: java
      valueDecoder: java
      # 以毫秒为单位指定超时时间的全局配置
#      expireAfterWriteInMillis: 5000

开启注解

在SpringBoot启动类上加,开启jetCahce注解

@EnableMethodCache(basePackages = "com.test.gas.zhanglu.cache.*")
@EnableCreateCacheAnnotation
public class ZLCollectApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZLCollectApplication.class, args);
    }

}

缓存 实体类要进行序列化

public class ZLRealtimeValueHistory  implements Serializable {

    private static final long serialVersionUID = 806617303765589022L;
    
    //值
    private String value;

    //状态
    private String status;

    //实时
    private String realTime;
}

缓存类

import cn.hutool.core.date.DateUtil;
import com.alicp.jetcache.Cache;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.CreateCache;
import com.ceic.gas.management.generator.cache.GasRealtimeMonitorCacheService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class ZLMonitorCacheServiceImpl {

    /**
     *
     * 更新缓存方法,把最新时间更新到缓存中。
     * expire:指定远程缓存过期时间,
     * localLimit:本地缓存数量
     */
    @CreateCache(name = "WSCC_FFRealTimeCache_", expire = 1, timeUnit = TimeUnit.DAYS, localLimit = 100, cacheType = CacheType.BOTH)
    public Cache<String, Date> ffRealTimeCache;

    

    public Date getDate(String key) {
        if (null != ffRealTimeCache) {
            return ffRealTimeCache.get(key);
        }
        return null;
    }

    /**
     * 数据的缓存
     *
     * @param list
     */
    public void putData(List<ZLRealtimeValueHis> list) {
        if (null == list || list.isEmpty()) {
            return;
        }
        for (ZLRealtimeValueHis bean : list) {

            String key = this.getKey(bean);
            String value = bean.getRealTime();
            if (StringUtils.isEmpty(value)) {
                return;
            }
            Date v1 = DateUtil.parse(value);
            if (null != v1) {
                ffRealTimeCache.put(key, v1);
            }
        }

    }

    @Override
    public String getKey(ZLRealtimeValueHis bean) {
        return bean.getMineCode() + "@" + bean.getDeviceType() +
                "@" + bean.getDeviceNo();
    }

总结

1.jetCache如果用2.7.0之后的版本,可以用CacheManager 创建Cache
2.JetCache 可以实现二级缓存,可以本地缓存,可 以远程结合Redis等进行缓存
3.JetCache 可以设定缓存过期时间和淘汰策略,以后有时间再补充相关知识。如果希望他一直有效不过期,可以不做全局配置和任何TTL 时间相关配置
4.缓存的实体对象别忘记要进行序列化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【知识】DGL中graph默认的稀疏矩阵格式和coo格式不对的坑

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 先给结论 源码解读 代码验证 网上没找到相关的讨论&#xff0c;因此只能从源码上一步步查。 先给结论 对于自己使用dgl.graph接口创建的图&am…

20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网

20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网 2024/7/2 14:41 百度&#xff1a;vmware 虚拟机 使用主机代理 上网 https://blog.csdn.net/nomoremorphine/article/details/138738065?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_ba…

Elasticsearch集群部署(上)

目录 前言 一. 环境准备 二. 实施部署 三. 安装配置head监控插件 &#xff08;只在第一台es部署&#xff09; 四. Kibana部署&#xff08;当前还是在第一台es部署&#xff09; 五. 安装配置Nginx反向代理 六. Logstash部署与测试 前言 1. Elasticsearch&#xff1a; 是…

什么是文档透明加密|好用的文档透明加密软件有哪些?

在当今日益数字化和信息化的时代&#xff0c;数据安全问题愈发受到企业和个人的关注。文档作为信息的重要载体&#xff0c;其安全性不言而喻。为了保障文档的机密性和完整性&#xff0c;文档透明加密技术应运而生。本文将对文档透明加密进行详细介绍&#xff0c;并探讨一些好用…

多模态融合 + 慢病精准预测

多模态融合 慢病精准预测 慢病预测算法拆解子解法1&#xff1a;多模态数据集成子解法2&#xff1a;实时数据处理与更新子解法3&#xff1a;采用大型语言多模态模型&#xff08;LLMMs&#xff09;进行深度学习分析 慢病预测更多模态 论文&#xff1a;https://arxiv.org/pdf/2406…

Python中爬虫编程的常见问题及解决方案

Python中爬虫编程的常见问题及解决方案 引言&#xff1a; 随着互联网的发展&#xff0c;网络数据的重要性日益突出。爬虫编程成为大数据分析、网络安全等领域中必备的技能。然而&#xff0c;爬虫编程不仅需要良好的编程基础&#xff0c;还需要面对着各种常见的问题。本文将介绍…

【js + ckeditor】插入base64格式的图片

一、需求说明 直接把图片转成base64插入到富文本 二、需求分析 1、富文本图片格式处理位置 在ckeidtor的目录下有个plugins文件夹&#xff0c;在plugins下新建一个文件夹&#xff08;自己命名&#xff0c;如simpleupload&#xff09;&#xff0c;进入simpleupload文件夹&…

用MySQL+node+vue做一个学生信息管理系统(四):制作增加、删除、修改的组件和对应的路由

1.下载依赖&#xff1a; npm install vue-router 在src目录下新建一个文件夹router&#xff0c;在router文件夹下新建一个文件router.js文件,在component目录下新建增加删除和修改的组件&#xff0c;引入router.js当中 此时的init组件为主页面&#xff08;&#xff08;二、三&…

ROS2仿真工具-gazebo

gazebo独立于ROS2&#xff0c;就像插件一样&#xff0c;需要安装。 1.安装 sudo apt install gazebo sudo apt install ros-humble-gazebo-* 2.运行测试demo gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 查看所有话题 ros2 top…

6月份上海二手房卖疯了,暴涨四成,反价房东被抛弃

6月份刚刚结束&#xff0c;北京、上海两大城市的房市成交情况纷纷出炉&#xff0c;从成交量来看上海房市明显比北京火热许多&#xff0c;同时与其他城市类似&#xff0c;消费者偏向于二手房。 6月份上海二手房往前高达2.6万套&#xff0c;环比增加超四成&#xff0c;创下2021年…

Windows下Visual Studio 中配置第一个CUDA工程

今天整NVIDIA 的CUDA 安装和第一个CUDA 代码&#xff0c;顺便添加一个有CUDA工程的空框架。 &#xff08;1&#xff09;首先确认自己的CUDA 已经安装成功 >>cmd 进入命令窗&#xff0c;在窗口输入查看cuda 是否安装成功&#xff0c;能查到CUDA的版本号&#xff0c;表示安…

在CenteOs7上安装mysql8.0(Super详细版)

在CenteOs7上安装mysql8.0 为什么用Mysql8.0&#xff1f;如何下载下载地址需要提前准备下载步骤 服务器上安装如何上传到服务器&#xff1f;通过wget下载到服务器并解压 开始安装非必须安装如果全部安装执行顺序 安装完后&#xff0c;启动mysql使用“systemctl”检测mysqld服务…

基于YOLOv10深度学习的CT扫描图像肾结石智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

《企业实战分享 · 常用运维中间件》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

《昇思25天学习打卡营第6天|网络构建》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 定义模型类2. 模型层3. 模型参数 前言&#xff1a; 在第六节中我们学习了网络构建&#xff0c;了解了神经网络模型是由神经网络层和Tensor操作构成&#xff0c;我们使用的mindspore.nn中提供了常见的升级网络层的实现&#x…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法&#xff0c;解析spark参数&#xff0c;调用submit方法 3.在submit方法里调用doRunMain方法&#xff0c;最终调用r…

Python学习速成必备知识,(20道练习题)!

基础题练习 1、打印出1-100之间的所有偶数&#xff1a; for num in range(1, 101):if num % 2 0:print(num) 2、打印出用户输入的字符串的长度&#xff1a; string input("请输入一个字符串&#xff1a;")print("字符串的长度为&#xff1a;", len(str…

PHP验证日本手机电话号码

首先&#xff0c;您需要了解手机号码的规格。 根据 &#xff0c;手机和PHS&#xff08;个人手持电话系统&#xff09;可以理解为以“070”、“080”和“090”开头的11位数字。 此外&#xff0c;以“050”开头的11位特定IP电话号码也将包含在该目标中。 关于以“060”开头的F…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不然改乱了&#xff0c;可能就…

初识Java(复习版)

一. 什么是Java Java是一种面向对象的编程语言&#xff0c;和C语言有所不同&#xff0c;C语言是一门面向过程的语言。偏底层实现&#xff0c;比较注重底层的逻辑实现。不能一味的说某一种语言特别好&#xff0c;每一种语言都是在特定的情况下有自己的优势。 二.Java语言发展史…