自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(166)
  • 收藏
  • 关注

原创 关于ElasticSearch新建文档的姿势

序号语句特性描述1插入时需要指定id,且重复插入相同id的文档,只会将返回的结果中的version自增,且result改为updated,本质上是先删除,再写入,并将版本号+12插入时同样需要指定id,但当插入相同id的文档时,会返回状态码为409的错误3不需要指定文档 ID, 系统自动生成。上表是新建文档时 3 种写法的总结,如果你有更新文档内容的需求,应该使用第一种方式。如果写入文档时有唯一性校验需求的话,应该使用第二种方式。如果需要系统为你创建文档 ID,应该使用第三种方式。

2022-12-31 15:17:51 1022 2

原创 Spring事务回调

【代码】Spring事务回调。

2022-12-13 20:07:27 396

原创 CentOS安装OpenResty

和其他的开源软件一样,OpenResty 的安装有多种方法,比如使用操作系统的包管理器、源码编译或者 docker 镜像。我推荐你优先使用 yum、apt-get、brew 这类包管理系统。先要在包管理器中添加 OpenResty 的仓库地址,然后用包管理工具来安装。 注意最后一行,让我们运行下面的代码,重新运行,执行代码即可。 之后用yum命令安装即可

2022-12-06 16:47:16 755

原创 有关Mysql中的索引

索引的出现就是为了提高数据查询的效率,就像书的目录一样。

2022-10-05 20:46:25 693

原创 SQL的事务隔离属性

当数据库上有多个事务同时执行的时候,就可能出现脏读,不可重复读,幻读的问题,为了解决这些问题,就有了“事务隔离“的概念。事务隔离的越严实,效率就会越低SQL的标准事务隔离级别分为启动事务查询得到值1读未提交的情况下,则V1,V2,V3的值均为2。读提交的情况下,V1是1,V2,V3的值为2.可重复读的情况下,V1的值毫无疑问是1,V2的值也是1,因为可重复读要保证事务在执行期间看到的数据必须是前后一致的,直到V3的时候,V3的值才为2。

2022-09-21 16:51:26 369

原创 Mysql的日志系统

现在我要对下面一张表作更新操作,如下是这张表的建表语句如果要将ID = 2 这一行的值加1,SQL语句就应该这么写更新语句同样会走下面一套流程执行数据库操作之前是一定要连接数据库的,这是连接器的工作。一张表一旦有更新,跟这张表有关的查询缓存都会失效,所以这次更新操作会把表T上的所有所有缓存结果晴空,这就是不推荐使用查询缓存的原因。接下来,分析器会通过词法和语法分析这是一条更新语句,优化器决定要使用ID这个索引。然后执行器负责具体的执行,找到这一行,进行更新。...

2022-08-30 20:11:50 559

原创 Sql语句的执行流程

sql必知必会

2022-08-18 21:50:15 499

原创 Kafka的生产者分区和优化参数

分区的好处便于合理使用存储资源,每个partition在一个Broker上存储,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。 提高并行度,生产者可以以分区为单位发送数据;消费者可以以分区为单位消费数据。Kafka的分区策略指明partition的情况下,直接将指明的值作为partition值; 例如partition = 0,所有数据写入分区0。 没有指明partition值但有key的情况下,将key的ha...

2022-05-15 21:08:29 555 1

原创 Kafka消费者发送消息

异步发送Properties properties = new Properties();// 连接集群properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop102:9092,hadoop103:9092");// 手动指定序列化器properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());pr

2022-05-15 18:21:09 574 1

原创 Kafka生产者原理

Producer首先调用send方法进行发送首先会经过拦截器,可以对数据进行一些加工处理随后会经过序列化,kafka并没有采用Java提供的序列化器,而是自己实现的序列化器,但是Java提供的序列化器,会在原有数据的基础上,增加很多的用于安全校验的数据,在大数据的场景下,每次传输的数据量很大,如果在此基础上还要加入大量用于安全校验的数据,严重的影响了效率,所以kafka等中间件,自己实现了序列化器,仅仅进行简单的校验,增加了效率。随后经过分区器,因为kafka可以对topic进行分区

