Java后端技术栈
文章平均质量分 72
Java后端技术栈
月犹依依
RPG、Flow、Loop & Zoom! Have fun every day~
一天一天成长为架构师~
展开
-
ZooKeeper笔记总结
文章目录资料基本概念分布式锁总结选举机制资料ZK分布式锁最佳讲解ZAB协议与leader选举图解基本概念ZK基本概念详解ZK基本概念2分布式锁总结ZK分布式锁最佳讲解分布式锁原理概述:借助ZK临时有序节点以及监听机制。具体原理:参见文中分布式锁原理。临时保证锁在网络异常等场景下的释放、有序保证锁的FIFO与公平性、监听保证避免羊群效应。具体代码详见文中zk通过临时节点,解决掉了死锁的问题,一旦客户端获取到锁之后突然挂掉(Session连接断开),那么这个临时节点就会自动删除掉,其他客原创 2021-11-03 11:54:25 · 702 阅读 · 0 评论 -
数据库分库分表
文章目录参考链接总结参考链接数据库垂直切分、水平切分(分表分区)、分库概念以及各自优缺点,数据库分库常用策略、分片键选择以及分库分表后面对的问题:很全面数据库分区常用策略、解决分库分表问题的方案以及一个实例大众点评业务分库分表方案以及老系统切换流程demo数据库分片所有知识详解总结建议优先水平切分,需要做好唯一的分片键设计常用方法:范围哈希基于字典查询推荐hash分库分表遇到的问题:事务跨节点join跨节点排序等唯一ID唯一ID方案:数据库自增方案基于缓存的原创 2021-11-01 18:01:45 · 136 阅读 · 0 评论 -
thrift IDEA与maven的plugin配置
文章目录goal参考pom配置goal在IDEA的maven插件部分能呈现如下参考安装部分:Mac Thrift安装教程Mac Thrift降级安装完成之后我们需要配置环境变量:https://www.cnblogs.com/quickcodes/p/5398709.htmlhttps://www.cnblogs.com/smartloli/p/4220545.htmlThrift安装还需要安装bison,并且thrift和bison版本要对应上安装完成之后结合idea与mvn配置教原创 2021-10-28 10:09:49 · 848 阅读 · 0 评论 -
HTTP接口签名校验
文章目录为什么要签名校验常用签名校验算法实例为什么要签名校验一般对外的http接口加签的目的是防止数据被篡改。举个例子,A正在某银行网站给B转账,转入卡号和金额输入完成后生成请求报文,然后加密报文传送给银行后台。银行收到请求后,解密得到明文,然后解析得到B的卡号和转账金额等信息,继续走后续转账流程。如果传输使用对称加密算法(最常用的),客户端和服务端都是用同一个对称密钥,那么这个对称密钥就存在泄露的可能性。一旦泄露,攻击者X可以截获正常的报文,解密后替换卡号和金额,然后重新用同一个密钥加密被篡改的报原创 2021-08-31 21:53:23 · 1103 阅读 · 0 评论 -
guava限流器与redis限流器
文章目录参考原理实例参考guava rate Limite原理参考:https://www.cnblogs.com/fnlingnzb-learner/p/13086185.html原理guava的限流器,可以理解为并发包中的信号量。通过tryAcquire方式获取有限的令牌(即你要限制的qps),获取到就可以进入Controller中执行。因此结合拦截器去做限流是最合适的。将预先设置的限流策略配置在DynamicConfig(放置在配置文件中,服务启动时会解析配置文件获取到限流策略,做的更好的原创 2021-08-31 11:02:52 · 536 阅读 · 0 评论 -
Thrift IDL基本语法
文章目录thrift原理IDL基本类型object类型struct 结构体Container (容器)enum (枚举)常量类型ExceptionService (服务定义类型)Namespace (名字空间)Comment (注释)thrift原理https://www.jianshu.com/p/f12a442d510cIDLThrift 采用IDL(Interface Definition Language)来定义通用的服务接口,然后通过Thrift提供的编译器,可以将服务接口编译成不同语言编原创 2021-08-26 09:47:19 · 503 阅读 · 0 评论 -
mysql explain
mysql explain 作用与示例参数总览idselect_typetable:当前表名partitions:匹配的分区type例子key:MYSQL使用的索引key_len:使用到的索引长度refrowsfilterrdExtra参考:http://weikeqin.com/2020/02/05/mysql-explain/作用与示例在使用MySQL时,如果发现查询语句耗时,会进行排查及调优,其中常用的一个方法是用explain查看sql执行计划。-- 单层mysql> explain原创 2021-06-19 19:19:51 · 463 阅读 · 0 评论 -
MySQL 死锁快速解决方案与死锁处理策略
MySQL 锁表后快速解决方法遇到锁表快速解决办法步骤中涉及到的表详解case构建与实操死锁处理策略问题与思索主从备份时发生DDL删数据三种方案思考遇到锁表快速解决办法参考:MySQL锁表后快速解决方法与锁这个作者的MySQL专栏值得看一下:http://weikeqin.com/categories/mysql/依次执行1-6步,运行第6步生成的语句即可。如果特别着急,运行 1 2 6 步 以及第6步生成的kill语句 即可。第1步 查看表是否在使用。show open tables whe原创 2021-06-19 18:46:19 · 3784 阅读 · 0 评论 -
JVM定位线上问题
线上问题定位参考核心思路定位流程图示核心排查步骤几个核心步骤的排查例子内存消耗过大,导致Full GC次数过多代码中有大量消耗CPU的操作,导致CPU过高,系统运行缓慢由于锁使用不当,导致死锁。随机出现大量线程访问接口缓慢。某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现环境排查部分,Linux命令详解top命令:内存:free与vm_stat命令磁盘代码排查部分,Linux命令详解火焰图其他分析工具(Arthas、JProfiler、MAT)案例参考PDF教程《Java原创 2021-06-15 12:14:18 · 1514 阅读 · 3 评论 -
SSO实现的参考贴
OAuth2OAuth2学习(一)——初识OAuth2https://blog.csdn.net/Anumbrella/article/details/99710044OAuth2学习(二)——OAuth2实战https://blog.csdn.net/Anumbrella/article/details/100943635OAuth2学习(三)——OAuth2信息持久化存储https://blog.csdn.net/Anumbrella/article/details/103301739CS原创 2021-04-22 19:17:59 · 74 阅读 · 0 评论 -
单点登录的几种方案
单点登录单点登录存在原因方案一方案二:session同步方案三:第三方存储件存储session方案四:对接第三方系统的单点登录视频讲解链接单点登录存在原因分布式微服务成为主流的情况下,需要解决只能在单个用户模块存储session的问题,其他模块需要能够同样取到用户的信息,避免用户反复登录。方案一Nginx代理,对IP进行hash,该IP生成的session存储在某一台服务器中方案问题:单点故障:某台服务器宕机,该服务器存储的所有session丢失,违背高可用。所有服务器都具备全量模块,原创 2021-03-23 20:24:28 · 5640 阅读 · 1 评论 -
Spring经典问题收录
Spring经典问题收录问题集合Spring题目合集对Spring的认识与理解Spring采取了以下4种关键策略:Spring的优缺点是什么?Spring IOC的理解简介Spring IoC 的实现机制控制反转(IoC)有什么作用/优势Spring 的 IoC 设计支持功能对AOP的理解简介实现原理多个bean同时满足注入条件,怎么选择;Spring事务传播行为详解Spring容器初始化常用的三种注入方式Spring的BeanPostProcessorSpring的@Configuration原理:Spr原创 2021-03-23 19:49:25 · 98 阅读 · 0 评论 -
Java类加载器的准备和初始化
Java类加载器的准备和初始化一道面试题类加载准备初始化总结转载:Java类加载器的准备和初始化一道面试题一道面试题:给出一个包含 main 方法的类,一些输出语句,让读者判断这些语句的输出顺序。考察Java 类的初始化的顺序,主要为Java 类加载器在加载类时候的两个阶段:准备 和 初始化。题目:public class StaticTest { public static void main(String[] args) { staticFunction();转载 2021-01-12 15:30:07 · 324 阅读 · 1 评论 -
Java8之HashMap详解(一)
Java8之HashMap详解简介Map接口简单说明HashMap内部实现存储结构-字段hash运算定位坐标过程以及优化思路字段介绍扩容机制设计之:哈希桶长度设置Hash桶数组索引位置的方法转自:添加链接描述简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:Map接口简单说明(1) HashMap:它根据键的hashCode值存储数据,大多转载 2021-03-25 09:44:08 · 276 阅读 · 0 评论 -
如何优化锁
如何优化锁并发性能问题的根源锁优化思路并发性能问题的根源线程切换的系统开销操作系统保存和恢复上下文调度器进行线程调度处理器高速缓存重新加载可能导致整个高速缓存区被冲刷,从而带来时间开销锁优化思路多线程对锁资源的竞争会引起上下文切换,锁竞争导致的线程阻塞越多,上下文切换就越频繁,系统的性能开销就越大• 在多线程编程中,锁本身不是性能开销的根源,锁竞争才是性能开销的根源6. 锁优化归根到底是减少竞争减少锁的持有时间7. 锁的持有时间越长,意味着越多的线程在等待该竞争锁释放8. 如果原创 2021-03-24 18:49:26 · 115 阅读 · 0 评论 -
Java8之HashMap详解(二)
Java8之HashMap详解(二)扩容机制:桶长度为2的倍数带来的扩容时index的迅速定位线程安全性:HashMap不支持并发的实例,resize引发的环形链表问题JDK1.8与JDK1.7的性能对比小结扩容机制:桶长度为2的倍数带来的扩容时index的迅速定位扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已转载 2021-03-25 09:44:18 · 115 阅读 · 0 评论 -
Java8 ConcurrentHashMap详解(待补充图示)
Java8 ConcurrentHashMap详解为什么要用ConcurrentHashMap?ConcurrentHashMap的结构HashEntry对象的不变性结构性修改操作:put、remove、clearSegment类ConcurrentHashMap类ConcurrentHashMap的操作put操作get操作size操作remove操作ConcurrentHashMap实现高并发的总结读操作的高效率比HashTable和HashMap拥有更高并发性ConcurrentHashMap的高并发性原创 2021-04-08 10:12:33 · 580 阅读 · 0 评论 -
由BIO到NIO:NIO解决了BIO的哪些问题
三个socket:server端服务器:第一个socket:ServerSocket serverSocket = new ……第二个socket:Socket socket = serverSocket.accept()client端:Socket socket = new Socket()原创 2021-02-22 11:43:38 · 484 阅读 · 0 评论 -
MySQL插入数据很慢优化思路
MySQL插入数据很慢优化思路解决方法与思路解决方法与思路插入数据量非常大的场景加大mysql配置中的bulk_insert_buffer_size,这个参数默认为8Mbulk_insert_buffer_size=100M修改该条记录有助于千万级别数据批量插入。如果只是单纯避免业务侧阻塞改写所有insert语句为insert delayed这个insert delayed不同之处在于:立即返回结果,后台进行处理插入。锁方面的排查业务侧阻塞排查:查询是否是因为线程长期获取不原创 2021-04-13 20:50:38 · 9400 阅读 · 0 评论 -
redis学习笔记2:其他所有内容
redis学习笔记2:其他所有内容pipline持久化RDBAOF重写机制混合持久化过期key的删除策略与内存淘汰策略主从复制哨兵模式事务Redis集群:集群模式详解三种缓存问题Redis大key问题pipline对于pipeline的理解:针对RTT时间进行优化https://blog.csdn.net/w1lgy/article/details/84455579实际上pipeline相当于Java8的stream,将所有命令批量发送给server端去执行而不是一条条执行,同时server端对于批原创 2021-04-13 20:48:41 · 118 阅读 · 0 评论 -
redis基础数据结构与分布式锁实现
redis学习笔记1:redis基础数据结构与分布式锁Redis大纲redis是什么为什么要用 Redis /为什么要用缓存redis性能高的原因不同数据类型的使用场景底层数据结构Redis分布式锁Java锁失效的原因分布式锁的一般实现思路使用redis创建分布式锁:SETNX分布式锁的进化之路redis教程Redis大纲是什么 + 优缺点 + 为什么用性能高的原因单线程与NIO模型 https://www.cnblogs.com/my_life/articles/5320230.html 单r原创 2021-04-13 20:40:48 · 619 阅读 · 0 评论 -
MySQL索引
MySQL索引学习链接索引的本质索引数据结构优化之路B树(PGSQL的索引结构):B+树B树与B+树之间的区别(高频)B+树的数据量:树的高度可控的原因B+树查找稀疏索引与聚簇索引聚簇索引为什么必须有主键且建议整形的自增主键(高频)二级索引/非主键索引/辅助索引联合索引:最左前缀原则。为什么非主键索引结构叶子结点存储的是主键值?索引实例学习链接https://www.bilibili.com/video/BV1xh411Z79d?from=search&seid=2478256420456023原创 2021-04-13 20:29:22 · 94 阅读 · 0 评论 -
索引规约以及索引常见问题
索引规约以及索引常见问题参考链接规约分类索引规约索引常见问题不使用索引的场景参考链接https://www.jianshu.com/p/749f03ff0264规约分类与B+树有关:最左匹配区分度最高用作第一个索引Varchar字段选定长度(区分度与长度区别)禁止左模糊匹配或全模糊防止索引失效:隐式类型转换,无法使用索引的情况:使用不等于或者not in 的时候无法使用索引导致全表扫描is null,not null也无法使用索引字符串不加单引号容易索引失效(如整形会隐式类型转原创 2021-04-13 20:18:13 · 188 阅读 · 0 评论 -
Java NIO
Java NIO主要参考如下系列文章:Java NIO学习与记录(一):初识NIOJava NIO学习与记录(二):FileChannel与Buffer用法与说明Java NIO学习与记录(三): Scatter&Gather介绍及使用Java NIO学习与记录(四): SocketChannel与BIO服务器Java NIO学习与记录(五): 操作系统的I/O模型Java NIO学习与记录(六): NIO线程模型Java NIO学习与记录(七): Reactor单线程模型的实现J原创 2020-12-26 15:26:12 · 146 阅读 · 0 评论 -
Java多线程学习笔记
cpu缓存分为L1-L3级缓存,因为cpu内存与主内存之间的数据IO相对较慢。操作的是副本,处理完毕后再刷入主内存中。可以理解这些都是与硬件有关的操作需要实现线程1去主动寻找主内存的最新结果,再次执行read过程...原创 2021-03-01 20:22:24 · 45 阅读 · 0 评论 -
redis单线程
redis单线程问题:https://www.jianshu.com/p/1817a38cc363Redis 确实是单线程模型,指的是执行 Redis 命令的核心模块是单线程的,而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程的。Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。Red原创 2021-04-12 20:30:42 · 216 阅读 · 0 评论 -
Spring循环依赖
Spring循环依赖学习链接bean的生命周期循环依赖实例循环依赖与生命周期解决循环依赖的过程:三级缓存学习链接https://www.yuque.com/renyong-jmovm/kb/dpzl6ubean的生命周期循环依赖实例同样的B中有对A的依赖循环依赖与生命周期解决循环依赖的过程:三级缓存B先取原始对象放进去,完成自己的初始化就打破了循环依赖AOP存入单例池的对象不是new 出来的原始对象,而是经过代理的对象由上,加一个缓存是不能彻底解决循环依赖的所以说要有一个单原创 2021-04-12 20:29:44 · 118 阅读 · 0 评论 -
上下文切换理解
上下文切换参考链接上下文切换的背后切换诱因参考链接https://www.jianshu.com/p/5549e89133d2https://www.cnblogs.com/sevencutekk/p/11534140.html上下文切换的背后在程序中,上下文切换过程中的“页码”信息是保存在进程控制块(PCB, process control block)中的。PCB还经常被称作“切换桢”(switchframe)。“页码”信息会一直保存到CPU的内存中,直到他们被再次使用。PCB通常是系统内存原创 2021-04-12 20:29:11 · 115 阅读 · 0 评论 -
Java多线程线程池如何设置才合理
Java多线程线程池如何设置才合理参数解释Java本身提供的线程池根据任务类型设置参数线程池采用了“池化”(Pooling)思想。池化,顾名思义,是为了最大化收益并最小化风险,而将资源统一在一起管理的一种思想。参数解释1.corePoolSize:the number of threads to keep in the pool, even if they are idle, unless {@code allowCoreThreadTimeOut} is set(核心线程数大小:不管它们创建以后是原创 2021-04-12 20:28:59 · 417 阅读 · 0 评论 -
Spring生命周期
Spring生命周期视频链接问题清单/引子bean定义Spring对象生命周期狭义生命周期回调的例子广义生命周期:几个关键内容BeanDefinitionBeanFactoryPostProcessorBeanFactory类的扫描过程属性填充:Autowired原理其余过程Spring集成mybatis理解整个bean的生命周期mybatis动态代理生成bean集成思路第一种集成方式第二种集成方式:factoryBean + 动态扫描加载视频链接https://www.bilibili.com/vid原创 2021-04-12 10:29:14 · 485 阅读 · 0 评论 -
MySQL基本逻辑结构笔记
MySQL基本逻辑结构笔记逻辑结构连接器:服务层缓存机制其他逻辑结构连接器:服务层权限修改只有重新建立链接才会加载进来,否则无法加载进来缓存机制缓存区:避免与磁盘进行IO之前查询的结果会存放到缓存区中,以查询的sql为key,指向缓存区中存储的值先从缓存区里面取值;取不到之后再去解析sql语句开始查询注意缓存区的更新,在执行update时会去清理缓存区对于更新比较多的场景,缓存命中率比较低,此时反而会对效率造成影响(多了一个更新缓存区的操作)缓存区适用于读多写少的场景因此有que原创 2021-04-10 17:39:03 · 77 阅读 · 2 评论 -
MySQL日志模块
MySQL日志模块学习链接日志模块简介Bin logRedo Log日志与内存页刷盘WAL机制:学习链接https://www.bilibili.com/video/BV1xh411Z79d?p=38https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html日志模块简介Bin log:逻辑日志(记录逻辑运算过程),相当于AOF,也相当于git的log记录所有操作Redo log:物理日志(记录最终逻辑运算结果),相当于R原创 2021-04-10 17:36:22 · 95 阅读 · 0 评论 -
MySQL主从架构原理
MySQL主从架构原理为什么需要主从架构MySQL主从同步架构弊端常用架构为什么需要主从架构业务的性能瓶颈往往发生在数据库层如何从数据库层面优化整体架构的性能:业务垂直拆分、读写分离绝大多数影响性能的问题出现在数据库资源是有限的,而不是应用节点可以采取的方式:1,业务上的垂直拆分。根据业务进行拆分,各个模块访问各自的数据库,数据库从1个变为3个,数据库之间进行拆分会出现跨库连接问题:反而会增大成本2,对数据库程序涉及到读和写的操作,且绝大多数是写多读少这就引出了读写分离以及MySQL的原创 2021-04-10 17:29:04 · 251 阅读 · 1 评论 -
MySQL事务与锁
MySQL事务与锁参考Part1:关于事务问题清单事务与存储引擎事务的四大特性autocommit变量事务并发的三大问题与隔离级别Part2:三种问题的解决:MVCC与LBCCinnodb的锁官方文档中的所有锁锁的分类表锁与行锁的比较锁的基本模式锁到底锁住了什么?索引!未建立索引会发生什么?Part3:INNODB是如何解决幻读的几个重要的锁的概念原子性与持久性的实现关于死锁当前读与快照读MySQL乐观锁、悲观锁参考https://www.cnblogs.com/crazylqy/p/7611069.h原创 2021-04-10 17:24:50 · 326 阅读 · 0 评论 -
数据库优秀问题收录
数据库优秀问题收录https://www.jianshu.com/p/36347f3eb6b2原创 2021-04-12 20:28:32 · 50 阅读 · 0 评论 -
Java并发包的理解
Java并发包的理解并发包相对于Synchronize的优势AQS理解AQS实现自定义锁的要点并发包同步队列底层总结并发包对wait、notify机制的优化:并发包相对于Synchronize的优势并发包相对于synchronize而言,提供了获取与释放锁的可操作性。支持非阻塞式、可中断以及超时获取锁的机制。AQS理解并发包提供的各种锁比如可重入锁、读写锁等的底层是通过AQS实现的。AQS解决了实现锁时涉及当的大量细节问题,例如获取锁的同步状态(通过volatile变量实现)、维护了与synchr原创 2021-04-09 17:15:27 · 440 阅读 · 0 评论 -
避免死锁的方法
避免死锁的方法死锁的四个条件避免死锁的技巧死锁的四个条件死锁的四个条件:互斥使用/独占不可剥夺保持与请求循环等待从破坏这四个条件入手避免死锁的技巧代码坏味道:避免一个线程持有多个锁避免一个线程占有多个资源(资源背后可能有锁)使用锁尽可能使用定时锁lock的写法:private final Object lock = ……一定要在finally中完成锁的释放其中:5.1:内部使用锁对象暴露给外界容易引起DOS攻击,长久持有从而引起死锁5.2:Boolean.TRUE原创 2021-04-09 17:11:45 · 211 阅读 · 0 评论 -
乐观锁与悲观锁
乐观锁与悲观锁常见问题总结文字总结常见问题总结git本身也是MVCC的典型例子。文字总结悲观锁悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。乐观锁乐观锁(Optimistic Lock),顾名思义,就原创 2021-04-09 17:07:22 · 57 阅读 · 0 评论 -
Java多线程学习笔记
Java多线程学习笔记JMM内存模型由CPU内存模型到JMM内存模型JMM真正的原子操作JMM内存模型竞态条件原因volatile、synchronize、CAS的原子性、可见性、有序性Volatile + CAS原理理解总结具体解释缓存一致性协议CAS + volatile实例:AtomicCAS的问题CAS + Volatile 实例:并发包的理解CAS减少线程切换原因Java锁的分类Synchronize1.6 -》 1.8锁的优化锁的实际存储结构锁的底层锁的优化实例:分段思想其他关于线程的内容使用原创 2021-04-09 17:03:37 · 137 阅读 · 0 评论 -
Java单例的五种模式
https://www.cnblogs.com/LemonFive/p/11149034.html最推荐Enum的模式:《Effective Java》第三条,P13原创 2021-04-09 16:35:18 · 73 阅读 · 0 评论