自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 资源 (2)
  • 收藏
  • 关注

原创 Mysql8.0变更特性

mysql8.0特性

2023-08-08 18:19:57 244

原创 正向代理和反向代理

正向代理与反向代理

2022-12-06 23:13:32 141 1

原创 设计模式之禅-策略模式

设计模式之禅-策略模式

2022-07-16 00:04:23 149

原创 mybatis-执行流程

mybatis-流程

2022-07-10 00:05:31 159

原创 mybatis-缓存

mybatis-缓存

2022-07-09 23:39:18 1313

原创 mybatis-XML 映射器标签

mybatis-xml映射标签

2022-07-09 23:05:39 200

原创 初识mybatis

初识mybatis

2022-07-09 22:28:17 183

原创 zookeeper-选举流程

基本概念集群机器 ID集群机器 ID 是指 myid,它是每一个集群机器中的编号文件,代表 ZooKeeper 集群服务器的标识,手动生成,全局全一。事务 ID事务 ID 是指 zxid,Zookeeper 会给每个更新请求分配一个事务 ID,它是一个 64 位的数字,由 Leader 统一进行分配,全局唯一,不断递增,在一个节点的状态信息中可以查看到最新的事务 ID 信息。集群服务器角色Zookeeper 集群服务器有以下 3 种角色:Leader(主)Follower(从,参与投票)O

2022-05-20 19:15:43 1706

原创 Zookeeper-集群、Paxos算法、ZAB 协议

1.集群角色Zookeeper中分为Leader,Follower,Observer三种角色。Zookeeper集群中所有的机器通过一个Leader选举过程来选定一台Leader机器,Leader既可以为客户端提供写服务又能提供读服务。Follower和Observer都只提供读服务。Follower和Observer唯一的区别是Observer不参与Leader的选举过程,也不参与写操作的“过半写成功”策略,因此Observer机器可以在不影响写性能的情况下提升集群的读性能。2.paxos算法

2022-05-20 19:03:09 346

原创 Zookeeper-认识

1.简介Zookeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。(1)Zookeeper本身就是一个分布式程序,主要半数以上节点存活,Zookeeper就能正常服务。(2)为了保证高可用,最好以集群方式,这样只要集群中大部分机器是可用的,Zookeeper本身仍然可用。(3)Zookeeper将数据保存在内存中,保证了高

2022-05-20 18:25:11 287

原创 最长快乐字符串

题目果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:s 是一个尽可能长的快乐字符串。s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。如果不存在这样的字符串 s ,请返回一个空字符串 “”。示例 1:输入:a = 1, b = 1, c = 7输出:"ccaccb

2022-02-11 00:45:56 169

原创 redis分布式锁-Redisson

当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件互斥在分布式高并发的条件下,我们最需要保证,同一时刻只能有一个线程获得锁,这是最基本的一点。防止死锁在分布式高并发的条件下,比如有个线程获得锁的同时,还没有来得及去释放锁,就因为系统故障或者其它原因使它无法执行释放锁的命令,导致其它线程都无法获得锁,造成死锁。Redisson目前基于Redis实现的分布式锁常用的框架是Redisson,它的使用比较简单,在项目中引入Redisson的依赖,然后基于Redis实现分布式锁的加锁

2022-02-10 01:27:19 2979 3

原创 redis一致性hash和hash槽

redis一致性hash和hash槽

2022-02-09 00:55:35 3494

原创 redis的主从、哨兵、cluster模式

主从为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数

2022-02-08 00:15:04 1221

原创 redis的穿透、雪崩、击穿解释和方案

击穿缓存击穿:缓存击穿表示某个key的缓存非常热门,有很高的并发一直在访问,如果该缓存失效,那同时会走数据库,压垮数据库。缓存击穿与缓存雪崩的区别是这里针对的是某一热门key缓存,而雪崩针对的是大量缓存的集中失效。。方案:设置热点数据永远不过期(成本高)。接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些 服务 不可用时候,进行熔断,失败快速返回机制。布隆过滤器。bloomfilter就类似于一个hash set,用于快速判某个元素是否存在

2022-02-06 01:16:31 160

原创 redis的过期删除策略+内存淘汰机制

redis的过期删除策略+内存淘汰机制Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源总有耗尽的时候,这时缓存服务器就无法再对外提供服务了。我们要用有限的服务器资源支撑更多的业务服务,就必须要让那些访问频率不高的缓存删除掉,为新的缓存腾出内存空间。Redis主要通过两种方式相互配合来实现键值的清理,即:过期删除策略和内存淘汰机制。过期删除策略如果一个键过期了,那么它什么时候会被删除呢?定时删除:在设置键的过期时间的同时,

2022-02-05 01:21:06 800

原创 redis持久化

Redis 持久化Redis 提供了不同级别的持久化方式:RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RD

2022-02-04 00:43:32 112

原创 redis为什么快?

redis为什么快

2022-02-03 01:15:06 20278 5

原创 认识redis

认识redis1.介绍Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件

