- 博客(54)
- 资源 (3)
- 收藏
- 关注
原创 快速定位解决Maven依赖冲突
在日常使用Maven中,随着我们导入包的增多,我们经常会发生一些包冲突的情况,那么我们应该怎么去快速定位并解决他呢。此处我以以下包冲突报错为例子展开解释:SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/E:/JavaWeb/LocalMoven/ch/qos/logba...
2019-06-13 20:16:39 1225
原创 Redis的应用の使用SpringSession实现WebSocket的用户身份认证
之前有过两篇博文是有关WebSocket身份认证的WebSocket的用户身份认证 关于使用浏览器与PostMan测试springSession每次返回的x-auto-token不一致的问题解决当时是处于一个探索的环节,现在我们将使用SpringSession、Redis,通过Header认证来实现WebSocket中用户身份的认证。注意:为了简化文章,我们假设用户已经是通过登录并且获得x...
2019-05-22 00:41:40 1265
原创 平衡二叉树代码与解析(旋转操作,插入,删除,合并,分裂,凹入表打印)
一 简介平衡二叉查找树简称平衡二叉树,又称之为AVL以下的树是平衡二叉树:空树任意节点的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差的绝对值不超过1**平衡因子:**某平衡二叉树结点的左子树的高度减去它的右子树的高度。当一个结点的平衡因子的绝对值大于1时,那么这棵树就失去了平衡。平衡因子有如下定义:// 定义平衡因子// 左高#define LH +1// 等高...
2019-01-12 10:05:27 1527
原创 Request IO流无法重复读取的原因和解决方法
Request IO流只能读取一次的原因和解决方法欢迎关注驿外残香 | HC的博客使用环境SpringBoot 2.x, Spring 4.x探索路线只能读一次的原因首先要知道为什么httpServletRequest的流只能读取一次。调用httpServletRequest.getInputStream()可以看到获取的流类型为ServletInputStream,继承InputS...
2018-12-11 16:08:49 4644 3
原创 Innodb的LRU列表解析
Innodb为了加快对磁盘中数据的操作,在操作磁盘上的数据时,会先把数据存放到一块名为Buffer Pool的内存缓冲池中(缓冲池以页为单位进行缓存,页大小为16K)。由于受到机器限制,内存的大小远小于磁盘的大小,因此需要一种机制来淘汰非热点数据,保证内存中存在的数据是较为频繁访问的数据。其中LRU是这种管理场景下最常用的算法,LRU算法的思想为:新数据插入到链表头部;每当缓存命中(即缓...
2019-10-24 23:32:55 901 1
原创 Innodb对于行级锁算法的选用
行级锁主要有三种算法:Record Lock:单个行记录上的锁。Gap Lock:间隙锁。锁定一个范围,但不包含记录本身Next-Key Lock:锁定一个范围,并且包含记录本身。在InooDB中对于行的查询都是采用Next-Key Lock这种锁定算法,该锁定算法的使用存在三种情况:当进行锁定的列是主键且唯一时,Next-Key Lock降级为Record Lock。...
2019-10-19 23:07:10 354 2
原创 从时序图出发详解PC算法
在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。为了对用户提供正确的增\删\改\差等语义,我们需要保证这些放置在不同物理机器上的副本是一致的。而PC则是为了解决不同物理机器上的副本的事务数据一致性的问题。在分布式系统中事务与单机应用事务不一样的地方是:可能会因为服务宕机或者网络不通的情况而导致数据不一致,接下来让我们按...
2019-09-17 22:13:40 2333
原创 Saga分布式事务
一、简介与分布式事务TCC一样,目的都是为了在各个服务中正常使用事务。和TCC相比,Saga没有“预留”动作,操作都是直接提交到库。其中:每个Saga由一系列sub-transaction Ti 组成每个Ti 都有对应的补偿动作Ci,补偿动作用于撤销Ti造成的结果既然Saga的操作都是直接提交到库中,那么当后续的服务操作失败时,我们需要一种方法将已被改变的值更改为之前的状态。为此Sa...
2019-09-15 14:57:00 548
原创 分布式事务
文章目录一、基础1.1 简介1.2 产生的原因1.3 理论基础1.3.1 CAP理论1.3.2 BASE理论1.3.4 XA协议1.4 解决方案1.4.1 全局事务(DTP模型)1.4.2 基于可靠消息服务的分布式事务1.4.3 本地事务(接1.4.2)1.4.4 TCC(两阶段型、补偿型)1.4.5 Saga工作流事务模型二、分布式事务理论2.1 1PC2.2 2PC2.3 3PC2.4 Pax...
2019-09-15 13:53:49 459
原创 TCC分布式事务
TCC是一个分布式的事务,主要用于多个微服务系统之间的事务。简单来说,它的产生是为了解决微服务中事务的隔离性。TCC一共分为三个阶段,分别是Try、Comfirm、Cancel。此处假设我们正在开发一个电商系统,一共涉及到订单服务、支付服务、库存服务:按照最简单的理解,在用户下单时,需要:修改订单服务为“已下单”扣除零钱减少库存对于分布式应用来说,订单服务、支付服务、库存服务分散在...
2019-09-14 14:35:46 1083
原创 MySQL索引优化
文章目录一、EXPLAIN二、索引类型2.1 B-Tree2.2 Hash2.3 InnoDB中的Hash三、索引的优化2.1 保证独立列2.2 使用前缀索引2.3 多列索引2.4 选择合适的索引列顺序2.5 (非)聚簇索引2.6 覆盖索引2.7 索引扫描2.8 压缩索引2.9 小技巧四、索引、表的维护4.1 找到并修复损坏的表4.2 更新索引统计信息4.3 减少索引和数据的碎片五、总结一、EX...
2019-09-09 15:17:28 519
原创 Zookeeper分布式集群搭建
1.初始准备:准备3台虚拟机,其IP分别为:192.168.42.128192.168.42.129192.168.42.130需要安装好JDK,环境生效即可2.配置IP映射编辑/etc/hosts配置文件:vim /etc/hosts # 三台机器都需要操作# 添加以下内容192.168.42.128 Master192.168.42.129 Slave11...
2019-07-28 11:02:51 149
原创 Spark分布式集群搭建
1.初始准备:准备3台虚拟机,其IP分别为:192.168.42.128192.168.42.129192.168.42.130需要安装好JDK,环境生效即可安装好Hadoop集群2.配置IP映射编辑/etc/hosts配置文件:vim /etc/hosts # 三台机器都需要操作# 添加以下内容192.168.42.128 Master192.168.42....
2019-07-28 11:01:42 265
原创 Kafka分布式集群搭建
1.初始准备:准备3台虚拟机,其IP分别为:192.168.42.128192.168.42.129192.168.42.130需要安装好JDK,环境生效即可根据之前的教程安装好Zookeeper2.配置IP映射编辑/etc/hosts配置文件:vim /etc/hosts # 三台机器都需要操作# 添加以下内容192.168.42.128 Master192...
2019-07-28 11:00:07 154
原创 HBase分布式集群搭建
1.初始准备:准备3台虚拟机,其IP分别为:192.168.42.128192.168.42.129192.168.42.130需要安装好JDK,环境生效即可需要配置好Hadoop并启动配置好Zookeeper(可选)2.配置IP映射编辑/etc/hosts配置文件:vim /etc/hosts # 三台机器都需要操作# 添加以下内容192.168.42.12...
2019-07-28 10:57:22 126
原创 Hadoop分布式集群搭建
1.初始准备:准备3台虚拟机,其IP分别为:192.168.42.128192.168.42.129192.168.42.130需要安装好JDK,环境生效即可2.配置IP映射编辑/etc/hosts配置文件:vim /etc/hosts # 三台机器都需要操作# 添加以下内容192.168.42.128 Master192.168.42.129 Slave11...
2019-07-24 15:10:00 185 2
原创 shell脚本根据端口杀死进程(带完整解析)
在项目开发的时候,我们经常需要根据相对应的端口来杀死进程,而这样的操作最少需要两步:root@qg:~# netstat -nlp | grep 11120tcp 0 0 0.0.0.0:11120 0.0.0.0:* LISTEN 20247/javaroot@qg:~# kill -9 20247一次还好,但是多次操作之...
2019-07-07 00:40:01 8100 7
原创 详解跨域问题出现及解决的原理
在本机使用浏览器访问远程服务器进行开发时,我们经常会碰到这种报错信息:XMLHttpRequest cannot load xxxxxxxx. Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.了解过的人一眼就看出了是出现了跨域问题。那...
2019-07-03 11:36:13 1146
原创 两分钟教你用Tomcat快速搭建文件服务器
使用SpringBoot将项目打成Jar包在部署的时候十分方便,但同时在上传文件后用户不能直接访问服务器上的文件资源。这时我们便需要构建一个文件服务器来提供给用户进行访问。若没有特殊的需求,相比较于构建FTP服务器,使用Tomcat构建服务器会更加方便快捷,此处有两种使用Tomcat构建服务器的方法:第一种:直接把文件放在 tomcat/webapps/ROOT 目录下,然后在网址中访问ht...
2019-07-03 01:45:53 1316
原创 玩转Linux发行版三:Manjaro的初始配置与常用软件安装
文章目录一、基础配置1.1 更改源1.2 升级系统1.3 安装vim1.4 添加Archlinuxcn源1.5 安装archlinuxcn签名钥匙二、添加软件2.1 搜狗输入法2.2 Google浏览器2.3 zsh2.4 wine2.5 Deepin-Wine2.6 微信2.7 Tim2.8 截图工具2.9 网易云音乐2.10 markdown编辑器2.11 pdf阅读器2.12 WPS2.13...
2019-06-26 02:50:17 3089
原创 玩转Linux发行版二:Manjaro的安装(亲测可用)
一、简介作为一款Linux的发行版,Manjaro继承自Arch Linux,拥有独特的滚动更新机制,并且更新会比Arch Linux晚几周,滚挂的概率也会随之变小。在DistroWatch的统计上,Manjaro受到关注的热度十分靠前,是全球排名第1的Linux发行版。(排名数据源于DistroWatch,统计日期2018.03.02,时间段3个月。) ,不过国内众多Ubuntu开发者的环境...
2019-06-26 02:48:43 7313 1
原创 玩转Linux发行版一:发行版选择
作为自己学习桌面应用的笔记,欢迎交流。作为一个身在windows系统,买不起Mac本的大二学生,一直有着想用下Linux系统的梦。不过捣鼓了一会儿只想说:如果是作为办公娱乐的,追求稳定的,还是windows系统好,对于我这样的初学者来说,Linux系统确实会出现很多迷一般的操作。在作为服务器用途的Linux上命令行操作确实很方便很简洁,但是搬到个人电脑上还是有点捉襟见肘的感觉,不过相信随着时间...
2019-06-25 17:41:01 380
原创 MongoDB指令大全
声明:这是一份查看指令的文档而不是教程,对于一些不多用的操作不录入。文章目录一、系统操作1.1 启动服务器1.2 连接服务器1.3 安装服务1.4 使用场景二、 基本操作2.1 数据类型2.1.1 浮点数2.1.2 整数2.1.3 字符串2.1.4 正则表达式2.1.5 数组2.1.6 日期2.1.7 内嵌文档2.1.8 ObjectId2.1.9二进制2.1.10 JS代码2.2 数据库操作2...
2019-06-10 09:30:14 2729
原创 搭建Redis集群与哨兵模式的参考博文与常见错误
最近进行了Redis集群的学习和配置,可以参考了以下博客:主线Redis集群的原理和搭建redis5.0后放弃了Ruby的集群方式,大大简化了集群的构建复杂度redis5.0集群(用3台虚拟机模拟3主3备)(未尝试)Redis容灾部署哨兵(sentinel)机制配置详解及原理介绍(配置)Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)(深入原...
2019-05-21 23:06:50 1002
原创 基于反射与动态代理封装SQL实战(一):整体框架介绍
一 前言(1)前言最近在学习动态代理的时候,把使用动态代理封装数据库的操作当成一个练习来做。现在分享一下,也当成一个复习动态代理的机会。大家有什么好的想法、问题还是建议都可以在评论区指出。完整源码在GitHub:https://github.com/attendent/distrubuted(2)实现的功能介绍一下目前完成的部分以及后面会涉及到的博客内容:可使用@AutoDao实现实...
2019-05-10 00:41:11 192
原创 基于Springboot的SSO单点登陆系统的注销操作实战
一 前言这个是续上一篇基于Springboot、Java的SSO单点登陆系统的简单实现后续的篇章,因为长度有点长,为了提高阅读体验,就拆分成两篇了。如果还没有看过上篇的朋友建议先看一下,文末会给出GitHub地址。(1)使用环境:SpringBoot2.XMyBatis基于redis存储的springSession(2)基础学习:关于SSO的基础学习可以参考该文章:单点登录(SSO)...
2019-05-08 16:49:52 1158
原创 基于Springboot的SSO单点登陆系统的登陆操作实战
一 前言(1)使用环境:SpringBoot2.XMyBatis基于redis存储的springSession(2)基础学习:关于SSO的基础学习可以参考该文章:单点登录(SSO),从原理到实现代码风格使用的是晓风轻的代码规范,对于其中的AOP实现此处不会给出代码,具体可以在文章尾部的gitHub上查看:我的编码习惯 - Controller规范进阶可以参考:单点登录(一)----...
2019-05-08 15:37:00 3131 7
原创 Gson在解析对象嵌套泛型数据时抛出异常
一 前言抛出异常:// class为你类型转化的类的全限定名com.google.gson.internal.LinkedTreeMap cannot be cast to my class需要解析的类:@Data@NoArgsConstructor@AllArgsConstructor@Accessors(chain = true)public class RequestBe...
2019-05-07 01:39:57 954
原创 关于使用浏览器与PostMan测试springSession每次返回的x-auto-token不一致的问题解决
一 前言在之前,我曾发过一篇博客WebSocket的用户身份认证,主要探讨了在WebSocket中用户应该如何认证身份,其中提到了一个问题:每次发起请求服务器都会存储一个session并返回该session的Id,此处为header中的x-auto-token,长此以往,redis将被一堆无用session填满。注意:下面我所说的redis存储session都是使用header进行认证的。我...
2019-05-06 12:05:09 2043
原创 JUC源码解析九:基本数据类型的原子类
一、AtomicInteger如果你学过JVM内存模型你应该知道原子性以及可见性的概念,在对于一个基本类型的修改中,上述两种原则体现在:一个参数的自增操作其实使用了三条原句方才完成,而在并发条件下,在微观下你不能够保证三条原句能够依次执行而中间没有插入对该参数的其他修改操作。一个字段需要将高速缓存块中的数据刷新到内存中并且使其他CPU高速缓存行中的相应数据失效。想要详细了解的可以了解下...
2019-04-26 12:32:55 305
原创 解读ThreadLocal与Java实战
一 前言在多线程并发的学习中,我们总会接触到一个类,即是ThreadLocal。这个类的作用是提供线程内的局部变量,换句话来说,就是提供一个能与当前线程绑定的局部变量。这个变量能够在多线程并发的环境下保证每个线程中变量的独立性。只要线程处于活动状态并且Threadocal实例可以访问,每个线程就拥有对其线程局部变量副本的隐式引用;在一个线程消失之后,线程本地实例的所有副本都会被垃圾收集(除非存...
2019-04-19 15:21:10 204
原创 Java虚拟机的运行时数据区域
文章目录一 前言二 运行时区域2.1 程序计数器(Program Counter Register)2.2 Java虚拟机栈(JVM Stack)2.3 本地方法栈(Native Method Stack)2.4 Java堆(Java Heap)2.5 方法区(Method Area)2.6 运行时常量(Runtime Constant Pool)2.7 直接内存(Direct Memory)三 ...
2019-04-16 17:17:28 159
原创 JUC源码解析八:ReentrantReadWriterLock读写锁源码解析
一 前言ReentrantReadWriterLock这个类顾名思义就是一个同时支持读锁与写锁的可重入类。跟ReentrantLock相比不仅多了读锁的可共享锁,还对读与写进行了分类,在内部对其进行协调(读锁升级为写锁、写锁降级为读锁)。另外读写锁最多支持2^16-1个递归写入锁和2^16-1个递归读取锁,相比ReentrantLock的2^32-1少了很多,原因则是ReentrantReadW...
2019-04-10 00:49:56 308
原创 JUC源码解析七:Semaphore源码解析
一 前言Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。使用Semaphore可以同时允许指定的线程数量同时执行,超过该数量的线程必须等待直到有线程执行完其任务。特别说明的是信号量只是在信号不够的时候挂起线程,但是并不能保证信号量足够的时候获取对象和返还对象是线程安全的,所以仍需要锁Lock来保证并发的正确性。将信号量的许可值...
2019-04-07 09:55:56 202
原创 JUC源码解析六:CyclicBarrier源码解析
一 前言前面我们学了一次性的闭锁CountDownLatch,下面我们会接触到一个可以循环的同步辅助类:CyclicBarrier,它允许一组线程互相等待,直到到达某个公共屏障点,在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。CyclicBarrier类似于CountDownLatch的地方是它本身也是个计数器,用以计数的变量则是初始化时传入的变量count。不同点则是Cycl...
2019-04-05 20:16:59 505
原创 JUC源码解析五:Latch——闭锁
一 前言闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。可以想象一下在高铁开始验票之前,所有的闸机都是关闭的。这时候把关闭状态的闸机想象成一条被阻塞的线程。当开始验票的时候,所有的闸机也就是线程都被打开唤醒了。而一次验票是一次性的,当闭锁打开之后这个闭锁的状态也就失效了。针对与闭锁在Java中我们常用的是一个CountDownLatch的类,它允许一个或者多个线程...
2019-04-03 13:02:16 444
原创 JUC源码解析四:signal()与sgnalAll()方法的层层剥析
一 前言这一次在await()方法的后面讲,所以这里涉及到的一些写过的基础知识就不再重复了。二 signal()还是国际惯例,从入口处出发: // 将Condition的FIFO条件队列中的第一个线程唤醒 public final void signal() { // 若当前线程不持有锁,则抛出异常 if (!isHeldE...
2019-04-01 19:13:10 778
原创 Nginx的配置大全(经测试可用)
文章目录一 Nginx下载安装二 Nginx启动三 Nginx配置四 Nginx日志管理五 Nginx实现视频点播六 Nginx实现直播七 Nginx实现视频回放八 Nginx实现负载均衡九 Nginx实现IP黑名单十 安装SSL证书十一 限流模块的安装状态模块Lua模块Centos7启动脚本openssl配置存在问题1. Nginx编译失败1.1 缺少编译环境1.2 缺少HTTP rewrite...
2019-04-01 16:48:45 2235 3
原创 集合源码解析六:基本函数式接口
前言建议看集合源码的童鞋先看着这篇,顺序放错了我也很不好意思~这个应该不算是集合源码的一部分,但是有很多集合源码都使用到了函数式接口,于是写一下这个~其实我们可以看到JDK提供了许多函数式接口,当实际上理解了一下几个其他的也差不多能够轻松上手。一 Function功能型函数式接口// 表示接受一个参数并生成结果的函数。@FunctionalInterfacepublic interfa...
2019-04-01 16:44:40 151
原创 集合源码解析五:LinkedList
一 简介LikedList实现了List跟Deque接口,并且实现了所有可选择的list操作。同时允许存储所有的元素(包括空值)由于HashSet的迭代器消耗的时间与HashSet实例元素的大小成正比,再加上capacity容量是依靠HashMap进行实现的,因此在迭代器的效率需要得到重视的情况下,请不要设置太大的初始容量以及太小的加载因子HashSet并没有实现同步,因此在多条线程操作Ha...
2019-04-01 16:41:25 153
Servlet+JSP+MySQL实现的的登录注册页面
2018-05-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人