自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 模拟生产者消费者的demo

   代码如下,注释写的非常详细,复制就能跑。  public class Test{ //用一个int变量来模拟缓冲区 private int work=0; public static void main(String[] args) { Sx01 sx01 = new Sx01(); //启动生产者 new Thread(()->{ try { sx01.kz

2022-03-25 19:14:24 326

原创 数据库死锁了怎么办

   今天看书的时候,书中写到了到了数据库解决死锁的几个方法,特此做个笔记   死锁是个啥?   一句话概括就是,有两个人叫甲和乙,又两个资源叫a和b,甲拿了a然后需要b,乙在甲拿了a的时候拿了b然后要a,此时甲和乙都拿着对方需要的资源,咋办呢。没办法,你瞪着我,我瞪着你,这就是死锁。    数据库死锁是个啥?   先看一段sql:START TRANSACTION;UPDATE A SET a=1 WHERE ID=2;UPDATE A SET a=2 WHERE ID=2;C

2022-03-04 15:29:01 12489 2

原创 三个线程交替打印数字demo

   代码如下,注释写的非常详细,复制就能跑。  public class Xs02 { //用volatile修饰了两个一会要用到的int private volatile int flag=0; private volatile int work=0; private Thread t1,t2,t3; public static void main(String[] args) { Xs02 xs02 = new Xs02();

2022-02-26 11:24:13 163

原创 后缀表达式的实现以及运算(附demo,有注释,复制了就能跑)

   不知道后缀表达式的可以先点这里看一看,非常有意思!    不多比比,上代码!public class NBLS { public static void main(String[] args) { String a = "1+2*3+4"; char[] qs = qs(a); System.out.println(ys(qs)); } //进行四则运算 public static int szys(int a,

2022-02-11 21:33:24 252 1

原创 关于Bigkey对redis 的影响和解决方法

   本文内容属于《redis开发与运维》读书笔记。   bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储232-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。   字符串类型:体现在单个value值很大,一般认为超过10KB就是bigkey,但这个值和具体的OPS相关。    非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过

2022-01-29 11:26:35 2233

原创 spring循环依赖怎么解决

   因为我英文水平有限,所以本博客不会出现的具体方法名,有兴趣的好兄弟可以自己看看其他博客的回答。   首先什么是循环依赖?   通俗的来说就是我依赖你,你也依赖我,或者是我自己依赖自己,写成代码就是:@Componentpublic class A { @Autowired private B b;}@Componentpublic class B { @Autowired private A a;}或者@Componentpublic class A { @A

2022-01-18 09:30:55 153 2

原创 力扣每日一题——最小时间差

//给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。// 示例 1://输入:timePoints = ["23:59","00:00"]//输出:1// 示例 2://输入:timePoints = ["00:00","23:59","00:00"]//输出:0// 提示:// 2 <= timePoints <= 2 * 10⁴// timePoints[i] 格式为 "HH:MM" public in

2022-01-18 09:22:09 4634 1

原创 读书笔记—RocketMQ发送消息的过程

   今天看书的时候,书中写到了到了RocketMQ的消息发送的流程解析,特此做个笔记   先说说RocketMQ 的消息发送方式   书上写着RocketMQ 一共有三种消息发送方式 :同步(sync )异步(async)、单向( oneway)。   同步 :发送者向 MQ 执行 送消息 API 时,同步等待,直到消息服务器返回发送结果。   异步 :发送者向 MQ 执行发送消息 API 时,指定消息发送成功后的回调函数,然后调用消息发送 API 后,立即返回,消息发送者线程不阻塞 ,

2022-01-10 17:21:21 1277

原创 手写一个HashMap(附demo,有注释,复制就能跑)

手写HashMap,你上你也行!

2022-01-05 17:21:49 1265

原创 System.arraycopy—数组深拷贝与浅拷贝

   以前只是知道System里面有一个native静态方法叫做arraycopy()。这个方法可以用来进行数组复制吗,今天用到了,感觉得把他的参数说明记个笔记,主要是为了方便自己查阅,大佬可忽略。   上代码: public static void main(String[] args) { double[] arr1= {1,3}; double[] arr2= {1,4}; double[] sum=new double[arr1.length

2022-01-04 14:18:14 1132 5

原创 《高性能MySQL》读书笔记—数据库的范式与反范式

   众所周知Mysql数据库有建表的三大范式,分别是:    1、第一范式:保证列具有原子性,一张表中的每一个字段,都应不可再分,例如:总金额=单价×数量,此时这个总金额就可以分成单价和数量两字段。    2、第二范式:属性完全依赖于主键,也就是表中除了主键以外的其他字段都必须依赖主键。    3、第三范式属性不依赖于其它非主属性,也就是除了主键以外的其他字段应没有任何关系。    在范式化的数据库中,每个数据会出现并且只出现一次。与之相反,在反范式化的数据库中,信息是冗余的,可能会存储在

2022-01-04 09:18:44 94

原创 《深入理解Java虚拟机》读书笔记—三色标记(增量更新,原始快照)

昨天看到书中的三色标记法,觉得有必要做个笔记   当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象 是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析, 这意味着必须全程阻塞用户线程的运行。在根节点枚举这个步骤中,由于GC Roots相比 起整个Java堆中全部的对象毕竟还算是极少数,且在各种优化技巧(如OopMap)的加持下,它带来的停顿已经是非常短暂且相对固定(不随堆容量而增长)的了。可从GC Roots再继续往下遍历对象 图,这一步骤的停顿时间

2021-12-29 11:35:06 486

原创 回文数检测

   今天需求肝完了,写个简单的算法题   判断一个数是不是回文数,是的话就输出下一个更大的回文数,代码如下: public static void main(String[] args) { int a=909; int b=90; int c=101; int d=111; System.out.println(a(a)); System.out.println(a(b)); Syst

2021-12-29 10:40:20 117

原创 Java虚拟机判断对象是否需要回收的方法

   内容来自周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》(第3版)   java虚拟机中垃圾收集器用来判断对象是否存活主要使用了引用计数法和可达性分析这两种方案。   引用计数法   引用计数法会在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。该方法虽然占用了一些额外的内存空间来进行计数,但它的原理非常简单(有引用就加一,为0就是没有被引用过,当一个对象的引用计数器为0时,

2021-12-22 14:22:46 270

原创 《深入理解Java虚拟机》读书笔记-程序计数器

昨天晚上看到书中写的程序计数器,觉得很有意思,做个笔记   程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的 字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器 的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一 个确定的时刻

2021-12-22 10:44:38 667

原创 后缀表达式(逆波兰式)

   昨天晚上在大话数据结构这本书上看到栈的时候,作者用逆波兰式举了个例子,我觉得挺好玩的,做个笔记   什么是逆波兰式    20世纪50年代,波兰的一位逻辑学家Jan Lukasiewicz,想到了一种不需要括号的后缀表达法,后来我们把其称之为逆波兰(Reverse Polish Notation RPN)表示。这种表达式极大程度上利用了栈先进后出的原则,巧妙的解决了程序实现四则运算的难题。(先乘除,后加减)   tip:为什么不叫Jan Lukasiewicz表达式,可能名字太复杂了,参

2021-12-17 09:53:49 317

原创 红包算法怎么写

昨天把需求肝完了,今天接着摸鱼,写个红包算法玩玩    红包算法:顾名思义就是像发红包一样。给定金额和红包个数,生成给定个数的浮点型数值,并且加起来要等于给定金额(不能多也不能少)   不多比比上代码: //money 金额 count 红包个数 accuracy 精度,精确到小数点后几位 public static float[] hb(int money, int count,int accuracy){ //用于获取随机数,公不公平就看他了

2021-12-10 16:53:25 286

原创 hashcode怎么算

  今天没任务,整个活。   hashcode都知道吧,数据经过散列后得到对应的一个值,这个值一般用与映射,可以通过过这个值找到对应的数据。  java里可以直接调用方法来获取数据的hashcode,如下    那这个hashcode怎么算的呢,点进去看一下    根据图中的代码打个草稿得到如下算式;这个数字是对应的ascall码值A 65B 66C 67D 68AB 65*31+66=2,081ABC 2081*31+67=64,578ABC

2021-12-10 11:51:12 1419

原创 线程池的两种关闭方式以及区别

  今天看书,看到线程池的关闭方式,记个笔记    线程池大家都知道,用来实现资源复用的。避免了线程频繁的创建和销毁的开销。待到使用完毕后都要关闭线程池,以释放资源。    线程池关闭后里面有任务正在工作的线程会怎么样    在树上有这么一段:  可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。它们的原理是遍历线 程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务 可能永远无法终止。但是它们存在一定的区别,shutdown

2021-12-09 10:33:25 3010

原创 原子更新基本类型类是怎么保证原子性的

  原子更新基本类型类是什么   原子更新基本类型类就是在保证原子性的前提下更新基本类型的值,Atomic包提供了以下三个类。   1.AtomicBoolean:原子更新布尔类型   2.AtomicInteger:原子更新整型   3.AtomicLong:原子更新长整型   就拿AtomicInteger举例,这个方法的作用就是把操作对象原先的值做一个++的操作,但是众所周知,i++这种操作他是不保证原子性的,那AtomiceInteger是怎么保证的,先来看看AtomicInte

2021-12-08 19:58:13 291

原创 《Java并发编程的艺术》读书笔记—ConcurrentLinkedQueue队列

内容来自《Java并发编程的艺术》   队列和栈的区别    栈是一种先进后出的数据结构,可以把他看成是一个桶,最先放进去的东西最后才能拿出来,这也是为什么java的main方法最先入栈确最后执行,main方法会把调用的对象一层层的压入栈中,执行完一个就弹出区一个最后执行自己。    队列则是一种先进先出(first input first output)的数据结构,我们可以把他看成是一个管道,最先从一端进去的事物,也会最先从另一端出来。   再来说说书里讲的ConcurrentLinked

2021-12-07 21:14:21 219

原创 Volatile的作用

内容还是来自《Java并发编程的艺术》   Volatile是轻量级的synchronized,它可以避免指令重排,并保证共享变量的可见性,和ThreadLocal不一样,ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享,而Volatile是让每一个线程拿到的变量都是最新的。   那么Volatile是怎么保证可见性的呢?   有Volatile修饰的共享变量进行写操作的时候,其汇编代码会多出一行带lock

2021-11-28 12:56:56 682

原创 死锁的原因和避免死锁的常见方法

内容来自《java并发编程的艺术》  死锁是啥呢?   简单来说就是线程资源冲突,比如在并发的情况下A线程获得了资源1它接下来需要资源2,同时B线程获得了资源2接下来需要资源1,这时线程A没有获得所需资源不会释放,同样,线程B也是如此,两个线程就会阻塞,如果不设置锁超时过期就会出现一直死锁的情况,在真实开发环境这种情况是很致命的(当然一般测试环境这种代码就被kill了)。   下面说几个在书里看到的避免死锁的常见方法:   1.避免一个线程获得多个锁   2.避免一个线程在锁内同时占用多个

2021-11-28 12:31:24 678

原创 汽车加油问题(贪心算法)

题目:一辆汽车加满油后可行驶n km,旅途中有若干加油站。请设计一个算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。    我的思路用贪心算法也就是先判断加油站之间的距离大不大于汽车加满油能行驶的距离,超出了就直接返回无法到达,当满足上述判断后,汽车每到一个加油站就判断油是否够到达下一个加油站,够的话就不加油,如果不够就停下加油。    不多比比。代码贴下面 public static int jy(int k, int n, int[] arr) { //k汽车加满油能行驶

2021-11-26 14:41:56 2620

原创 (算法)求数组中数字组合(可多值组合)相加最接近目标数的组合(可能多个)

  今天没事,撸一道算法题  题目要求: 给出一个升序排序的可能重复值的数字数组和一个目标值 其中目标值大于数组中最小数,求数组中数字组合(可多值组合)相加最接近目标数的组合(可能多个) 不考虑空间复杂度,效率最优的算法; 样例: 数组为[3,4,8],目标值为9,最接近组合为[8];  这道题我的解题思路是:   1.先得到数组的全部不重复不为空的子集   2.将子集的和作为key,子集的元素作为value存进map   3.将子集的和与给定值

2021-11-22 14:41:32 12148

原创 跨域的问题

  再通过一个地址访问l另一个地址时,访问过程中如果访问协议、ip地址、端口号任何一个不一样,就会有跨域的问题。    比如下面这个端口号不一致的问题  点击登录就会报错  怎么解决呢,在controller层加个注解就完事了  重启项目,点击登录。  问题解决。...

2021-11-09 22:24:22 254

原创 《MySQL技术内暮:innodb存储引擎》读书笔记—压缩页

   innodb存储引擎从1.0.x版本开始支持名为压缩页的功能,数据库缓冲池中的页默认为16KB/页,通过该功能可以压缩至1KB、2KB、4KB和8KB四种类型。   由于数据库中页的大小发生了变化,LRU列表(LRU列表–用优化过的LRU算法管理热点缓存数据的列表)也有了些许的改变。对于非默认大小(16KB)的页,是通过unzip_LRU列表进行管理的。可以用下面的命令查看相关情况。SHOW ENGINE INNODB STATUS  对于压缩页的表,由于每个表的压缩比率可能各不相同,毕竟有

2021-11-08 11:27:18 401

原创 联合索引的最左匹配原则(范围查询会导致索引失效)

    联合索引    联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树,联合索引与其他索引不同的是联合索引的键值数量大于等于2。      最左匹配原则   假设我们创建了一个如下的联合索引:create index lhsy on test(a,b,c,d)   那么根据联合索引的最左匹配原则我们进行如下查询是会走索引的:select * from tab

2021-11-02 13:55:04 3855 2

原创 关于Mybatis-plus代码生成器的坑

    众所周知Mybatis-plus经过配置可以自动生成三层架构的代码。   根据如下配置可以生成mysql的guli数据库的edu_teacher表的相关代码package com.guigu.demon;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.generator.

2021-10-30 13:30:47 356

原创 MySQL存储引擎(InnoDB和MyISAM)

    1.InnoDB存储引擎    该引擎最大的优势就是支持事务,其主要设计目标是面向在线事务处理(OLTP)的应用。其特点是行锁设计,支持外键,并支持类似Oracle的非锁定读,即默认读取操作不会产生锁(隔离级别为RR-可重复读)。从5.5.8版本开始,MySQL的默认存储引擎就是InnoDB。     InnoDB通过多版本并发控制(MVCC)来获得高并发性,并且实现了SQL的四种隔离标准。用一种叫做next-keylocking的策略来避免幻读(行锁与间隙锁组合起来用就叫做Next-Key

2021-10-24 10:08:29 2472

原创 Redis Sentinel(哨兵)实现原理

Redis Sentinel是由三个定时任务、主管下线和客观下线、Sentinel领导者选举、故障转移来实现的。     先来看看三个定时任务是那三个   1.每隔十秒,每个Sentinel(哨兵节点)会向主节点和从节点发送info命令获取最新的拓扑结构,那这个任务有什么用呢?    a. 哨兵节点可以通过info命令从主节点获取从节点的信息,这也是为什么哨兵节点为什么只配置主节点不配置从节点的原因。    b. 每当有新的节点加入时,哨兵节点可以立刻感知到,    c. 当有节点崩了

2021-10-17 09:45:53 400

原创 Redis内存回收机制

  Redis的内存回收机制主要是下面列举的两种:    1.删除达到过期时间的键对象。    2.内存使用达到maxmemory(redis所能够使用的最大内存)上限时出发内存溢出控制策略。    先来说说删除过期键对象  众所周知Redis所有的键都可以设置一个过期属性,内部保存在过期字典中。但由于进程内保存着大量的键,如果对每个键的过期删除的机制都进行维护,那不用想,肯定会消耗大量的CPU,单线程的Redis本来就讲究一个快,这么整肯定不行,与Redis的设计初衷不符,因此Redis采用

2021-10-15 17:24:04 832

原创 Redis对于字符串类型,执行set命令会去掉过期时间

  在Redis中有键过期这个功能,他可以给指定的键设置一个过期时间,到期自动删除该键,除了expire(设置)、ttl(查看)命令以外,Redis还提供了:  expire key x  设置键在x秒后过期。   expireat key timestamp  设置键在秒级时间戳timestamp后过期。   pexpire key x  设置键在x毫秒后过期   pexpireat key timestamp 设置键在毫秒级时间戳timestamp后过期。   ttl key

2021-10-09 15:45:49 479

原创 InnoDB存储引擎的Cardinality统计

  内容主要来自《MySQL技术内幕》     索引      索引能帮助我们快速得到符合查询条件的数据,但是什么时候添加索引最合适呢?      对于什么B+树索引来说,一般的经验是,在访问表中很少一部分的时候使用B+树索引才有意义。对于性别字段、地区字段等,这种字段的取值范围就很小,我们称为低选择性,给这种字段添加索引是完全没有必要的。相反如果某个字段的取值范围很广,几乎没有重复,即属于高选择性,则此时使用B+树索引是最合适的,例如学号、身份证号等。索引列中的数据都是高选择性的,这对数据库来

2021-09-29 10:20:01 389

原创 sql优化方法(索引)

   sql优化策略   下面的方法适用于数据量大的情况下sql不走索引,数据少的就没必要了,几千条数据完全没有必要建索引。      sql优化的精髓在于,能走索引绝不回表查询,尽量出现索引覆盖,避免全表扫描,能少查一个字段就少查一个,不要总是select *。   查询语句语法顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table>

2021-09-26 15:22:06 645

原创 Checkpoint技术

  缓冲池  先来说说缓冲池,缓冲池的设计目的是为了协调CPU速度和硬盘速度的鸿沟的。因此页的操作首先都是在缓冲池中完成的。如果一条DML语句,如Update或Delete改变了页中的记录,这是缓冲池中的数据和磁盘中存放的数据是不一样的,那么此时页时脏的。数据库需要把最新的数据从缓冲池刷新到磁盘中。    如果每次页发生变化,就把新版本的页刷新到磁盘,那么这个过程开销是非常大的。若热点数据非常集中,那数据库的性能将会大大降低。同时,如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机,那么数据就不能恢复了

2021-09-24 11:02:17 300

原创 InnoDB存储引擎管理缓冲池的策略

    MySQL作为一个数据存储系统,是具有缓冲池(buffer pool)这么一个机制的,这是为了避免每次查询数据都进行磁盘IO,可以提高数据访问的效率。      缓冲池是一个很大的内存区域,里面放着各种类型的页。那么InnoDB引擎是这么管理这么大的内存区域的呢?      通常来说,数据库中的缓冲池是通过LRU(Latest Recent Used,,最近最少使用)算法来进行管理的。这是一个类似Redis的LFU(less frequently used)淘汰策略算法,即最频繁使

2021-09-22 09:52:55 274

原创 数据库与数据库实例

数据库   从概念来说数据库是由文件按照某种数据模型架构组织起来并存放于二级存储器中的数据集合。数据库实例  数据库实例是位于用户和操作系统之间的一层用来交互的数据管理软件,用户对数据库中的数据进行的任何操作都是,包括数据库定义、数据操作(CRUD)、数据维护等等都是在数据库实例下进行的,应用程序也是通过数据库实例才能和数据库打交道。     直白点来说,数据库是由一个个的文件组成的(一般是二进制文件),要对这些个数据进行CRUD类似的数据操作需要使用数据库实例来完成对数据库的操作。 插一嘴

2021-09-20 23:45:05 579

原创 Lock和synchronized

Lock和synchronized  Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现的    synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;    Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程

2021-09-16 14:45:44 118

原创 Redis的三种集群策略

Redis提供了三种集群策略:  1. 主从模式  这种模式⽐较简单,主库可以读写,并且会和从库进⾏数据同步,这种模式下,客户端直接连主库或某个从库,但是但主库或从库宕机后,客户端需要⼿动修改IP,另外,这种模式也⽐较难进⾏扩容,整个集群所能存储的数据受到某台机器的内存容量,所以不可能⽀持特⼤数据量  2. 哨兵模式  这种模式在主从的基础上新增了哨兵节点,但主库节点宕机后,哨兵会发现主库节点宕机,然后在从库中选择⼀个库作为进的主库,另外哨兵也可以做集群,从⽽可以保证但某⼀个哨兵节点宕机后,

2021-09-16 14:22:08 1380

空空如也

空空如也

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

TA关注的人

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