自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 资源 (1)
  • 收藏
  • 关注

原创 sqlserver大批量导入数据,从其他库导入,解决字段不一致问题

t后面跟的是数据的分隔符 这是个坑 默认是/t /n 如果数据中含有换行符导入的时候就会失败 所以这里随便写了一个参数,-r, 导入数据的时候就不会失败。由于现有项目想从别的系统导入一批新数据,数据量庞大且字段不一致,可以使用BULK来解决。现在要从B库中将trk_invd表的数据导入到A库中的trk_invd表。建立中间视图 trk_invd_v 查询出自己想要导出的数据。根据A库中的结构导出中间视图的数据。A库中的表比B表多了两个字段。目标库 A 数据源库 B。最后结束的时候把配置关闭。

2023-09-08 16:57:06 428

原创 minio集成spring boot

启动类 // minio @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Value("${minio.bucket}") private Strin

2022-05-13 16:49:21 1005 1

原创 配置logback 捕获异常输出到文件

<?xml version="1.0" encoding="UTF-8"?><!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --><!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --><!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如.

2022-05-13 16:43:48 1727

原创 Kafka基本概况

kafka是一个分布式的,分区的消息(官方称之为commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独 特的设计。可以这样来说,Kafka借鉴了JMS规范的思想,但是确并没有完全遵循JMS规范。broker:可以看作是每一台应用服务器Topic:主题,定义不同的发送主题,是一种逻辑上的概念Producer:生产者,可以定义多个Consumer:消费者,可以定义多个ConsummrGroup:消费组,可以将消费者分组,Kafka消费消息是按偏移量来进行消费的,每个组

2022-03-15 00:56:05 2234

原创 接口重复提交 解决接口冥幂问题

注解类@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface RabbitNoRepeatSubmit {}实现类@Aspect@Component@Slf4jpublic class RabbitNoRepeatSubmitAspect { @Autowired RabbitRedisService rabbitRedisService; @Aut

2022-03-09 23:36:04 175

原创 Redis缓存设计的问题

多级缓存架构 缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储 层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个: 第一, 自身业务代码或者数据出现问题。 第二, 一些恶意攻击、 爬虫等造成大量空命中。 缓存穿透问题解决方案: 1、缓存空对象 1 String get(Stri..

2022-01-19 15:07:09 86

原创 Redis实现日活 周活 月活的思想

用户登陆时调用redis的setbit login_日期 用户id 1 将用户存入key中查找日活用户数量bitcount login_日期 即可得到日活用户数查找周活用户数先定义一周的setbit login_1 用户id 1setbit login_2 用户id 1setbit login_3 用户id 1setbit login_4 用户id 1setbit login_5 用户id 1setbit login_6 用户id 1setbit login_

2022-01-10 18:36:57 575

原创 Redis底层数据结构

Stringredis是基于c语言开发的,但是它并没有沿用c语言的数据结构,而是使用了SDS简单动态字符串(simple dynamic string)这种数据结构redis 3.2 以前/* * 保存字符串对象的结构 */ struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 c

2022-01-10 18:29:07 785

原创 Redis常用命令和数据结构

String结构字符串常用操作SET key value //存入字符串键值对MSET key value [key value ...] //批量存储字符串键值对SETNX key value //存入一个不存在的字符串键值对GET key //获取一个字符串键值MGET key [key ...] //批量获取字符串键值DEL key [key ...] ...

2022-01-06 17:32:36 168

原创 Redis哨兵高可用架构

sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过 sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis 主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息) redis哨兵架构搭建步骤: 1 1、复制..

2022-01-06 17:31:34 75

原创 Redis主从架构

redis主从架构搭建,配置从节点步骤: 1 1、复制一份redis.conf文件 23 2、将相关配置修改为如下值: 4 port 6380 5 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 6 logfile "6380.log"7 dir /usr/local/redis‐5.0.3/data/6380 # 指定数据存放目录 8 # 需要注释掉bind 9 # bind 127.0.0.1(bin...

2022-01-06 17:28:58 87

原创 Redis持久化

String结构字符串常用操作SET key value //存入字符串键值对MSET key value [key value ...] //批量存储字符串键值对SETNX key value //存入一个不存在的字符串键值对GET key //获取一个字符串键值MGET key [key ...] //批量获取字符串键值DEL key [key ...] ...

2022-01-06 17:25:37 47

原创 JVM调优命令

Jmap 此命令可以用来查看内存信息,实例个数以及占用内存大小 打开log.txt,文件内容如下: num:序号 instances:实例数量 bytes:占用空间大小 class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][] 堆信息堆内存dumpjmap ‐dump:format=b,file=eureka.hp..

2021-12-30 16:04:11 112

原创 安全点与安全区域

安全点就是指代码中一些特定的位置,当线程运行到这些位置时它的状态是确定的,这样JVM就可以安全的进行一些操作,比 如GC等,所以GC不是想什么时候做就立即触发的,是需要等待所有线程运行到安全点后才能触发。 这些特定的安全点位置主要有以下几种: 1. 方法返回之前 2. 调用某个方法之后 3. 抛出异常的位置 4. 循环的末尾 大体实现思想是当垃圾收集需要中断线程的时候, 不直接对线程操作, 仅仅简单地设置一个标志位, 各个线程执行过程 时会不停地主动去轮询这个标志, 一旦..

2021-12-30 15:48:56 195

原创 如何选择垃圾收集器

1. 优先调整堆的大小让服务器自己来选择 2. 如果内存小于100M,使用串行收集器 3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择 4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选 5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器 6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC 下图有连线的可以搭配使用JDK 1.8默认使用 Parallel(年轻代和老年代都是)..

2021-12-30 15:47:51 361

原创 G1垃圾收集器详解

G1收集器(-XX:+UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。 一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数"- XX:G1HeapRegionSize"手动指定Re.

2021-12-29 15:54:04 612

原创 垃圾收集器以及垃圾收集算法

垃圾收集算法基于分代收集理论延伸出三种垃圾收集算法分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几 块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可 以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们.

2021-12-28 16:12:28 150

原创 JVM对象内存分配以及对象创建的过程

对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个 符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。 2.分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类 加载完成后便可完全确定,为 对象分配空间的任务等同于把 一块确定大

2021-12-27 15:53:12 226

原创 JVM内存模型

JDK体系结构Java语言的跨平台特性JVM整体结构及内存模型堆:公共的内存区域,存储对象方法区:公共内存区域,存储常量池,静态变量,类信息 如 final String a=new String("");会指向堆栈:线程独自持有的区域,存储局部变量,执行代码时会在内存中给每个线程跑的程序分配一块栈区域,在栈中每次调用一个方法会分配一个栈帧区域,如main方法中调用compute方法 即会在栈中分配两个栈帧,在每个栈帧中会有局部变量表,操作数栈,动态链接,方...

2021-12-24 15:16:31 407

原创 JVMh指令手册

栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入操作数栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst..

2021-12-24 14:52:59 479

原创 Tomcat打破双亲委派机制

以Tomcat类加载为例,Tomcat 如果使用默认的双亲委派类加载机制行不行? 我们思考一下:Tomcat是个web容器, 那么它要解决什么问题: 1. 一个web容器可能需要部署两个应用程序,不同的应用程序可能会依赖同一个第三方类库的 不同版本,不能要求同一个类库在同一个服务器只有一份,因此要保证每个应用程序的类库都是 独立的,保证相互隔离。 2. 部署在同一个web容器中相同的类库相同的版本可以共享。否则,如果服务器有10个应用程 序,那么要有10份相同的类库加载进虚拟机。..

2021-12-24 10:52:46 571

原创 JVM类加载机制以及双亲委派

类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到 JVM。1 package com.tuling.jvm; 23 public class Math { 4 public static final int initData = 666; 5 public static User user = new User(); 67 public int compute() { //一个方法对应一块栈帧内存区域 8 .

2021-12-23 15:02:20 292

原创 Callable&Future&FutureTask介绍

Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题 就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现 这一场景,而Future和FutureTask就可以和Callable接口配合起来使用。 Callable和Runnable的区别1 @FunctionalInterface 2 public interface ...

2021-12-21 14:41:42 520

原创 Fork/Join框架介绍

线程池的线程数设置多少合适? 我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资 源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应 的策略。 CPU密集型任务 CPU密集型任务也叫计算密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗 费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的 线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU..

2021-12-17 15:34:56 442

原创 二叉堆在java中的的结构算法

优先级队列PriorityQueue中即使用了数组+二叉堆的数据结构实现最小堆的方法循环查找父节点做交换 直到对比不上为止入队操作private static <T> void siftUpComparable(int k, T x, Object[] array) { Comparable<? super T> key = (Comparable<? super T>) x; while (k > 0) { ...

2021-12-16 16:08:17 876

原创 阻塞队列BlockingQueue的各种实现

Queue接口 1 public interface Queue<E> extends Collection<E> { 2 //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常 3 boolean add(E e); 4 //添加一个元素,添加成功返回true, 如果队列满了,返回false 5 boolean offer(E e); 6 //返回并删除队首元素,队列为空则抛出异常 7 E remove();8 //返回并删除队首元素,队列

2021-12-15 14:55:36 1065

原创 ReentrantReadWriteLock读写锁

读写锁介绍 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁(读 多写少)。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个 线程同时读取共享资源(读读可以并发);但是如果一个线程想去写这些共享资源,就不应该 允许其他线程对该资源进行读和写操作了(读写,写读,写写互斥)。在读多于写的情况下, 读写锁能够提供比排它锁更好的并发性和吞吐量。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,...

2021-12-14 15:23:51 601 1

原创 CyclicBarrier介绍

字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。...

2021-12-13 14:42:27 446

原创 CountDownLatch介绍

CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成 操作集。 CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值 (count)由于countDown方法的调用达到0,count为0之后所有等待的线程都会被释放,并 且随后对await方法的调用都会立即返回。这是一个一次性现象 —— count不会被重置。如果 你需要一个重置count的版本,那么请考虑使用CyclicBarrier。

2021-12-10 15:28:10 421

原创 AQS之Semaphore

Semaphore介绍 Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于 AbstractQueuedSynchronizer实现的。 Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获 取信号量实现。大小为n(n>0)的信号量可以实现限流的功能,它可以实现只能有n个线程同 时获取信号量。 PV操作是操作系统一种实现进程互斥与同步的有效方法。PV操作与信号量(S)的处理相关,P表示通 过..

2021-12-10 11:37:24 526

原创 java并发之AQS详解 ReentrantLock

AQS原理分析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队 列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于 AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实 现一个依赖状态的同步器。 JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的 一般是通过一个内部类Sync继承 AQS...

2021-12-09 18:21:08 82

原创 CAS和Atomic详解

什么是 CAS CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首 先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。 CAS 的逻辑用伪代码描述如下: 1 if (value == expectedValue) { 2 value = newValue; 3 } 以上伪代码描述了一个由比较和赋值两阶段组成的复合操作,CAS 可以看作是它们合并后的整体 ——一个不可分割的原子操作,并且其原子性是直接在.

2021-12-06 14:56:01 956

原创 Java中的几种线程创建方式

首先在操作系统层面,宏观角度上来讲,线程的生命周期是五态1. 初始状态,指的是线程已经被创建,但是还不允许分配 CPU 执行。这个状态属于编程 语言特有的,不过这里所谓的被创建,仅仅是在编程语言层面被创建,而在操作系统层 面,真正的线程还没有创建。 2. 可运行状态,指的是线程可以分配 CPU 执行。在这种状态下,真正的操作系统线程已 经被成功创建了,所以可以分配 CPU 执行。 3. 当有空闲的 CPU 时,操作系统会将其分配给一个处于可运行状态的线程,被分配到 CPU 的

2021-12-03 15:20:16 306

原创 java自带线程池原理分析

newCachedThreadPool缓存线程池,可无限大CorePoolSize 核心线程 0MaximumPoolSize 最大线程 maxkeepAliveTime:60LSynchronousQueue 队列 其实只有一个在排队 一个worker进来之后从队列取出一个newFixedThreadPool这是一种固定线程数的线程池,当前线程数大于总数则会等待CorePoolSize 核心线程 10MaximumPoolSize 最大线程 10keepAliv

2021-12-02 15:17:40 324

原创 Map系列底层原理

HashMap(Map):特点: key,value存储,key可以为null,同样的key会被覆盖掉存储结构: 底层采用数组、链表、红黑树来实现的。原理讲解: 哈希算法(也叫散列),就是把任意长度值(Key)通过散列算法变换成固定长度的key(地址) 通过这个地址进行访问的数据结构它通过把关键码值映射到表中一个。位置来访问记录,以加 快查找的速度。Hashcode:通过字符串算出它的ascii码,进行mod(取模),算出哈希表中的下标哈希冲突 用链表是来解决数组下标会覆盖的问题

2021-12-01 15:10:56 2590

原创 MYSQL:MVCC多版本并发控制机制

mvcc是通过undo日志版本链与read view机制来实现的每个表都有两个隐藏字段隐藏字段trx_id和roll_pointer 事物id和指针事务开启后 执行的insert update delete才会开启一个事务id在可重复读和读已提交模式下read view机制不同可重复读:开启事务之后 执行第一次查询获取的read view 一直使用这一个 一直到事务结束查询结果也不会发生变化读已提交:开启事务之后 每次执行查询获取新的read viewread view规则...

2021-11-17 16:47:40 597

原创 SQL底层执行原理

查询缓存:每次将查询语句作为key,结果作为value来存储起来,类似于map结构比较鸡肋,适合于万年不变的数据。.Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。.(cache_free blooks:.表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。Ccache_free menory:查询缓存的内存大小,通过这个参数可以很清晰的知...

2021-10-28 13:52:28 194

原创 explain

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在select语句之前增加explain 关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果from中包含子查询,仍会执行该子查询,将结果放入临时表中EXPLAIN select * from table变种1)EXPLAIN EXTENDED select * from table显示filtered2) EXPLAIN PARTI...

2021-10-14 17:42:31 66

原创 mysql数据结构和算法

索引是帮助mysql高效获取数据的排好序的数据结构为什么数据结构不是二叉树?因为mysql数据存储在硬盘中,每次插入数据都会读写硬盘数据,二叉树原则是右边比父节点大,左边比父节点小,如果索引建立在自增ID上,查找ID为10w的数据,会查找10w次,查询效率慢。为什么数据结构不使用红黑树?红黑树又叫平衡二叉树,是一种二叉树的扩展,在数据量大的情况下依旧无法承载索引所需要提供的查询效率,从根节点会一直找到对应的叶子节点。B-Tree叶节点具有相同的深度,叶节点的指针为空所有索引元素不

2021-10-12 16:44:20 122

原创 冒泡排序实现

public class demo_sort { public static void main(String[] args) { //冒泡排序算法 int[] numbers=new int[]{1,5,8,2,3,9,4}; //需进行length-1次冒泡 for(int i=0;i<numbers.length-1;i++) { for(int j=0;j<numbers.le...

2021-10-11 10:31:13 38

itext生成pdf解决中英文换行问题

导入 org.xhtmlrenderer core-renderer R8 直接根目录下新建包org.xhtmlrenderer.layout 覆盖jar

2021-04-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除