2022-02-02 23:41:28 88

原创 偏向锁的进化和废弃

偏向锁的进化和废弃

2022-01-05 01:33:22 547

原创 日常记录——MySQL—参数设置

back_log:MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中,请求等待区。等待连接的数量超过back_log,将不被授予连接资源。wait_timeout:MySQL客户端的数据库连接闲置最大时间值,单位秒。max_connections:最大连接数。max_user_connections:同一个账号能够同时连接到mysql服务的最大连接数,0表示不限制。thread_concurrency:并发线程数,该参数到5.6版本就去掉。default-storage-engi

2020-08-16 17:36:46 388

原创 日常记录——leetcode- 整数反转

题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。题解:public static int reverse(int x) { Long result = new Lon

2020-08-07 00:11:04 98

原创 日常记录——leetcode- 字符串相加

题目:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式题解:public String addStrings(String num1, String num2) { StringBuilder result = new StringBuild

2020-08-06 01:12:25 109

原创 日常记录——MySQL—优化

1.使用索引可以增加查询效率,但维护索引也需要成本。2.组合索引,注意最左匹配原则。

2020-08-04 23:11:29 118

原创 日常记录——leetcode- 爬楼梯

题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。3. 1 阶 + 1 阶 + 1 阶4. 1 阶 + 2 阶5. 2 阶 + 1 阶题解://递归public int climbStairs(int n){

2020-08-03 23:23:36 198

原创 日常记录——MySQL—数据类型

一、设置建议越小越好:在数据预估范围内,一般情况下选择可以正确存储数据的最小数据类型。越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。越简单越好:简单的数据类型的操作通常需要更少的CPU周期。例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。尽量避免NULL:NULL需要额外的空间并且索引统计和比较的时候更复杂。二、数据类型1.整数类型类型长度有符号范围无符号范围场景tinyint1(-128,127)(0,255

2020-08-03 01:03:34 91

原创 日常记录——MySQL—锁

一、简介锁是计算机协调多个进程或纯线程并发访问某一资源的机制。永爱保证数据并发访问的一致性、有效性。模式:共享锁(读锁):其他事务可以读,但不能写。排他锁(写锁) :其他事务不能读取,也不能写。大体可分为两类:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率高,并发度低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。*默认情况下,表锁和行锁都是自动获得的, 不需要额外的命令,select前,会自动加读锁。insert 、update、dele

2020-08-02 00:25:55 75

原创 日常记录——MySQL—执行计划

执行计划:sql语句的执行过程。查看示例:EXPLAIN select * from user;字段1.id:sql执行顺序,id相同由上到下,id不同,大的先执行。2.select_type:类型含义sqlSIMPLE简单的 select 查询,查询中不包含子查询或者 unionEXPLAIN select * from user;PRIMARY查询中包含子查询或者 union ,外层为PRIMARY类型EXPLAIN select * from use

2020-08-01 01:20:31 133

原创 日常记录——MySQL—日志文件、事务

一、日志文件1.undo log:回滚日志,保证事物原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交的隔离级别就是通过mvcc+undo实现 。2.redo log:保证持久化日志,发生故障,保障已经提交的事物不丢失,而未提交的事物能回滚,达到事务一致性。redo log 写入时分为两个步骤,在事务 A 提交的时候执行到prepare阶段, binlog写入后 ,再执行到把 commit阶段,在合适时间将redolog的数据写入到磁盘中。redolog是多文件,重复写,

2020-07-31 01:44:21 374

原创 日常记录——MySQL—InnoDB和MyISAM区别

1.数据结构:InnoDB是将索引和数据存放在一起的,MyISAM是将索引文件和数据文件分开存放。使用工具创建两个表,一个存储引擎为InnoDB的innodb表,一个存储引擎为MyISAM的myisam表观察data文件,可发现InnoDB存储引擎有两个文件.frm(表定义)和.ibd(数据+索引),MyISAM有三个文件.frm(表定义)和.MYD(数据)和.MYI(索引)。2.索引:同样索引结构都选择B+Tree,但InnoDB使用聚簇索引(叶子节点存数据或主键值),MyISAM是非聚簇索引(

2020-07-30 00:25:23 134

原创 日常记录——MySQL—sql执行过程、索引结构、索引类型

一、sql执行过程二、索引结构索引存储在磁盘,磁盘每次读取页的整数倍(4k一页),数据量大会造成多次IO,所以尽量在创建索引的时候,在同样大小情况下,存储更多的索引。MySQL的索引结构为B+Tree:每个非叶子节点存储子节点磁盘指针和主键,存储更多的索引,降低IO次数,叶子节点存储磁盘指针和实际数据或者主键的值(InnoDB)或者数据的指针(MyISAM),并且叶子节点之间是链式环结构。即可满足随机查找和范围查找。为什么不使用其他结构:1.hash表:散列结构,范围查找效率低。2.二叉树

2020-07-29 00:31:38 851

原创 日常记录——JVM—GC常用参数

一、GC常用参数1.-Xmn -Xms -Xmx -Xss : 年轻代 最小堆 最大堆 栈空间2.-XX:+UseTLAB : 使用TLAB(线程本地分配缓存区),默认打开3.-XX:TLABSize:设置TLAB大小4.-XX:+DisableExplictGC:System.gc()失效5.-XX:+PrintGC:打印GC信息6.-XX:+PrintGCDetails:打印GC详细信息7.-XX:+PrintGCTimeStamps:打印GC系统时间8.-XX:+PrintVMOpti

2020-07-28 01:20:52 316

原创 日常记录——JVM—PS+PO的GC日志分析

一、代码public class GCtest { public static void main(String[] args) { List<byte[]> byteList = new ArrayList<>(); for (;;){ byte[] bytes = new byte[1024]; byteList.add(bytes); } }}二、配置-Xm

2020-07-27 00:56:16 1075

原创 日常记录——leetcode- 无重复字符的最长子串

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解答代码

2020-07-26 01:36:15 102

原创 日常记录——JVM—G1垃圾回收器

一、简介、G1垃圾回收器(Garbage First):是当今垃圾回收技术最前沿的成果之一,在17年作为JDK9默认的垃圾处理器。是一个可控的STW时间垃圾回收器,通过-XX:MaxGCPauseMillis 设置预期STW最大时间,G1会尽量达成目的,但不一定达成。二、原理G1垃圾回收器逻辑上存在年轻代、年老代之分,但实际在内存分配上将内存分成一小块一小块的Region,每个Region在某一时刻代表年老区(O),伊甸区(E),幸存区(S),大对象区(H,属于年老代,一个对象超过一半区域就放入H区)

2020-07-25 00:48:41 171

原创 日常记录——JVM—垃圾回收器(除G1、ZGC)

一、Serial 收集器Serial:工作在年轻代的垃圾回收器,采用复制算法,单线程工作。GC线程工作时,用户线程停止工作,造成停顿STW(Stop The World),开启参数-XX:+UseSerialGC。二、Serial Old 收集器Serial Old :工作在年老代,采用标记整理算法,单线程工作。GC线程工作时,用户线程停止工作,造成停顿STW。三、ParNew收集器ParNew:Serial收集器的多线程版本,工作在年轻代,采用复制算法,多线程工作,在多核cpu提高GC效率,

2020-07-24 01:21:24 198

原创 日常记录——JVM—垃圾定义、垃圾寻找、基本垃圾回收方法、堆内存逻辑分区

一、垃圾定义一个没有引用指向的对象,就是垃圾。可以理解为断了线的风筝。二、垃圾寻找1.引用计数法:有一个引用指向该对象,该对象头部的计数器加一,失效就减一,为0则代表垃圾。java不使用该方法,该方法存在循环引用问题,A指向B ,B 指向A 。则 A B 的计数器最小为1,不会回收。2.可达性分析法:通过一系列名为GC Roots的对象作为起始点,不在GC Roots的引用连路上的对象则为垃圾。GC Roots对象:线程栈变量(方法的局部变量),静态变量(class的静态变量),常量(calss的常

2020-07-23 00:57:21 292

原创 日常记录——JVM—new Object()

一、对象创建过程1.loading:加载对应类class文件。2.linking:验证文件格式(verification)、为类的静态变量分配内存,并初始化为默认值(preparation)、将符号引用转成直接引用(resolution)。3.initializing:初始化过程为类的静态变量赋予正确的初始值.4.为对象分配内存。5.成员变量赋默认值。6.调用构造方法:成员变量赋默初始值,其他语句。二、对象结构1.对象头:Mark Word(标记字段)、Class Pointer(类型指针)

2020-07-22 00:39:33 923

原创 日常记录——JVM—自定义类加载器

一、简介自定义类加载器实现方式为,继承ClassLoader类,重写其内部方法。简单介绍一下ClassLoader的与加载类相关的方法:1.getParent():返回该类加载器的父类加载器。2.loadClass(String name):加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。3.findClass(String name):查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。4.findLoadedClass(Str

2020-07-21 00:26:47 120

原创 日常记录——JVM—类加载器工作原理

一、简介类加载器:负责读取 Java 字节代码文件(.class),并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。即将对应类的.class文件中的二进制流加载到内存空间。二、类加载器分类类加载器一共有四种:1.Bootstrap ClassLoader :引导类加载器,它用来加载 Java 的核心库(存放在<JAVA_HOME>\lib目录中),是用原生代码来实现

2020-07-20 01:20:28 192

common.zip

基于springboot的方法耗时自定义注解和切面,使用时将注解@costlogger注解到相应方法上,使用日志输出方法耗时。

2020-09-10

ideaworker.zip

博主的多线程文章的测试类-线程创建以及线程控制器 内含创建线程、synchronized、ReentrantLock、ReadWriteLock、CAS、四种引用、并发控制器、volatile

2020-07-08

空空如也

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

TA关注的人

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