- 博客(441)
- 资源 (4)
- 收藏
- 关注
转载 真正优秀的人,更懂得尊重别人
仓央嘉措 : 我以为别人尊重我,是因为我很优秀。慢慢的我明白了,别人尊重我,是因为别人很优秀;优秀的人更懂得尊重别人。对人恭敬其实是在庄严你自己。层次高的人,他们更懂得“感同身受”和换位思考,知道每个人都不容易,懂得尊重别人。故事一意大利插画家Marco Melgrati曾根据现实题材创作过一幅画——“你永远不知道跟你玩的是谁!”画中的猫把蛇尾当成鼠尾,毫不畏惧地用爪子抓着蛇的尾巴。...
2020-02-18 18:28:03 701 1
原创 微服务:浅谈SpringCloud微服务架构
微服务:简述Spring Cloud微服务架构Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。Spri...
2019-07-10 13:24:09 3440
原创 Java:详解Java中的异常(Error与Exception)
《Java:详解Java中的异常(Error与Exception)》 《Java:简述Java中的自定义异常》 《Java:简述throw-throws异常抛出》 《Java:简述try-catch-finally异常捕获》 《Java:简述try-catch-finally中return返回》一、 异常机制的概述 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机...
2018-06-22 16:54:26 131717 48
原创 算法:二分查找法
二分查找又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。核心:不断二分缩小查找范围。
2024-09-08 09:00:00 74
原创 算法:判断一个整数是不是2的阶次方
判断整数除以2的余数是否为0,如果不为0,则直接返回false;如果为0,则将将整数除以2后重复本步骤。核心:不断除以2,缩小判断的范围。
2024-09-08 08:00:00 144
原创 算法:将数组随机打乱顺序,生成一个新的数组
3、将取出的随机数与原数组的最后一个数据进行置换;1、创建一个与原数组长度相同的新数组;中随机取出一个数据,添加进新的数组;核心:缩小原数组的可随机取数范围。2、从原数组的有效的可取数范围。4、重复步骤2和3。
2024-09-07 09:00:00 126
原创 Java-IO:浅谈对IO的认识
Java IO流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。2、按照操作单元划分,可以划分为字节流和字符流。1、按照流的流向分,可以分为输入流和输出流。3、按照流的角色划分为节点流和处理流。
2024-09-06 09:00:00 187
原创 Java-IO:浅谈对NIO的认识
NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
2024-09-06 08:00:00 2035
原创 Spring:依赖注入(IOC)之注解注入
注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component等。上面的Autowired和Resource是用来修饰字段,构造函数,或者设置方法,并做注入的。而Service,Controller,Repository,Component则是用来修饰类,标记这些类要生成bean。
2024-09-05 09:00:00 720 1
原创 Java:集合的相关汇总介绍
TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的, 自己定义的类必须实现 Comparable接口,并且覆写相应的 compareTo()函数,才可以正常使用。在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序。比较此对象与指定对象的顺序。
2024-09-05 08:00:00 1613
原创 Java:HashMap和HashTable的区别
虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key值对应的value为null。HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的安全问题。HashTable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。
2024-09-04 09:00:00 258
原创 ZooKeeper:浅谈ZooKeeper的Watch机制
而ZooKeeper实现这些分布式进程的状态(ZNode的Data、Children)共享时,基于性能的考虑采用了类似的异步非阻塞的主动通知模式,即Watch机制,使得分布式进程之间的“共享状态通信”更加实时高效,其实这也是ZooKeeper的主要任务决定的—协调。多个分布式进程通过ZooKeeper提供的API来操作共享的ZooKeeper内存数据对象ZNode来达成某种一致的行为或结果,这种模式本质上是基于状态共享的并发模型,与Java的多线程并发模型一致,他们的线程或进程都是”共享式内存通信“。
2024-09-04 08:00:00 260
原创 Kafka:浅谈对Kafka的认识
消息系统都致力于让Consumer以最大的速率最快速的消费消息,一些消息系统比如Scribe和Apache Flume采用了Push模式,将消息推送到下游的Consumer。更进一步的性能优化是零拷贝的使用,也就是从磁盘日志到消费者客户端的数据传递,因为Kafka是MQ,对于msg不具备加工处理,所以得以实现。物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处。注意:ack的默认值就是1。
2024-09-03 09:00:00 1936
原创 RabbitMQ:浅谈死信队列、延时队列
在 RabbitMQ中存在2种方法可以设置消息的过期时间,第一种通过对队列进行设置,这种设置后,该队列中所有的消息都存在相同的过期时间,第二种通过对消息本身进行设置,那么每条消息的过期时间都不一样。在死信队列中,可以为普通交换器绑定多个消息队列,假设绑定过期时间为5分钟,10分钟和30分钟,3个消息队列,然后为每个消息队列设置DLX,为每个DLX关联一个死信队列。当队列中的消息被拒绝、或者过期会变成死信,死信可以被重新发布到另一个交换器,这个交换器就是DLX,与DLX绑定的队列称为死信队列。
2024-09-03 08:00:00 156
原创 Java-IO:简述常见的IO模型
最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。另外多路复用IO为何比非阻塞IO模型的效率高是因为在非阻塞IO中,不断地询问socket状态时通过用户线程去进行的,而在多路复用IO中,轮询每个socket状态是内核在进行的,这个效率要比用户线程要高的多。
2024-09-02 17:09:02 793
原创 缓存:浅谈缓存穿透、缓存击穿、缓存雪崩等
缓存穿透:缓存不存在,数据库不存在,高并发,少量key缓存击穿:缓存不存在,数据库存在,高并发,少量key缓存雪崩:缓存不存在,数据库存在,高并发,大量key。
2024-09-02 09:00:00 1314
原创 Redis:浅谈Redis持久化机制-RDB和AOF
Redis提供了两种持久化方式:1、RDB持久化:在指定的时间间隔对数据进行快照存储。2、AOF持久化:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。也可以同时开启两种持久化方式,在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据。
2024-09-02 08:00:00 662
原创 Redis:浅谈Redis集群的复制原理
每个master也持有一个偏移量offset,master将自己产生的复制流发送给slave时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新slave的状态。一个master可以拥有多个slave,slave可以接受其他slave的连接。当一个master实例和一个slave实例连接正常时, master 会发送一连串的命令流来保持对slave的更新,以便于将自身数据集的改变复制给 slave , 包括客户端的写入、key的过期或被逐出等等。
2024-09-01 19:44:21 993
原创 缓存:浅谈双写导致的数据一致性问题
从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力更新即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。因此,接下来讨论的思路不依赖于给缓存设置过期时间这个方案。我们讨论三种更新策略:1、先更新缓存,再更新数据库。(不可取)2、先更新数据库,再更新缓存。(不可取)3、先删除缓存,再更新数据库。(不可取)
2024-08-31 08:00:00 1166
原创 分布式:浅谈幂等
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和 setTrue()”函数就是一个幂等函数。简言之:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。
2024-08-30 16:05:08 886
原创 分布式:浅谈CAP定理(布鲁尔定理)
在生产中,A和C的选择,没有正确的答案,是取决于自己的业务的。比如12306,是满足CP,因为买票必须满足数据的一致性,不然一个座位多卖了,对铁路运输都是不可以接受的。CAP定理,又叫布鲁尔定理。指的是:在一个分布式系统中,最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。理想情况是:用户1访问系统A对数据进行修改,将data1改成了data2,同时用户2访问系统B,拿到的是data2数据。
2024-08-30 15:32:12 445
原创 浅谈对分布式锁的认识
Zookeeper每次进行锁操作前都要创建若干节点,完成后要释放节点,会浪费很多时间;而Redis只是简单的数据操作,没有这个问题。
2024-08-30 15:02:58 1175
原创 浅谈常见的分布式ID生成方案
UUID是通用唯一标识码的缩写,其目的是让分布式系统中的所有元素都有唯一的辨识信息,而不需要通过中央控制器来指定唯一标识。(2)不是递增有序的数字,数据写入IO随机性很大,且索引效率下降。(4)序列号,占用12位。(2)时间戳,占用41位,可以支持69年的时间跨度。(1)降低全局节点的压力,使得主键生成速度更快;(1)UUID占用16个字符,空间占用较多;(2)主键自动增长,IO写入连续性好;(2)分库分表,需要改造,复杂;(3)机器ID,占用10位。(2)生成的主键全局唯一;(2)自增-数据量泄露。
2024-08-30 14:38:04 925
原创 Java:简单比较synchronized和lock
区别类型SynchronizedLock存在层次Java的关键字JVM的一个接口锁的获取假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待情况而定,Lock有多个锁获取的方式,大致就是可以尝试获得锁,线程可以不用一直等待(可以通过tryLock判断有没有锁)锁的释放1、获取锁的线程执行完同步代码,释放锁2、线程执行发生异常,jvm会让线程释放在finally中必须手动释放锁,不然容易造成线程死锁锁类型锁可重入、不可中断、非公平可重入、可判断
2024-08-30 14:08:00 117
原创 浅谈Java内存模型中的可见性、原子性和有序性
只要在某个线程中无法检测到重排序情况(即使在其他线程中可以明显地看到该线程中的重排序),那么就无法确保线程中的操作将按照程序中指定的顺序来执行。是可分割的,所以他不是一个原子操作。Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。
2024-08-30 13:53:18 302
原创 Java:简述线程安全(死锁)的认识
这个问题除了正确的ack之外,往往是通过将失败的消息放入到延时队列中,等到一定的延时再进行重试来解决。:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。:采用资源有序分配,其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
2024-08-30 10:48:34 677
原创 Java:浅谈线程的生命周期
此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。从start()源码中看出,start后添加到了就绪队列中,接着在native层添加到VM中,至于该线程何时开始运行,取决于JVM里线程调度器的调度(如果OS调度选中了,就会进入到运行状态)。Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了。如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。(1)run()方法执行完成,线程正常结束。
2024-08-29 18:13:17 682
原创 JVM:浅谈内存溢出的原因
java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态,而且回收的效果依然不佳的情况,就会开始报这个错误。java.lang.OutOfMemoryError: PermGen space jdk1.7之前才会出现的问题 ,原因是系统的代码非常多或引用的第三方包非常多、或代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀。
2024-08-29 17:52:52 534
原创 JVM:浅谈垃圾回收GC机制
复制算法的代价是将内存缩小为了原来的一半,减少了实际可用的内存。现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。
2024-08-29 17:38:20 1104
原创 Java:简述类的加载机制-双亲委派
类加载的机制过程分为以下:加载、验证、准备、解析、初始化等。在第一步的加载环节,Java类加载器有四种:Bootstrap类加载器、Extention 类加载器、Application类加载器、Custom自定义类加载器,其中会涉及“双亲委派”模式。
2024-08-29 16:54:00 963
原创 Java:内存过高和CPU过高的排查流程
3、假设占用率最高的线程 ID 为 6900,将其转换为 16 进制形式 (因为 java native 线程以16进制形式输出)。4、利用 jstack 打印出 java 线程调用栈信息,这样就可以更好定位问题。1、利用 top 命令可以查出占 CPU 最高的的进程pid。2、查看该进程下占用最高的线程id。4、查看占用内存比较多的存活对象。2、查看JVM堆内存分配情况。3、查看占用内存比较多的对象。
2024-08-29 16:18:13 392
原创 JVM:浅谈JVM调优策略
多数的Java应用不需要在服务器上进行GC优化,虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反。在应用上线之前,先考虑将机器的JVM参数设置到最优(适合)。在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间。我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化令其性能达到一个质的飞跃。GC优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。
2024-08-29 16:09:00 872
原创 Java:简述类的加载机制-初始化
如果Class是类而不是接口,且Class的父类Super Class(SC)和各个接口SIn(按照implements子句中的顺序来)还没有初始化,那么就在SC上面递归地进行完整的初始化过程,如果有必要,需要先验证和准备SC;如果SC或SIn初始化过程中抛出异常,则获取LC,将Class标记为错误状态,并通知所有正在等待的线程,然后释放LC,然后再抛出同样的异常。类的初始化阶段,是真正开始执行类中定义的java程序代码(.class字节码),并按程序员的意图去初始化类变量的过程。
2024-08-29 15:18:05 372
原创 Java:浅谈字节码文件(.class)
JVM具有可移植性,针对各种操作系统和平台都进行了定制,无论在什么平台,都可以通过javac命令将一个.java文件编译成固定格式的字节码(.class文件)供JVM使用。之所以被称为字节码,是因为.class文件是由十六进制值组成的,JVM以两个十六进制值为一组,就是以字节为单位进行读取。
2024-08-29 14:44:45 699
原创 MySQL:简述数据库的主从复制
MySQL主从复制是指数据可以从一个MySQL数据库主节点复制到一个或多个从节点。MySQL默认采用异步复制方式,这样从节点不用一直访问主节点来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主节点中的所有数据库或者特定的数据库,或者特定的表。
2024-08-29 13:43:00 612
原创 MySQL:简述多版本并发控制MVCC
Read View遵循的可见性算法主要是将要被修改的数据的最新记录中的DB_TRX_ID(当前事务id)取出来,与系统当前其他活跃事务的id去对比,如果DB_TRX_ID跟Read View的属性做了比较,不符合可见性,那么就通过DB_ROLL_PTR回滚指针去取出undolog中的DB_TRX_ID做比较,即遍历链表中的DB_TRX_ID,直到找到满足条件的DB_TRX_ID,这个DB_TRX_ID所在的旧记录就是当前事务能看到的最新老版本数据。(1)在事务3修改该行数据的时,数据库会对该行加排他锁。
2024-08-29 11:51:58 1104
原创 MySQL:使用explain查看执行计划优化SQL
官网地址:为了优化SQL语句,需要查看SQL语句的具体执行过程,可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。执行计划的结果指标如下所示,核心的用红框标出来了。
2024-08-28 18:07:47 1075
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人