2022-05-15 17:43:25 712 3

原创 Kafka基本概念

1、为了方便拓展,并提高吞吐量,一个topic分为多个partition,每个服务器中只存储一部分数据,broker可以理解为服务器。2、配合分区的设计,提出消费者组的概念,组内每个消费者并行消费,但是一个分区的数据,仅仅允许一个消费者进行消费3、为提高可用性,为每个partition增加若干副本,避免一个服务器挂掉,无法提供服务,每个消费者消费时,仅仅对leader节点进行消费,当leader挂掉,follower可以称为leaderkafka里还有一些信息存储在zookee...

2022-05-14 13:09:11 254 1

原创 有关Dubbo的微内核架构

说到微内核架构,大家首先会想到的是Eclips、IDEA、OSGI、Spring Plugin、SPI等,这些都是我们熟知的微内核架构。微内核架构实现主要是插件化思想(Plug-in),是一套插件体系,最早的插件化方法是应用在操作系统之上,久而久之就有了微内核设计这一思想。了解微内核,需要先了解这个“内核”。在操作系统中,内核围绕于操作系统的核心功能,比如时钟中断、进程创建与销毁、进程调度、进程间通信等内核态的动作。而文件系统、内存...

2022-05-04 19:48:47 347

原创 Feign的最佳实践

RestTemplate方式调用存在的问题String url = "http://userservice/user" + order.getUserId();User user = restTemplate.getForObject(url,User.class);存在下面的问题:代码可读性差,编程体验不统一 参数复杂URL难以维护,一旦参数变化,代码非常难以维护,不够优雅Feign的介绍Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决

2022-04-17 10:49:25 832

原创 Nacos配置管理

统一配置管理如果一个服务有上千个实例,他们一个实例就要有一个配置文件,如果我们想要修改配置文件中的某一个部分,那么我们就需要逐个去修改每个实例的配置文件,毫无疑问这是麻烦的。我们希望这些配置文件能够实现统一的管理,我们别逐个去修改,而是在一个地方改动就可以了,并且改动完成之后这个服务无需去做重启,这些配置立刻生效 --> 配置的热更新。添加配置Data ID命名:服务名称 + profile(当前项目运行环境dev | pro等) + 后缀名(.yaml)配置内容不是一股脑

2022-04-16 15:58:14 282

原创 关于Nacos的知识点和有关的配置

Nacos服务分级存储模型一个服务对应多个实例,最初,所有的实例安放在一个机房之中,这就相当于鸡蛋放在一个篮子里,如果这个机房出现了问题,那整个服务就挂掉了。所以要将一个实例部署多个机房,容灾服务跨集群调用问题为什么要在两者之间添加集群呢,比如杭州的机房中存储有order-service服务,同时也有user-service服务, 上海的机房中存储有order-service服务,同时也有user-service服务,那么当我杭州的order-service想要调用user-se

2022-04-15 22:18:00 1189

原创 SpringCloud配置nacous注册中心

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEAS

2022-04-15 15:47:41 806

原创 最详细的Redis缓存雪崩&&缓存击穿

缓存雪崩缓存雪崩是指同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。给不同的key的TTL添加随机值,避免同一时刻全部失效 30min ± 5min 利用Redis集群提高服务的可用性 给缓存业务添加降级限流策略 给业务添加多级缓存缓存击穿缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且重建业务较复杂的key突然失效了,无数的请求访问会瞬间给数据库带来巨大冲击。互斥锁没有额外的内存消耗,保证了一致性,实现..

2022-04-10 21:29:53 1008

原创 最详细的Redis缓存穿透

缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会被打倒数据库上。即这个数据根本不存在,如果有一个坏人,启用很多个线程,一直对这个不存在的数据发送请求 ,那么请求就会一直被打到数据库上,很容易将数据库打崩。两种解决方案缓存空对象缓存一个空对象在Redis中,优点是实现简单,维护方便,缺点是额外的内存消耗,因为缓存了一些瞎编的id对应的空对象,但是可以通过给对象设置TTL解决,也可能造成短期的数据不一致,如果此时真的存入了一个瞎编的id对应的

