自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 正则表达式心得

`(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+`:匹配一个或多个以"."开头,后面跟着小写字母、大写字母、数字和"-"字符的字符串。- `[-a-zA-Z0-9]{0,62}`:匹配0到62个小写字母、大写字母、数字和"-"字符。- `[-a-zA-Z0-9]`:匹配小写字母、大写字母、数字和"-"字符。- `[a-zA-Z0-9]`:匹配小写字母、大写字母和数字。这个正则表达式规则用于匹配域名。这个正则表达式规则主要用于验证域名的格式是否正确。`:匹配0或1个"."字符。

2023-07-18 09:43:11 146

原创 mysql中MVCC--多版本并发控制

只有InnoDB引擎支持mvcc,mysql默认支持可重复读,就是依赖mvcc实现的。多版本并发控制,主要是为了提高数据库的并发性能,在多事务、高并发的情况下数据不会错乱。同一行数据平时发生读写请求时,会上锁阻塞住。但mvcc用更好的方式去处理读一写请求,做到在发生读-写请求冲突时 不用加锁。不会有锁竞争这个读是指的快照读,就是单纯的selectMVCC保障写者写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他的读者来说是不可见的。当前读,当前读是一种加锁操作,是悲观锁。

2022-12-12 11:14:16 468 1

原创 MyISAM 与 InnoDB区别对比

InnoDB是聚簇索引,聚簇索引的文件存放在主键索引的叶子节点上,因此InnoDB必须要有主键,通过主键索引效率 很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索弓|也都会很大。而MyISAM用一个变量保存了整个表的行数,执行.上述语句时只需要读出该变量即可,速度很快;MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。行级锁操作只锁一行,不对其它行有影响,合适高并发。

2022-12-12 11:12:51 522

原创 java和数据库交互

java通过socket把http协议发送网卡,网卡通过对3306端口的监听收到来自Java进程的http请求(数据库也是http协议),通过3306端口把请求发送给了msql,mysql解析http请求得到sql字符串,然后mysql去磁盘中查询对应的表文件,把表文件或者索引加载到内存中,mysql对表文件中的信息进行筛选,最终得到查询结果,mysql根据建立的连接,然后再通过socket传输到端口,通过3306端口将处理结果返回给Java进程。

2022-12-12 11:08:48 760

原创 mysql锁的机制

根据属性分为共享锁和排他锁按照锁的粒度分类可以把数据库锁分为表级锁和行级锁。

2022-12-11 21:37:32 468

原创 mysql关键字执行顺序

from->on->join->where->group by(开始使用select中的别名,后面的语句中都可以使用别名)->sum、count、max、avg->having->select->distinct->order by->limit。可选字段:distinct、join、on、where、group by、having、sum、count、max、avg、order by、limit。必须字段:select、from。

2022-12-11 21:36:04 727

原创 mybatis中#和$的区别

是占位符,预编译处理;MyBatis会创建预编译的SQL语句,然后在执行SQL时MyBatis会为预编译SQL中的占位符(?)赋值,预编译的SQL语句执行效率高。传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。${}是拼接符, 字符串替换,没有预编译处理。可以有效的防止SQL注入,提高系统安全性。也有适用的情况,比如模糊查询可以使用。${} 对应的变量不会加上单引号”${} 不能防止SQL注入。对应的变量自动加上单引号。

2022-12-11 21:34:44 90

原创 mysql分库分表

阿里提供的开发手册当中,建议: -个表的数据量超过500W或者数据文件超过2G,就要考虑分库分表了。

2022-12-11 21:15:17 545

原创 mysql慢查询优化

通过慢查询定位一些查询比较慢的sq|语询, 在使用explain 具排查该sql语句索引是否有生效 ●EXPLAIN select * from mayikt_ user where id=1;●possible_ keys:表示查询时, 可能使用的索引。●Extra:执行情况的描述和说明询,又是上述三种复杂查询中。●select_ type:表示查询的类型。●rows:扫描出的行数(估算的行数)●key_ _len:索弓字段的长度。●type:表示表的连接类型。●key:表示实际使用的索引。

2022-12-11 21:11:19 327

原创 mysql索引失效

某些查询的时候没有办法使用索引 比如下面的例子 ,因为没有办法使用数据结构 ,索引一般是hash或者btree结构,比如我们一般用某种数据结构二分法查询一个值,可以查到。但是我们查询一个结果,用二分法要求查询不属于某些值的,就没有办法使用数据结构,就使用不了索引。所以核心就是判断一个sql语句能不能通过数据结构来查询出结果,能查询出来就是能够使用索引,不能查询出来就是不能使用索引。,该索引失效,只有当or左右查询字段均为索引时,才会生效。,导致不能命中索引,引发失效。,导致不能命中索引,引发失效。

2022-12-11 21:05:45 3805

原创 mysql索引中最左前缀原则

如果用(B,C)这样的数据来检索的话,就会找不到A使得索引失效。如果使用(A,C)这样的数据来检索的话,就会先找到所有A的值然后匹配C,此时联合索引是失效的。由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。因为辅助聚簇索引是把索引按照组合索引的顺序存到一起的,如果没有最左边一个,那么将定位不到对应的叶子节点。(a,b,c是索引) where后面的条件有没有给a对应的条件。最先匹配最左边的索引,匹配上就继续,如果匹配不上就检索不到。

2022-12-11 20:59:42 992

原创 mysql读写分离操作

依赖于binlog日志 ,是个二进制的文件,插入、修改操作的时候,会写入到binlog文件,然后启动一个log dump异步线程,这个异步线程会把binlog复制到从库上去,从节点/O线程接收binlog内容,,然后写入relay log的日志(中继日志),然后从库会启动一个sql线程去执行这个中继日志里面的inset和update,然后从库就同步了,分成几台数据库服务器,每台都一样,每个数据库的存的数据都一样,同时存几份,通过配置的形式,要么都存失败,要么都存成功。经典的数据库拆分方案,

2022-12-11 20:57:44 398

原创 mysql的索引类型

1.添加PRIMARY KEY(主键索引)4.添加FULLTEXT(全文索引)2.添加UNIQUE(唯一索引)3.添加INDEX(普通索引)

2022-12-11 20:56:49 406

原创 浅谈mysql索引

在内存中把索引文件恢复成一个平衡树结构,树结构会给索引文件里面的数据排序变有序,然后通过树结构查找到我们需要的数据,然后把数据所在的行地址拿出来直接去磁盘表文件上定位到,在没有索引的时候我们需要把整个表加载到内存中,有了索引之后我们只需要从磁盘中把建立好的索引加载到内存中,然后根据索引文件定位到我们需要的数据,这样大大减少的内存的消耗。创建索引的时候会把 这个字段的数据生成索引文件,索引文件包括:索引列数据和行地址,然后调用时会加载到内存当中,:需要生成索引文件,占据空间,

2022-12-11 20:55:35 290 1

原创 包装类的128陷阱

128陷阱 128陷阱是包装器类之间表示的一个陷阱,两个Integer类型的包装类,他们的值,无论是否在-128~127之间,两个对象都是相等的,但是在包装器类中的两个对象,在-128~127范围内是相等的,超出这个范围,比较相等就会返回false(底层是一个cache数组,范围-128-127,如果超过了就会创建新的数组,比较地址不同)。自动装箱:是将基本类型转换成包装器类型(equals);自动拆箱:是将包装器类型转换成基本类型(==)

2022-12-04 15:49:25 276

原创 SpringBoot核心注解

全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties bean,通过这个 bean 获取相应的属性(serverProperties.getPort())。注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式.开启自动扫描符合条件的bean(添加了@Controller、@Service等注解)。

2022-11-16 19:44:52 860

原创 工厂设计模式

比如苹果有创建苹果的工厂,各自有各自的工厂,免除了简单工厂模式的每次新增就会修改工厂代码,各自负责自己的工厂创建,每个工厂决定到底生产哪些产品。工厂的工厂:一个大工厂,里面有具体的不同产品的小工厂,每个生成的工厂都能按照简单工厂模式提供对象,他们自己决定生产哪一些产品。当时当想给添加别的汽车品牌的时候,就需要添加代码,违反开闭原则,需要修改工厂的代码。缺点:当我们新增类的时候,需要去修改工厂配置,增加创建对象的分支,每次都要去修改。,工厂负责创建对象,程序员只需要去调用就行。优点:创建对象分离开,

2022-11-16 19:39:05 57

原创 java建造者模式

(1)建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,良好的封装性是建造者模式的优点之一。(2)需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

2022-11-16 19:28:02 554

原创 java单例模式

如果没有加volatile,不能防止指令重排序,可能对象创建了,但是句柄的地址没有传给属性,判断时还是空,这样就需要继续走第一层if。我们可以选择不给getInstance方法加synchronize锁,而是在这个方法里面去进行加synchronize锁,因为方法锁的范围太广,其他线程阻塞的范围就大,时间就长。,当创建了100个线程,调用getInstance方法时,可能会有多个线程同时看到没有new,就会执行多次new,调用多次构造方法(也就是会进行多次初始化):一个全局使用的类频繁地创建与销毁。

2022-11-16 19:04:29 1400

转载 设计模式6大原则

又叫做最少知道原则,就是说一个对象应当对其它对象有尽可能少的了解,类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大,所以一个对象应该对其他对象保持最少的了解,也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息,迪米特法则初衷在于降低类之间的耦合。举个栗子:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

2022-11-16 18:58:57 174 1

原创 NIO-Socket实现简易聊天室

3.创建Selector选择器,并将通道注册到选择器上边,设置关系事件---》新链接。6.2:将通道的数据写入到缓冲区(buffer)当中。5.3:通道设置完成,将关系事件设置为读取。1.创建NI0通道,并且绑定端口。5.1:建立和客户端连接的通道。5.2:通道设置为非阻塞。4.循环监听通道的事件。6.1:获取客户端通道。5.监听到新连接事件。

2022-11-16 18:56:58 155

原创 BIO、NIO和AIO

同步非阻塞I/O,服务器实现模式为。

2022-11-16 18:52:38 385

原创 hashMap不同版本的区别

因为如果这次插入没有发生Hash冲突的话,那么其实就不会造成扩容。中,但是会重新计算hash值进行分配,这样就会导致无论。的,扩容过程中会将原来的数据,放入到新的。HashMap在1.7中是由。HashMap在1.8中是由。当中,HashMap存储的是。中,HashMap存储的是。

2022-11-13 22:40:34 448

原创 Map的取值的方式

【代码】Map的取值的方式。

2022-11-13 22:30:16 1391

原创 HashTable和HashMap的区别

HashTable和hashMap底层实现原理一样,都是哈希表数据结构。两者都是基于k-v键值对的数据结构,k不可以相同,v可以相同。HashMap:初始化容量16,官网推荐为2的倍数,为了散列均匀,提交存取效率,默认加载因子0.75。HashTable的初始化容量是11,加载因子是0.75. 容量不要求为2的倍数。HashTable的方法都带有synchronized,是线程安全的。两者都是通过数组+链表 数组是主体,链表是为了解决hash冲突。HashTable的扩容是:原容量*2+1。

2022-11-13 22:26:37 257

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

但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。攻击策略:针对冷门数据不断访问,或者访问数据库压根不存在的数据,但是单条数据很难奏效,因为redis会缓存访问量高的数据,redis不缓存,mybatis的一二级缓存也会缓存起来。,当并发量特别大的时候,在缓存中没读到数据,跑到数据库读取数据,给数据库造成压力。数据来的时候,布隆过滤器只需要校验这个数据是否存在。

2022-11-13 19:59:03 3265

原创 【无标题】

如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。save保存 阻塞式持久化 该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止 会形成一个rdb文件,也就是快照。:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。

2022-11-13 19:56:20 358

原创 redis常用存储结构

存储的数据类型:key,value形式存储的 key值是String类型的 value值是下面五种形式set:格式:set key值 value值 ex 秒数 后面这是设置的过期时间查看剩余的时间:ttl key值或者直接设置过期时间:expire key值 秒数get:获取value判断存在哪些key值:keys *清空所有库里面的数据 (谨慎使用:flushall获取类型:type key值查看命令怎么使用:help set 或者? set获取值的长度:strlen key值判断值是否存在:exists

2022-11-13 19:51:32 232

原创 int和float精度

int类型比float类型平均精度高(在-1~1的时候float的精度更高),在float类型范围比int类型大。float是浮点型,浮点型数字一旦小数点后面数字多了必然会丢失精度。因为不可能小数点后面的数字无限的存下去。int是存入整型数据。所以存入的整数是多少就是多少。double类型组成部分:符号位、阶位、数值位。double的数值位高达52位,碾压int类型。float类型组成部分:符号位、阶位、数值位。int类型组成部分:符号位和数值位。平均精度:float。

2022-11-13 19:49:53 1710

原创 记事本实现原理

输入法通过自身程序将键入的信息转化成相关的编码后,便会将这些编码实时的传到位于内存上的,正在被使用的文本文件程序中,这样一来,编码信息就流入到文本文件的进程上了,这是,记事本程序会检测到这些编码信息,于是它会将这些编码信息传入到计算机本地的编码库上,根据用户指定的编码方式进行解码,解码过程实际上就是在编码库中按照编码寻找相应的字符形状信息,找到之后,记事本程序就会将这些点阵信息发送到显存的相应位置上,也就是自己绘制的显示框上边,至此,文字形状正式绘制出来。

2022-11-12 23:03:08 117

原创 CPU相关术语

5.写缺失:(缓存中存在内存变量的地址)两个线程对一个缓存中的变量进行修改,如果一个线程进行删除此变量,另一个就读不到这个变量在内存中的地址了,缺失了。内存中的一小片区域,缓存是将经常使用的数据存到一个离使用着更近的位置,便于访问(经常访问的数据,速度快高昂,滞后性--原本的数据先更新,缓存后知道)4.缓存行填充:由于cpu是单条线进行高低电压传输,缓存只能一次通过传输,这样就可以使一个缓存行填充想要的缓存数据,就不用等待其他类型缓存数据。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期。

2022-11-12 23:00:53 205

原创 访问器和更改器

答: 原有的属性是私有的,通过访问器访问,(没有set)就是只读,如果暴露了数组的地址,那么外部就可以进行修改,打破了只读的规则,所以在访问器中创建一个新的数组(访问器中进行深拷贝),把新的数组暴露给外部,对原来的属性数组没有任何影响。(每次读的时候都new一个新地址,每次都不影响其他的堆地址,每次都是拷贝方法)利用深拷贝数组,保证了数据的安全性,不会出现访问的时候堆地址的指向改变。内存指向是不变的都是指向的Person对象里面的。访问器:能访问私有的变量:例如getAge。

2022-11-12 22:59:25 692

原创 懒汉式--双重检验锁

第一行:为什么是private(防止外部)、volatile(防止指令重排序+可见性(保证其他线程读到正确的数据)--原因:可能导致对象还没创建成功(只分配了空间地址,没有数据)就返回句柄,空指针异常)、static(不必创建对象)场景:有可能多个线程同时进入了第一个if,都读到对象null了,如果第一个线程加上锁创建了对象之后,释放锁之后,如果不进行再次判断null的话,就会再次进行创建对象(以第一个判断null为准),两次就是为了防止多次创建对象。第三行:方法为什么是静态的方法:(不必创建对象调用)

2022-11-12 22:57:09 612

原创 JVM小测

这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象, 在标记完成后, 统一回收掉所有被标记的对象, 也可以反过来, 标记存活的对象, 统一回收所有未被标记的对象。

2022-11-12 22:56:05 190

原创 抽象类和接口的异同点

而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法、可以被定义为pirvate,protected和public,抽象类中的抽象方法·(其前有abstract修饰)不能用private,static,synchronized和native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号{}。,接口和接口支持多继承,类和类之间支持单继承,一个类也可以实现多个接口,但一个类只能继承一个抽象类。3、接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。

2022-11-12 19:16:42 831

原创 ==和equals

假如只重写equals而不重写hashcode,那么hashcode方法就是Object默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址经哈希算法得来的,此时如果两对象s1!然而重写了equals,s1.equals(s2)返回true,根据hashcode的规则,两个对象相等其哈希值一定相等,所以矛盾就产生了,因此重写equals一定要重写hashcode.String类当中的equals(),首先进行的是地址比较,当两个字符串的地址不同时,在进行值的比较。

2022-11-12 16:30:48 163

原创 Final和Finally关键字

如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。如果return的数据是基本数据类型,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。的,所以需要关闭连接,

2022-11-12 16:16:13 825

原创 String、StringBuffer、StringBulider异同点

字符串是不可变的,原因并不是final导致的,string底层是char[]类型的数组,并且这个数组是被final修饰的,也就是说数组一旦被赋值,value地址不可变,而且string并没有提供操作value数组元素的方法。:StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串。底层是一个char数组,就是相当于用char数组一次性申请足够大的空间,能进行拼接 和缓冲区一样 一次性申请足够大的空间。字符串的拼接使用的是append()方法。

2022-11-12 16:14:07 410

原创 一维数组为什么在物理地址上是连续的?

因为物理地址是连续的 因为数组存储的都是相同的数据类型 内存大小是相同的 我们通过截取的方式 拿int类型来说一次截取32位。如果从1开始的话 就是1*32=32 然后从32开始截取32位 最前面的32位就丢失了。因为数组是连续的 如果原地扩展的话 一个数移动所有的数都会跟着移动。数组只记录第一点的地址代表整个的地址 所以一维数组是连续的。所有的计算机只记录一维数组的第一个比特点的位置。然后到1的时候 就从第32位继续截取下一个数。从0开始 0*32=0 然后从0截取32位。

2022-11-12 16:09:46 450

原创 类加载顺序和类初始化顺序

i)、java编译器加载类的二进制字节流文件(.class文件),如果该类有基类,向上一直加载到根基类(不管基类是否使用都会加载)。顺序是:父类静态优先--子类静态---父类的所有非静态(块和构造器)----子类的所有非静态(块和构造器)1.父类的静态代码块和父类的静态变量初始化(至于他俩的先后顺序完全是由他们在代码中的顺序所决定的)。类的加载和链接只执行一次,故static成员也只加载一次,作为类所拥有、类的所有实例共享。类加载器采用双亲委托(自底向上查询)来避免重复加载类,而加载顺序却是自顶向下的。

2022-11-11 23:56:41 611

空空如也

空空如也

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

TA关注的人

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