![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 56
letg
这个作者很懒,什么都没留下…
展开
-
JAVA NIO详解
传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客戌端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这由带来了新的问题,如果线程池中有100个线程,而有100个用户都在进行大文件下载,会导致第101个用户的请求无法及时处理,即便第101个用户只想请求一个几KB大小的页面。分散(Scatter)原创 2022-10-22 17:23:29 · 1027 阅读 · 0 评论 -
redis底层数据结构
redis的string类型是使用simple dynamic string(SDS)来实现的,C语言字符串使用char数组表示,以\0结尾,会使得字符串出现安全问题。rehashidx为上一次rehash的索引,dictEntry 有两个dict字典,需要完成渐进式rehash。rehash时,访问数据会先访问老的,后访问新的,新增则直接访问新的hashtable。encoding为val的编码类型,refcount为引用数,ptr为数据地址。原创 2022-10-13 17:37:31 · 75 阅读 · 0 评论 -
Minio分布式存储入门(使用新版本)
MinlO使用纠删码机制来保证高可靠性,使用highwayhash来处理数据损坏( Bit Rot Protection )。关于纠删码简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。8个文件存在于八个driver,4个为存放校验码,4个存放数据,可以通过纠错码进行恢复。集群部署完成可以通过nginx负载均衡,让集群有一个统一的入口。原创 2022-09-05 09:29:33 · 2788 阅读 · 0 评论 -
RabbitMq(集群搭建)
是一种主从集群,在普通集群的基础上,添加了主从备份,提高了数据可用性。(镜像集群虽然支持主从,但不是强一致,有可能产生丢失数据的风险。集群里面单个节点只有交换机和自己里面声明的队列以及其他节点的队列的元信息,当一个消费者访问当前节点,这个节点不存在该队列,这个节点将会通过队列的元信息找到这个队列所在节点,并返回数据。控制台端口分别是8081、8082、8083。添加队列发现三个节点都有该队列,如果声明队列的节点挂了,队列就不存在了。是一种分布式集群,将队列分散到各个节点上,提高整个集群的并发能力。原创 2022-09-03 17:08:11 · 1422 阅读 · 0 评论 -
rabbitMQ(消息堆积问题)
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。最早接收到的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。原创 2022-09-03 15:01:54 · 1810 阅读 · 0 评论 -
MQ高级特性(消息的可靠性)
将error.queue绑定给error.direct,当routingkey是error,发送给error.queue。当重现重试耗尽,RepublishMessageRevocerer重新投递到指定的交换机error.direct,根据。消费者消费完消息后可以向MQ发送ack回执,MQ收到ack回执才会删除该消息。在spring开启本地重试后,当重试次数耗尽,由MessageRecover接口来处理,它包含三种不同的实现。消费者失败会进行requeue重新入队,然后再次异常,再次入队,重复循环。原创 2022-09-03 11:09:00 · 653 阅读 · 0 评论 -
缓存同步canal实现(订阅binlog)
对于实体类,Canal会将改变的数据注入Item,如果属性名和数据库字段名不一致,需要用注解标明。重启docker,/mysql/data目录下会出现mysql-bin.000001。查看主库的状态(如果从库字段position小于主库,那么就有新的数据要获取了)当canal监听到binlog发生变化,会通知canal客户端。2、基于canal实现缓存同步。1、基于mq实现缓存同步。原创 2022-09-02 23:29:46 · 2138 阅读 · 0 评论 -
多级缓存的原理和实现
对于请求,进来会通过nginx转发到另一个缓存nginx,缓存nginx查询后端,如果配置集群,只有访问到的那一台服务器有数据,所以不使用轮询,使用hash $request_uri;OpenResty为Nginx提供了shard dict的功能,可以在nginx的多个worker之间共享数据,实现缓存功能。:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。设置缓存为软引用或者弱引用,利用GC来回收,性能差,不建议使用。原创 2022-09-02 16:25:38 · 2221 阅读 · 0 评论 -
安装OpenResty
opm是OpenResty的一个管理工具,可以帮助我们安装一个第三方的Lua模块。添加仓库后,未来安装或更新只需要通过yum check-update命令。如果需要做Lua编程,就要删除nginx中大量的注释,方便编写。原创 2022-09-01 14:15:05 · 813 阅读 · 0 评论 -
分布式事务seata入门
但是如果两个线程同时进来,一个需要db锁进行回滚,一个需要全局锁,造成死锁,通过获取全局锁设置时间间隔30ms,重试10次,获取不到就释放db锁进行数据库事务回滚,第一个事务就可以获取db锁就行数据恢复。AT模式的TM调用事务分支后,RM会先保存数据快照undo-log后执行sql并提交,然后报告事务的状态,如果TC判断全部提交,就可以删除log,如果失败,就可以基于log恢复数据,再删除log。RM在XA中为数据库,第一阶段事务协调者让RM准备,但不提交,如果都就绪了,那就成功了,第二阶段进行统一提交。.原创 2022-08-31 18:12:03 · 615 阅读 · 0 评论 -
SpringCloud之Sentinel入门
对于浏览器和网关来说,这两个来源的请求都是没有orgin的,我们可以在网关的默认过滤上添加请求头origin,即可以区分请求是从浏览器还是网关发送过来的。默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。当超出了失败阈值,断路器会打开,所有请求在一段时间内无法进入,当熔断时间结束后,会处于一个hafl_open状态,会尝试放行一次请求,如果成功,就会关闭断路器,否则继续熔断一段时间。...原创 2022-08-30 18:05:19 · 2167 阅读 · 0 评论 -
elasticsearch入门
字段的数据类型,常见字符串有text(可分词)、keyword(j精确值,如国家、品牌、ip)数值分为long、integer、short、double、byte、float。是否创建索引,默认为true。分词器,只能结合text用。该字段的子字段,例如姓和名。布尔:boolean。...原创 2022-08-28 16:03:49 · 286 阅读 · 0 评论 -
JAVA原理
1.8与1.7的区别是,1.8將永久代变为元空间放在本地内存,而1.7永久代的对象是放在堆内。JVM内存分为堆(唯一共享)、虚拟机栈、本地方法栈、程序计数器、方法区(唯一共享)。原创 2022-08-27 17:41:25 · 673 阅读 · 0 评论 -
微服务原理
服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中获取服务列表来完成服务调用。P就是在分布式环境中,由于网络的问题可能导致某个节点和其它节点失去联系,这时候就形成了P(partition),也就是由于网络问题,将系统的成员隔离成了2个区域,互相无法知道对方的状态,这在分布式环境下是非常常见的。...原创 2022-08-26 10:15:59 · 832 阅读 · 0 评论 -
分布式原理
例如A对B请求服务,假如A第一次请求B没有回应,在分布式系统中,存在重试机制,A会再次请求,假如第一次成功了,就需要做幂等性操作。不论执行多少次,操作都和执行一次的结果是相等的。...原创 2022-08-26 09:38:16 · 340 阅读 · 0 评论 -
Redis原理
对于混合持久化,AOF在重写时,不再适用RESP命令写入AOP,而是重写这一刻之前的内存做RDB快照处理,将RDB快照内容和AOF增量修改命令存在一起。写入新的AOF文件。如果没有保证主从的时钟一致性,slave比master走得快,master里面大量的key在从节点其实已经过期,而在master里面还没有过期,slave切换为主节点,master就会删除大量过期的key,主线程会发生阻塞,无法处理客户端的请求。大量的并发访问一个缓存,同一个数据是在相同的节点上,会造成节点挂掉,造成缓存雪崩。...原创 2022-08-26 08:49:47 · 1382 阅读 · 0 评论 -
SpringAop实现日志
2、@Retention: 指定注解的生命周期(源码、class文件、运行时),其参考值见类的定义:java.lang.annotation.RetentionPolicy。4、@Inherited:指定子类可以继承父类的注解,只能是类上的注解,方法和字段的注解不能继承。3、@Target:指定注解使用的目标范围(类、方法、字段等),其参考值见类的定义:java.lang.annotation.ElementType。1、@Documented:指定被标注的注解会包含在javadoc中。...原创 2022-08-17 23:05:45 · 250 阅读 · 0 评论 -
spring、springboot原理
REQUIRED情况下,父和子使用同一个事务,被调用方出现异常,无论是否catch到,事务都会回滚,而在NETSTED情况下,被调用方发生异常,调用方可以catch到异常,只有子事务会回滚,父事务不会。首先实例化Bean,当客户向容器请求一个尚未初始化的Bean或者尚未初始化的依赖Bean时,容器会调用doCreateBean()方法进行实例化,实际上就是利用反射的方式创造出一个bean对象。REQUIRED_NEW新建的事务和和原有的事务无关,如果原有的事务发生异常,父事务会回滚,不影响子事务。.....原创 2022-08-16 21:43:59 · 293 阅读 · 0 评论 -
Dockerfile运行springboot
1、将项目打包,打成jar包后放入2、编写Dockerfile文件2、构建镜像3、运行容器4、测试原创 2022-06-16 16:14:54 · 868 阅读 · 0 评论 -
Dockerfile保留字以及构建镜像
1、保留字2、案例centos镜像具备jdk8和vim以及ifconfig1、在根目录新建一个myfile,放入jdk-8u333-linux-i586.tar.gz2、编写makefile3、构建原创 2022-06-13 17:51:36 · 284 阅读 · 0 评论 -
并发编程-Day06-2
一、指令重排1.1 cpu底层每条指令可以分为取指令、指令译码、执行指令、内存访问、数据写回五阶段。可以划分为五级指令流水线,即会出现指令重排。但是前提是不影响正确性。1.2 问题多线程会出现问题,JIT即时编译器在编译会进行指令重排。 添加volatile的变量在使用能防止使用这个变量前面的代码重排序。1.3 volatile的原理(保证了可见性和有序性,但不能解决指令交错,JDK1.5后生效)对volatile的变量写指令会加入写屏障对volatile的变量读指令会 加入读屏障写屏原创 2022-05-24 22:19:03 · 81 阅读 · 0 评论 -
并发编程-Day06
一、JMM内存模型1.1 概念JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。1.2 特性原子性-保证指令不会受到线程上下文切换的影响工可见性-保证指令不会受cpu缓存的影响有序性-保证指令不会受cpu指令并行优化的影响1.3 可见性Slf4j(topic = "c.Test04")public class Test04 { static Boolean flag = true; pu原创 2022-05-24 11:11:48 · 50 阅读 · 0 评论 -
并发编程-Day02
1.1两阶段终止模式: Thread t1 = new Thread(() -> { while(true) { try { if (Thread.currentThread().isInterrupted()) { log.debug("处理后事"); break;原创 2022-05-23 10:37:10 · 54 阅读 · 0 评论 -
并发编程-Day05-1
3原创 2022-05-23 10:35:57 · 63 阅读 · 0 评论 -
并发编程-Day04
一、1.1 wait和notify线程wait会释放锁进入waitSet等待,owner线程使用notify会唤起等待队列的线程进入EntryList继续参与竞争。 new Thread(()->{ synchronized (object){ try { Thread.sleep(2000); } catch (InterruptedException e) {原创 2022-05-22 22:44:16 · 88 阅读 · 0 评论 -
并发编程-Day03
一、Monitor原理1.1 Monitor有WaitSet、EntrySet、Owner当线程进入临界区,通过obj的markword指向Monitor会检查这个Monitor是否有线程占用,即Owner是否指向其他线程,没有则使用,如果有存在,就进入EntrySet等待,进入一个阻塞状态。1.2 MarkWord:二、加锁2.1 锁对象:包含对象头、对象体对象头:包含markword(存放age,hashcode,状态等)和klassword(包含类型指针)对象体:存放成员变量2.2原创 2022-05-21 23:11:13 · 211 阅读 · 0 评论 -
并发编程--Day01
一、概念1.1、进程与线程windos查看进程tasklist | findstr 关键词tasklist | findstr java查看所有的java进程jps杀死进程taskkill /f /pid 对应的pid1.2 线程上下文切换cpu不再执行当前线程,转而执行另一个线程的代码线程的CPU时间片使用完垃圾回收有更高优先级的线程需要执行线程自己调用了sleep,yield,wait,join,park,synchronized,lock等方法上下文切换频繁会原创 2022-05-19 16:20:09 · 91 阅读 · 0 评论 -
vue中关于mavon-editor的使用
1、npm 下载 mavon-editornpm install mavon-editor --save2、引入 import Vue from 'vue' import mavonEditor from 'mavon-editor' import 'mavon-editor/dist/css/index.css' // use Vue.use(mavonEditor) new Vue({ 'el': '#main', data原创 2022-05-10 15:06:34 · 3437 阅读 · 1 评论 -
CentOs7通过docker安装单点运行elasticsearch
elagticsearch原创 2022-04-22 13:50:41 · 1993 阅读 · 0 评论 -
SpringSecurity执行原理(认证)
SpringSecurity原理原创 2022-04-17 14:37:23 · 210 阅读 · 0 评论 -
linux下载配置mysql
linux配置mysql转载 2022-03-19 09:54:18 · 96 阅读 · 0 评论 -
Linux下载配置jdk
在线下载或者从本地获取jdk压缩包在线下载:`wget 路径本地获取:直接拖入或者使用命令rz配置环境变量在/etc/profile的最后一行添加export JAVA_HOME=/usr/local/jdk1.8.0_202/export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATHexport JAVA_PATH=${JAVA_HOME}/bin:${.原创 2022-03-18 07:12:15 · 1164 阅读 · 0 评论 -
Application.yml配置
#端口号server: port: 8078spring: #数据源配置 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/yeb?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: 123456 # 连原创 2021-11-21 15:28:23 · 1171 阅读 · 0 评论 -
爬虫工具类
爬虫工具类实现HttpGet和连接池以及对请求配置和连接池配置@Componentpublic class HttpGetUtil { private PoolingHttpClientConnectionManager manager; public HttpGetUtil(){ this.manager = new PoolingHttpClientConnectionManager(); this.manager.setDefaultMaxPerR原创 2021-11-16 23:11:20 · 220 阅读 · 0 评论 -
Java爬虫篇(一)
Java爬虫入门1、需要的相关依赖<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version></dependency>1、get传参请求http://www.baidu.com通过实例URIBuild原创 2021-11-15 00:02:52 · 265 阅读 · 0 评论 -
前后端日期时间处理问题
数据库获取日期时间返回json转换为时间戳问题解决方法: 在实体属性上添加注解 @JsonFormat(pattern=“yyyy-MM-dd”,timezone = “GMT+8”)后端接收前端的date无法接收问题解决办法:在实体属性上添加注解@DateTimeFormat(pattern = “yyyy-MM-dd”)...原创 2021-07-31 12:03:51 · 418 阅读 · 0 评论 -
log4j配置文件
log4j配置文件### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABS原创 2021-07-25 11:36:59 · 51 阅读 · 0 评论 -
使用TCP协议将用户发送的信息接收并保存
使用TCP协议将用户发送的信息接收并保存客户端:Socket socket = null; try { socket = new Socket(InetAddress.getByName("10.17.128.82"), 12439); OutputStream outputStream = socket.getOutputStream(); Scanner sc= new Scanner(System.in); String str = sc.nextLine原创 2020-12-19 16:40:18 · 1324 阅读 · 2 评论 -
TCP协议发送和接收数据
TCP协议发送与接收数据一、发送数据1、使用Socket类的构造方法创建Socket对象Socket(InetAddress address, int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。2、获取输出流对象InputStream getInputStream()3、使用输出流写数据write(byte[] buf)二、发送数据1、创建ServerSocket对象ServerSocket(int port)2、获取发送端的Socket对象Socket原创 2020-12-19 15:37:16 · 4083 阅读 · 2 评论 -
序列化流和Properties类与IO流的操作
序列化流和Properties类的操作1、(序列化流)ObjectOutputStream:可以将java对象的基本数据类型写入OutputStream,所以可以将java对象通过该流写入文件中。主要方法: void writeObject(Object obj)2、(反序列化流)ObjectInputStream:可以使用 ObjectInputStream 读取(重构)对象,可以将已序列化的对象读取。主要方法: Object readObject()3、Properties:表示了一个持久的属原创 2020-12-15 18:34:03 · 112 阅读 · 0 评论