2022-04-09 22:47:08 1705

原创 Redis用户查询缓存

目前,我们这个接口是要根据id查询某个店铺的具体信息,使用的Mybitis-plus的方法,直接从数据库中查询,现在我们要将其缓存到redis中,加快查找效率。缓存大致如下客户端发送请求先到达redis中,如果命中,直接将数据返回给用户,如果没有命中,再去数据库中查找,将数据库中的数据返回给用户,同时将缓存存入redis中。 public Result queryById(Long id) { String shopJson = stringRedi...

2022-04-09 22:22:33 3075 1

原创 java的分布式事务

两阶段提交协议第一阶段:事务管理器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交。 第二阶段:事务协调器要求每个数据库提交数据,或者回滚数据。缺点:单点问题:事务管理器在整个流程中扮演的角色很关键,如果其宕机,比如在第一阶段已经完成,在第二阶段正准备提交的时候事务管理器宕机,资源管理器就会一直阻塞,导致数据库无法使用。 同步阻塞:在准备就绪之后,资源管理器中的资源一直处于阻塞,直到提交完成,释放资源。 数据不一致:两阶段提交协议虽然为分布式数据强一致性所..

2022-04-09 20:45:43 927

原创 最详细的基于Session实现登录 + Redis的改进

首先实现发送验证码的功能,即用户输入手机号,先判断入参是否正常,然后这个用户是不是新用户,如果是就注册,然后最终发送验证码,同时将user存入session中,但是user中存有password等私密信息,因此创建一个UserDTO,用于session的传输,最后将UserDTO存入session中 public Result login(LoginFormDTO loginForm, HttpSession session) { String phone = logi..

2022-04-08 23:54:10 929

原创 Nginx相关配置

启动Nginx,到nginx/sbin目录下./nginx1、反向代理的配置一打开浏览器,在浏览器的地址栏输入 www.123.com,跳转到Linux系统tomcat上我们访问一个网址的时候,浏览器会先查询本地有没有缓存这个网址对应的ip地址,如果没有,就会查看本地的host文件中有没有缓存,两个地方都没有,才会请求DNS解析。因为没有www.123.com这个网址,所以我们可以在hosts文件中存一份www.123.com对应的服务器地址找到Nginx的配置文件vi.

2022-04-07 10:15:37 2177

原创 Redis常用操作命令

Redis通用命令通用命令是指部分数据类型的,都可以使用的指令,常见的有String类型的常用命令注:DECR 作用和INCR相反,自减1,DECRBY同理 SETNX其实是组合命令,下面操作效果一致Hash类型Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。String结构是将对象序列化为json字符串后存储,当需要修改对象某个字段时很不方便:Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD..

2022-04-05 23:30:30 845 1

原创 最详细的reentrantlock原理

非公平锁实现原理加锁流程首先,通过CAS将状态由0改为1,如果成功了就将owner线程改为当前线程如果CAS失败,则说明有竞争,进入else分支,进入acquire()方法 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfIn.

2022-04-04 20:31:57 723

原创 关于AQS

全称是AbstractQueuedSynchronized,是阻塞式和相关的同步器工具的框架特点用state属性来表示资源的状态(分独享模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁 getState -获取state状态 setState -设置state状态 compareAndSetState -乐观锁机制设置state状态 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源 提供了基于FIFO的等待队列,类似于Monitor.

2022-04-03 20:24:35 371

原创 十分详细讲述的ThreadPoolExecutor线程池

1、线程池状态ThreadPoolExecutor使用int的高3位来表示线程池状态,低29位表示线程数量,即使用一个整数的不同位来表示这些信息存储在一个原子变量ctl中,目的是将线程池状态与线程的个数合二为一,这样就可以用一次cas原子操作进行赋值2、构造方法最大线程数目 = 核心线程数 + 救急线程数线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。 当线程数达到corePoolSize并没有线程空闲,这时再加入任务,新加的任务会被加入wo

2022-04-01 20:35:26 1958

原创 Unsafe关于cas的相关方法,模拟实现原子整数

因为Unsafe对象是一个私有的静态变量,只能通过反射获取 public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); Unsafe un

2022-03-29 10:09:36 146

原创 java中的原子类

++i 与 i++updateAndGet()这个方法的入参是一个IntUnaryOperator这个类是一个接口类,且被@FuntionalInterface注解,说明这个接口仅仅有一个方法需要实现,即可以配合lamda表达式使用最终i1的值为50,因此其中的x就是要被操作的数 ,此处仅仅是演示 *10,完全可以做复杂的运算,如果过程中x的值被其他线程修改,就继续while-true重新来。直到修改完结果,getAndUpdate同理,即下面这段逻辑。原子引用...

2022-03-26 22:59:06 1059

原创 volatile原理

volatile的底层实现原理是内存配置对volatile变量的写指令后会加入写屏障 对volatile变量的读指令前会加入读屏障如何保证可见性写屏障 保证在该屏障之前的,对共享变量的改动,都同步到主存当中,不光光是对ready同步的,而且会对上边所有的代码进行同步public void actor2(I_Result r){ num = 2; ready = true; // 此处存在写屏障}读屏障保证在该屏障之后,对共享变量的读取,加载的是主存中最.

2022-03-22 20:38:36 149

原创 关于有序性

JVM会在不影响正确性的前提下,调整语句的执行顺序static int i;static int j;//在某个线程内执行如下赋值操作i = ...;j = ...;对于上面的代码,先执行对i的复制,还是先执行对j的赋值,对最终的结果都不会产生影响,所以,上面代码真正被执行的时候,既可以先对i赋值,同时也可以先对j赋值这种特性被称之为【指令重排】,多线程下【指令重排】会影响正确性,为什么要有指令重排这项优化呢?假如加工一个鱼罐头,需要50分钟,只能按照一条鱼一条鱼的顺序加工

2022-03-22 20:02:11 156

原创 关于可见性

t线程中有一个while-true循环,我们试图通过在主方法中将run置为0,让t线程停下来,但是执行程序我们发现,并没有和我们预想的一样,t线程会停下来尝试分析这个过程初始状态,t线程刚开始从主内存读取了run的值到工作内存因为t线程要频繁的从主内存中读取run的值,JIT编译器会将run的值缓存至自己内存中的高速缓存中(底层是CPU中的缓存),减少对主存中run的访问,提高效率一秒之后,main线程修改了run的值,并同步至主内存,而t是从自己工作内存中的高速...

2022-03-22 14:33:44 208

原创 关于ReentranLock

相对于synchronized,它具备如下特点可中断 可以设置超时时间 可以设置为公平锁 支持多个条件变量与synchronized一样,都支持可重入基本用法public class Demo { private static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { lock.lock(); try {

2022-03-21 17:59:42 479

原创 线程的活跃性

死锁一个线程需要同时获得多把锁,这时就容易发生死锁t1 线程 获得A对象锁,接下来想获取B对象的锁t2 线程 获得B对象锁,接下来想获取A对象的锁首先 t1 线程获得A对象锁,t2线程获得B对象锁,0.5秒后,t2尝试获得A对象的锁,陷入阻塞状态,再过0.5秒之后,t1 线程尝试获得B对象锁,也陷入了阻塞,发生了死锁哲学家就餐问题有五位哲学家,围坐在圆桌旁他们只做两件事,思考和吃饭,思考一会儿吃口饭,吃完饭接着思考 吃饭时要用两根筷子吃,桌上共有五根筷子,每位

2022-03-21 15:41:27 239

原创 简单程序的基本运行流程

public class Test { public static void main(String[] args){ int a = 10; int b = Short.Integer.MAX_VALUE + 1; int c = a + b; System.out.println(c); }}上述代码经由javac之后,编译成.class文件,再由类加载器载入进JVM中。常量池载入运行时常量池即将clas.

2022-03-20 19:51:16 664

原创 线程状态的转换

New 创建了一个java线程对象,还未与操作系统的线程相关联起来1箭头 当调用线程对象的start方法,java的线程就和操作系统的线程关联起来了,状态变为runnable(运行状态+阻塞状态)2箭头 调用wait/notify 转到Waitingt线程用synchronized(obj)获取了对象锁后调用obj.wait()方法时,t线程从RUNNING --> WAITING 调用obj.notify(),obj.notifyAll(),t.intertupt()时 竞争..

2022-03-15 20:25:37 451

原创 G1垃圾收集器

同时注重吞吐量和低延迟,默认的暂停目标是200ms 超大堆内存,会将堆划分为多个大小相等的Region G1HeapRegionSize=size ,调整每个Region的大小 整体上是标记 + 整理算法,两个Region之间是复制算法-XX:+UseG1GC JDK9之后默认启用G1收集,JDK9之前若要使用G1收集器需要手动开启Young Collection每个Region都可以独立的作为Eden,幸存者区,老年代。开始的时候,每个格子都是白的,没有创建任何对象,只有..

2022-03-15 16:00:22 424

原创 有关JVM的垃圾回收器

1、串行单线程 堆内存较小的时候,适合个人电脑2、吞吐量优先多线程 堆内存较大,多核CPU 我要在单位时间内,占用的stop the world占用的时间最短 0.2 + 0.2 ,虽然时间长,但是发生的次数少3、响应时间优先多线程 堆内存较大,多核CPU 注重垃圾回收的时候,让单次的stop the world的时间尽可能的短 0.1 + 0.1 + 0.1 + 0.1 + 0.1,即发生很多次,但是每次时间都很短串行垃圾回收器-XX:UseSerialGC = Ser

2022-03-14 23:15:12 663

原创 关于JVM中GC的一些参数

新生代大小NewSize设置的是初始的新生代大小 MaxNewSize设置的是最大的,-Xmn是一起设置 幸存者比例 默认为8,就是在新生代中占80% FullGC 钱 MinorGC,是否要在Full GC之前触发MinorGC ,默认开启下面是没有任何内存占用的堆内存现创建一个数组,大小7MB出现了一次MinorGC(GC代表的就是MinorGC,Full GC是Full GC),[ DefNew 指的是新生代,回收前 -> 回收后(总大小),垃圾回收消耗的时间 ]...

2022-03-14 16:19:55 222

原创 有关Java的分代回收

当我们创建一个对象的时候,首先被放在Eden区,然后不断的创建对象,将Eden区沾满了。当我再要想创建对象的时候,空间已经不够了,就要触发一次Minor GC,将存活的对象,复制到To区,寿命加1,然后清空Eden区,交换From和To区。然后继续分配对象,直到再次满了触发第二次Minor GC,查看幸存者区和Eden区的对象是否能够被垃圾回收,将垃圾回收之后能够存活的对象,放入To区中,同时这些对象的寿命+1,清空垃圾对象,交换To和From区反复多次,直到幸存者区有对象的寿...

2022-03-13 22:48:41 636

原创 JVM中的回收算法

标记清除算法将JVM中没有被GC ROOT引用的对象标记 将没有被标记的对象占用的空间进行释放 把对象所占用内存的起始结束地址,放入空闲列表中 速度快,只需要将垃圾对象的内存起始结束地址记录即可,但容易产生内存碎片,清除之后不会再会进一步对内存碎片进行整理了,如果有很多的内存碎片,此时我想插入一个比较大的对象,明明此时我们的内存是充足的,但是地址却不是连续的,这个对象就无法存储了。标记整理算法将JVM中没有被GC ROOT引用的对象标记 将对象删除的同时,将未被删除的对象向前移

2022-03-13 21:55:55 588

空空如也

空空如也

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

TA关注的人

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