自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Zookeeper

Zookeeper2020-4-28 ——https://www.bilibili.com/video/BV1M741137qY?p=74https://zookeeper.apache.org/一、简介/快速入门ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group

2021-10-24 22:06:53 1411

原创 关于String Integer的== 与 equals

public class ValueTest { public static void main(String[] args) { int i1 = 128; Integer i2 = 128; Integer i3 = 128; // Integer 与int 比较,Integer会自动拆箱 System.out.println(i1 == i2);// true System.out.printl

2021-07-19 14:25:18 333

原创 不同编码方式之间区别

编码方式英文字符长度 (包括标点符号)中文字符长度 (包括标点符号)ASCII码1个字节2个字节UTF-8编码1个字节3个字节Unicode编码2个字节2个字节GBK1个字节2个字节位:数据存储的最小单位。每个二进制数字0或者1就是1个位;字节:8个位构成一个字节;即:1 byte (字节)= 8 bit(位);1 KB = 1024 B(字节);1 MB = 1024 KB; (2^10 B)1 GB = 1024 MB...

2021-07-15 00:03:56 317

原创 关于vachar存储汉字数量的问题

具体还是要看版本的4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)5.0版本以上,varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。自己在数据库中建个表测试下可以放多少个汉字。示例:以5.0以上版本为例。新建表:CREATE TABLE varchar_test (`id` int(11) NOT NULL ,`string` varchar(20

2021-07-14 23:55:31 571

原创 缓存雪崩、穿透、击穿

2021-07-04 21:54:13 84

原创 判断一个指定格式字符串的时间是否是今天

def is_today(time_str): start_time_str = str(datetime.now().date()) + ' 00:00:00' end_time_str = str(datetime.now().date()) + ' 23:59:59' start_time = time.strptime(start_time_str, '%Y-%m-%d %H:%M:%S') end_time = time.strptime(end_time_str.

2021-07-03 19:38:19 397

原创 java集合

1、List与Set项目Listset重复对象允许不允许null值可以多个只能一个是否有序插入顺序保持一致无序遍历方式下标、迭代器迭代器效率查询高、插入删除低,可能引起元素位置改变删除、插入效率高,查询底,hash不冲突,O(1)2、Vector、ArrayList与LinkedList对比项vectorArrayListLinkedList安全线程安全不安全不安全底层数据结构数组数组双向.

2021-06-30 13:46:44 83 2

原创 BIO NIO AIO

基本概念IO流Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。同步针对请求,一个任务的完成之前不能做其他操作,必须等待异步针对请求,一个任务的完成之前,可以进行其他操作阻塞是相对于CPU(针对客户端)来说的, 挂起当前线程,不能做其他操作只能等待非阻塞是相对于CPU(针对客户端)来说的,无须挂起当前线程,可以去执行其他操作内核空间程序与硬

2021-06-29 23:32:46 77

原创 docker常见问题

常见概念DockerDocker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。Go语言开发,C/S架构,具有隔离、快速、轻便的特点。镜像 容器 仓库容器使用镜像创建的运行实例。可以把容器看作是一个简易版的Linux环境。唯一区别是容器的最上层是可读可写的。仓库集中存放镜像文件的场所。Docker本身是一个容器运行载体或者称之为管理引擎,我们把应用程序和配置依赖打包好形成一个可以交付的运行环境,这个打包好的运行环境就是i

2021-06-29 15:08:28 164 2

原创 分布式事务

消息队列中的事务主要解决的是消息生产者和消息消费者的数据一致性问题2PC(Two-phase Commit,也叫二阶段提交)TCC(Try-Confirm-Cancel)事务消息RocketMQRocketMQ 事务消息的实现原理基于两阶段提交和定时事务状态回查来决定消息最终是提交还是回滚,RocketMQ 先执行第一部分的事务,如果失败则回滚,如果成功则定时任务会去回查到事务执行成功,这个时候通知消费者执行第二阶段的事务,如果失败则不断重发消息给消费者消费,如果成功则整个流程走完,保证了事务

2021-06-29 11:13:08 105

原创 消息的积压

消息积压其实对于一个原本正常的消息系统来说消息积压,只会出现两种情况:要么生产者消息数量增加导致的积压;要么就是消费者消费变慢导致的消息积压。对于一个消息队列我们肯定在上线前就预估好,单节点最大承受流量与系统目前最大峰值流量的数据,一般情况下消息队列收发性能是远大于业务处理性能的,一旦出现的话问题也很显而易见:要么就是流量突然增加,要么就是业务逻辑异常。生产端一般当生产端发生积压(Broker正常的情况下)就要查看你的业务逻辑是否有异常的耗时步骤导致的。是否需要改并行化操作等。Br

2021-06-28 16:43:37 225

原创 消息顺序消费

顺序消息的场景可能用的比较少,但是还是有的 比如一个电商的下单操作,下单后先减库存然后生成订单,这个操作就需要顺序执行的 那怎么保证顺序呢?首先生产者需要保证入队的顺序,入队都是乱的那再厉害的MQ也招架不住啊一般的MQ都能保证内部Queue是FIFO的(先进先出),但是只是针对一个Queue,所以在发送消息的时候可以使用Hash取模法将同一个操作的消息发送到同一个Queue里面,这样就能保证出队时是顺序的了。消费者也需要注意,如果多个消费者同时消费一个队列。一样可能出现顺序错乱的情况。这就相当于是

2021-06-28 16:15:04 592

原创 消息丢失(可靠性传输)

RabbitMQ生产者发送消息阶段丢失// 开启事务channel.txSelecttry { // 这里发送消息} catch (Exception e) { channel.txRollback // 这里再次重发这条消息}// 提交事务channel.txCommittransaction机制,然而缺点就是吞吐量下降了。因此,生产上用confirm模式的居多。一旦channel进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID

2021-06-28 15:24:08 253 1

原创 消息重复消费

1、产生重复消费的原因无论是那种消息队列,造成重复消费原因其实都是类似的。正常情况下,消费者在消费消息时候,消费完毕后,会发送一个确认信息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除。只是不同的消息队列发送的确认信息形式不同,例如RabbitMQ是发送一个ACK确认消息,RocketMQ是返回一个CONSUME_SUCCESS成功标志,kafka offset的概念,kafka offset概念:就是每个消息写进去,都有一个offset,代表他的序号,然后consumer消费

2021-06-28 14:12:52 1786

原创 优化SQL语句

1、一般步骤  通过以下命令可以了解数据库的执行频率,到底是以查询为主还是以插入更新为主。show STATUS like 'Com_%'Com_select:执行SELECT操作的次数,一次查询只累加1。Com_insert:执行INSERT操作的次数,对于批量插入的INSERT操作,只累加一次。Com_update:执行UPDATE操作的次数。Com_delete:执行DELETE操作的次数上面的数据针对所有的存储引擎都会出现,但是下面的数据只会在InnoDB中出现。Innodb

2021-06-27 00:41:05 164 1

原创 Mybatis缓存

一般提到MyBatis缓存的时候,都是指二级缓存。一级缓存(也叫本地缓存)默认会启用,并且不能控制,因此很少会提到。SqlSession: 对外提供了用户和数据库之间交互需要的所有方法,隐藏了底层的细节。默认实现类是DefaultSqlSession。Executor: SqlSession向用户提供操作数据库的方法,但和数据库操作有关的职责都会委托给Executor。Executor有两个实现类,和一级缓存关联的是BaseExecutor。BaseExecutor: BaseExecutor是一个

2021-06-26 18:09:45 102 1

原创 行为模式-—策略模式

1、定义定义一系列算法,封装每个算法,并使他们可以互换,不同的策略可以让算法独立于使用它们的客户而变化2、案例TransportStrategy(抽象策略):抽象策略类,并且定义策略执行入口CarStrategy、ShipStrategy、PlaneStrategy(具体策略):实现抽象策略,实现run()方法Context(环境):运行特定的策略类。public class Test { public static void main(String[] args) {

2021-06-25 23:58:53 115

原创 JVM参数

1、常见的参数JVM常见的参数主要分以下三类:标准参数:-开头,,通过java -help进行查询非标准参数:-X开头,,通过java -X进行查询不稳定参数,-XX开头,,通过java -X进行查询java -XX:+PrintCommandLineFlags : 查看当前命令的不稳定指令。java -XX:+PrintFlagsInitial: 查看所有不稳定指令的默认值。java -XX:+PrintFlagsFinal: 查看所有不稳定指令最终生效的实际值。2、常见的命令

2021-06-25 11:52:12 278

原创 抽象类与接口

1、区别项目抽象类接口设计层面模板设计行为规范子类单继承多实现构造方法可以有不能有静态方法可以有可以有,只能public,默认public静态成员变量任意访问类型的public static final类型,并且默认即为public static final类型抽象方法public,protectedpublic,并且默认即为public abstract普通方法可以有default方法interface A {

2021-06-24 23:08:40 58

原创 equals与hashCode

1、关于Object的这两个方法总结:Object时所有类的父类,默认的equals()方法时对地址进行比较,而hashCode()方法的时根据地址进行计算;equals()方法比较结果相等,那么hashCode()方法计算的结果也必须相等;equals()方法比较结果不相等,那么hashCode()方法计算的结果也未必不等;在一个应用期内,在equals()比较中,如果信息未发生该百年,那么多次调用hashCode(),值必定相等,但多个应用期内,无要求;2、为什么重写equals

2021-06-24 10:40:26 349

原创 类加载机制

1、概念  Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、 转换解析和初始化, 最终形成可以被虚拟机直接使用的Java类型, 这个过程被称作虚拟机的类加载机制型的加载、 连接和初始化过程都是在程序运行期间完成的2、生命周期  加载、 验证、 准备、 初始化和卸载这五个阶段的顺序是确定的, 类型的加载过程必须按照这种顺序按部就班地开始, 而解析阶段则不一定: 它在某些情况下可以在初始化阶段之后再开始。这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚期绑

2021-06-23 21:24:24 82 1

原创 class文件结构

无符号数属于基本的数据类型, 以u1、 u2、 u4、 u8来分别代表1个字节、 2个字节、 4个字节和8个 字节的无符号数表是由多个无符号数或者其他表作为数据项构成的复合数据类型, 为了便于区分, 所有表的命名都习惯性地以“_info”结尾魔数(Magic Number) , 它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。Class文件的魔数取得很有“浪漫气息”,值为0xCAFEBABE(咖啡宝贝? )次版本号(Minor Version) , 曾经在现代Java.

2021-06-23 14:50:50 72

原创 MySQL的主从复制

一主多从复制架构多级复制架构双主复制/Dual Master架构双主级联复制异步复制半同步复制

2021-06-22 22:25:38 117 1

原创 垃圾收集器

1、对象已死?1.1、引用计数法在对象中添加一个引用计数器, 每当有一个地方引用它时, 计数器值就加一; 当引用失效时, 计数器值就减一引用计数算法(Reference Counting) 虽然占用了一些额外的内存空间来进行计数, 但它的原理简单, 判定效率也很高,单纯的引用计数就很难解决对象之间相互循环引用的问题1.2、可达性分析算法  可达性分析(Reachability Analysis) 算法来判定对象是否存活的,这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始

2021-06-22 16:52:43 84

原创 线程池概述

1、基本概念 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable

2021-06-21 00:41:58 82

原创 cat详解

1、概念cat命令(concatenate的缩写)是Linux操作系统中使用最广泛的命令行实用工具之一。它是一个标准的Linux实用程序,用于查看文件的内容,而不需要在任何文本编辑器中打开它。cat命令的另一个主要用法是将多个文件串联到一个文件中。2、基本参数参数含义-n显示行号(空行也编号)-s合并多行空行为一行-b显示行号(空行不编号)-e每行结尾处显示$--help显示帮助信息-version显示版本信息3、基本语法ca

2021-06-18 21:10:40 23900

原创 线程的等待与唤醒

1、Object的wait()与notify()public class Test { private static Object lock = new Object(); public static void main(String[] args) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + "开始执行"); sy

2021-06-17 10:34:16 352

原创 MySQL的锁

表锁  MySQL 在引擎之上支持表级别的锁,在数据备份、数据同步等场景下,可以通过表级锁确保获得完整一致的数据。表读锁情况:sessionAsessionBLOCK TABLE course READ;-SELECT * FROM course;(正常返回数据)-insert Into course (cname,tid) VALUES (“java”,3);(添加/修改/删除数据阻塞)UNLOCK TABLES(阻塞的行为进行执行)表写锁情况:

2021-06-14 16:11:09 59

原创 MySQL的四种事务隔离级别

本文实验的测试环境:mysql> select version() from dual;+-----------+| version() |+-----------+| 5.7.31 |+-----------+1 row in set (0.00 sec)一、事务的基本要素(ACID)  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说

2021-06-08 14:22:32 147 1

原创 Redis内存

一、过期key的删除策略定时策略:在设置键的过期时间的同时,创建⼀个定时器。当键的过期时间来临时,⽴即执⾏对键的删除操作。惰性策略:每次获取键的时候,判断键是否过期,如果过期的话,就删除该键,如果没有过期,则返回该键。定期策略:每隔⼀段时间,对键进⾏⼀次检查,删除⾥⾯的过期键 。Redis中过期的key是由主线程删除的,为了不阻塞⽤户的请求,所以删除过期key的时候是少量多次。 举例如下:每秒进⾏10次过期扫描,每次从过期字典中随机选出20个key删除20个key中已经过期的key如果过期

2021-06-07 11:09:41 5134

原创 @Resource和@Autowired区别

1、⾃动绑定(Autowiring)模式模式说明no默认值,未激活Autowiring,需要手动执行依赖注入对象byType根据被注入属性的类型作为依赖类型进行查找,并将对象设置到该属性byName根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性constructor特殊的byType类型,⽤户构造器参数@Autowired是Spring中的注解, @Resource是JSR-250中提供的注解,即Java提供的注解,从包名就可以

2021-06-07 10:22:40 108 2

原创 Statement与PreparedStatement

Statement  Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。具体步骤:1.首先导入java.sql.*;这个包。2.然后加载驱动,创建连接,得到Connection接口的的实现对象,比如对象名叫做conn。3.然后再用conn对象去创建Statement的实例,方法是:Statement stmt = conn.creatStatement("SQL语句字符串");  Statement

2021-06-03 15:06:34 418

原创 关于<short s = 1,s = s + 1>的问题

隐式类型转换可以从小到大自动转,即byte->short->int->long如果反过来会丢失精度,必须进行显示类型转换。s=s+1这句先执行s+1然后把结果赋给s,由于1为int类型,所以s+1的返回值是int,编译器自动进行了隐式类型转换所以将一个int类型赋给short就会出错,而 s+=1 不同由于是 += 操作符,在解析时候s+=1就等价于s = (short)(s+1)...

2021-06-03 00:04:26 124

原创 控制线程的执行顺序

public class Test { static Thread thread1 = new Thread(() -> System.out.println(Thread.currentThread().getName() + " 执行完毕!"), "thread1"); static Thread thread2 = new Thread(() -> System.out.println(Thread.currentThread().getName() + " 执行完毕!")

2021-06-02 18:01:34 104

原创 静态代码块与构造函数的运行顺序

加载顺序:特别注意:静态代码块和静态成员变量之间的具体加载顺序由编写顺序决定,构造代码块与非静态成员变量之间的具体加载顺序同样由编写顺序决定。父类的静态成员变量 以及父类静态代码块(只会加载一次)子类的静态成员变量 以及子类的静态代码块 (只会加载一次)父类的非静态成员变量以及父类构造代码块 (以下是有多少个对象就会加载多少次)父类无参构造方法子类的非静态成员变量以及子类构造代码块子类调用的构造方法public class Test { public static void ma

2021-06-02 17:27:50 93

原创 创建对象的方式

public class Test { public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException, CloneNotSupportedException { /*1、new 调用构造方法*/ Person person = new Person(); System.out.

2021-06-02 17:17:32 50

原创 SpringBean的实例化方式

Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC容器中根据Bean定义创建Bean主要有以下几种方式: <!--第一种:使用构造器实例化Bean--> <!--无参构造--> <bean name="user1" class="com.irrigation.synthetic.util.Us

2021-06-02 16:51:35 177

原创 Spring Boot:项目启动时执行特定方法

在平时的开发中可能遇到这样的问题,在springboot 容器启动之后执行特定的方法或者类。Springboot给我们提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner。这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方法。他们都是在SpringApplication 执行之后开始执行的。这两个接口中有一个run方法,我们只需要实现这个方法即可。这两个接口的不同之处在于:ApplicationRunner中run方法的参数为A

2021-03-12 16:07:06 270

原创 Apache Commons Collections包和简介

背景介绍Apache Commons是Apache软件基金会的项目,曾经隶属于Jakarta项目。Commons的目的是提供可重用的、解决各种实际的通用问题且开源的Java代码。Commons由三部分组成:Proper(是一些已发布的项目)、Sandbox(是一些正在开发的项目)和Dormant(是一些刚启动或者已经停止维护的项目)。Commons Collections包为Java标准的Collections API提供了相当好的补充。在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。让我

2021-03-12 15:45:01 4981

原创 如何避免SQL注入

SQL注入原理不做解释了,大家都知道危害嘛:-- 本来我只想获取id=2的数据SELECT id,NAME FROM areaWHERE id = -- 正常的参数2 -- 后面是sql注入追加的参数or 1 = 1 UNIONSELECT-- 前面有几列数据,你后面联表查询也必须有相同数量列的数据才可以执行成功 1,-- 数据库版本 version() UNIONSELECT 1,-- 数据库 DATABASE () UNIONSELECT 1,--

2021-01-27 15:53:18 1091

空空如也

空空如也

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

TA关注的人

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