Debug方式讲解Rabbitmq的自动ACK和手动ACK 介绍Rabbitmq的手动ACK和自动ACK当消息一旦被消费者接收,队列中的消息就会被删除。那么问题来了:RabbitMQ怎么知道消息被接收了呢?这就要通过消息确认机制(Acknowlege)来实现了。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:自动ACK:消息一旦被接收,消费者自动发送ACK手动ACK:消息接收后,不会发送A...
Redis在Centos上面进行编译安装 安装redis编译的c环境,yum install gcc-c++上传redis压缩包到linux服务器,并解压redis压缩包这里使用的是redis-3.0.0.tar.gz,解压到/usr/local/java下然后进入redis-3.0.0目录,然后使用make命令编译redis在redis-3.0.0目录中,使用make PREFIX=/usr/local/java/redi...
ubuntu安装|卸载docker Ubuntu安装Docker这个网上有不少,这个正常安装就能够搞定了首先使用命令sudo apt update 更新安装包,我的已经更新过了,所以无需更新sudo apt update然后使用命令sudo apt install docker.iosudo apt install docker.io然后就可以使用sudo docker version命令看安装好的版本了sud...
深入探究@Mock注解的底层原理 Mockito框架里面的@mock注解吗大公司里面测试是非常重要的,几乎占到了开发的二分之一公司,而Mockito框架是Java测试的首选,然后@Mock注解又是Mockito框架里面的重中之重,了解@Mock注解的原理对于Java的测试是非常有帮助的。
事务的ACID 为什么叫做acid呢因为下面这几个单词1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。...
jdk1.7ConcurrentHashMap源码探究 出现背景1、线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。2、效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用p
Java源码中经常看到的CountDownLatch类详解 我们在Java源码里面经常看到CountDownLatch类的存在,它的作用是什么呢,今天我们来揭开它的真面目。您请往下看CountDownLatch类的作用是什么CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数...
Idea运行报错Error running ‘Application‘: Command line is too long的解决方法 新项目再Idea里面启动的时候,有的时候报错信息如下所示怎么解决呢,首先找到项目里面的idea/workspace.xml文件,然后再找到标签,标签如下所示然后再在component 标签里加一行 ,就是变成下面这样这样在启动项目,就不会报错了,؏؏☝ᖗ乛◡乛ᖘ☝؏؏...
一文看懂怎么解决Maven依赖冲突问题 在本文中,我们将讲到如何处理Maven的依赖冲突不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问题,甚至发生这些问题的Java类你没都没有听说过。要搞清楚这里面的缘由,我们得学习Maven对依赖冲突的处理机制。Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即...
分布式唯一ID生成系列(5)——Twitter的雪法算法Snowflake适合做分布式ID吗 介绍Snowflake算法SnowFlake算法是国际大公司Twitter的采用的一种生成分布式自增id的策略,这个算法产生的分布式id是足够我们我们中小公司在日常里面的使用了。我也是比较推荐这一种算法产生的分布式id的。算法snowflake的生成的分布式id结构组成部分算法snowflake生成id的结果是一个64bit大小的整数,它的结构如下图,这里我么来讲一下这个结构:首先因为w...
分布式唯一ID生成系列(4)——Redis集群实现的分布式ID适合做分布式ID吗 首先是项目地址:https://github.com/maqiankun/distributed-id-redis-generator关于Redis集群生成分布式ID,这里要先了解redis使用lua脚本的时候的EVAL,EVALSHA命令:https://www.runoob.com/redis/scripting-eval.htmlhttps://www.runoob.com/redi...
分布式唯一ID生成系列(3)——数据库自增ID机制适合做分布式ID吗 数据库自增ID机制原理介绍在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似,不同点在于:replace into首先尝试插入数据列表中,如果发现表中已经有此行数据(根据主键或唯一...
分布式唯一ID生成系列(2)——UUID适合做分布式ID吗 UUID的生成策略:UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。UUID的底层是由一组32位数的16进制数字构成,是故 UUID 理论上的总数为 ,约等于 ,也就是说若每纳秒产生1百万个 UUID,要花100亿年才会将所有 UUID 用完(100亿年啊,地...
分布式唯一ID生成系列(1)——为什么需要分布式ID以及分布式ID的业务需求 为什么需要分布式id生成系统在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些...
大白话讲解分布式里面的Cap原则 什么叫做capCap分别指可用性,分区容错性,一致性分区容错性如下图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。所以在cap原则里面,分区容错性是必须要有的一致性一致性的意思是,写操作之后的读操作,必须返回该修改后的值。举例来说,某条记录...
Java里面的四种引用:强引用,软引用,弱引用,虚引用 在垃圾回收的时候,被释放的对象要考虑什么样的对象内存要被GC回收掉,那么怎么判断哪些对象要被回收掉呢,在java里面定义了四种引用对象,不同的引用对象在被GC扫描的时候,会有不同的处理方式,这里我们来看一下强引用强引用介绍强引用是用来描述必须存在和引用的对象,比如Object a=new Object(),只要强引用还存在,被引用的对象就永远不会被回收。强引用怎么被垃圾回收方法里面的局部...
Mysql索引底层的Bmore树设置非叶子节点数据小于4KB来减少IO磁盘读取次数 原因如下所示因为数据库里面的索引就是使用的bmore树,所以我们使用sql语句来讲解bmore树的产生:比如有下面的两个常用的需求:根据某个值查找数据,比如select * from user where id=1234;根据区间值来查找某些数据,比如select * from user where id > 1234 and id < 2345。为了让二叉查找树支持按照区...
linux查看日志的奇淫技巧 对于日志很大,打开的时候造成服务器压力的日志文件怎么处理首先介绍命令,下面的awk ‘END{print NR}’ hello.txt表示查看hello.txt文件里面总共有多少行,下面的sed -n ‘1,3p’ hello.txt表示把hello.txt文件里面的第一行到第三行里面的内容给输出来awk 'END{print NR}' hello.txtsed -n '1,3p' hell...
算法题之动态规划-01背包问题 文字介绍解决背包问题假设山洞里共有a,b,c,d ,e这5件宝物(不是5种宝物),它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包, 怎么装背包,可以才能带走最多的财富。此时只要理解了状态转换方程f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] },就知道这道算法的答案了,这个状态转换方...
Java面试之内存屏障 为什么要有内存屏障这个是为了解决因为cpu,高速缓存,主内存出现的时候,导致的可见性和重序性问题,什么问题呢,看下面的代码我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利用率,现代处理器结构都加入了一层读写速度尽可能接近CP...
cpu,高速缓冲区,主内存导致可见性和重排序问题 cpu,高速缓冲区,主内存之间的关系我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利用率,现代处理器结构都加入了一层读写速度尽可能接近CPU运算速度的高速缓存来作为内存与CPU之间的缓冲:将运算需要使用的数据复制到缓存中,让C...
模拟并解决缓存穿透 什么叫做缓存穿透缓存穿透只会发生在高并发的时候,就是当有10000个并发进行查询数据的时候,我们一般都会先去redis里面查询进行数据,但是如果redis里面没有这个数据的时候,那么这10000个并发里面就会有很大一部分并发会一下子都去mysql数据库里面进行查询了解决缓存穿透首先我模拟一下缓存穿透比如下面的代码Pom.xml代码<?xml version="1.0" encod...
jvm内存泄漏 内存泄漏和内存溢出的关系内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。从定义上可以看出内存泄露是内存溢出的一种诱因,但是不是唯一因素。可以使用Runtime.ge...
Jvm内存溢出 堆内存溢出(outOfMemoryError:java heap space)在jvm规范中,堆中的内存是用来生成对象实例和数组的。如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。当生成新对象时,内存的申请过程如下:a、jvm先尝试在eden区分配新建对象所需的内存;b、如果内存大小足够,申请结束,否则下一步;c、jvm启动youngGC,试图将...
大白话讲解Mysql之悲观锁 悲观锁悲观锁的原理是什么呢,就是给c事务里面的某一个sql语句添加一把锁,当a线程执行这个有锁的sql语句的时候,b线程就只能执行到c事务里面这个有锁的sql语句前面的一些sql语句,然后等到a线程执行完这个有锁的sql语句的事务的时候,b线程才能执行c事务里面有锁的sql语句实例讲解悲观锁
大白话讲解Mysql之乐观锁 乐观锁什么是乐观锁什么是乐观锁呢,就是给数据库的数据表添加一个字段version,在更新数据库记录是将version加1,从而在修改数据时通过检查版本号是否改变判断出当前更新基于的查询是否已经是过时的版本。不是太好理解,这里我么就借助实例来讲解乐观锁(下面实例讲解的过程中,商品的数量就可以直接相当于字段version了,所以就没有在加version字段了)。这里就使用乐观锁来解决购买商品时候...
事务里面的脏读、不可重复读、虚读/幻读 脏读举例演示脏读脏读就是B事务读取到了A事务尚未提交的数据 ,什么意思呢,往下看首先执行下面的sql语句drop table acount;create table acount(id int,name varchar(225),money int);insert into acount values(1,'tom',2500);insert into acount val...
应用层协议详解 使用http协议讲解应用层协议首先查看linux里面有没有telnet命令,如果没有的话,就使用下面的命令进行安装telnet命令yum install xinetd telnet telnet-server -y然后执行下面的命令,telnet命令本身就是一个应用层协议,它的作用是在两台主机间,建立一个连接,也就是打开两台主机间文本传输的一个通道。"telnet google.com ...
网络通信协议 网络通信协议什么是网络通信协议Tcp/ip协议可不是单单指tcp协议和ip协议Tcp/ip协议里面的网络模型层Tcp/ip协议里面的网络模型层如下所示应用层协议举例讲解应用层协议传输层协议网络层协议链路层协议通过一次数据的传输来讲解Tcp/ip协议里面的网络模型层什么是网络通信协议通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道...
java类的加载过程 类的加载过程目录什么是类的加载过程类加载的过程讲解第一个部分:加载阶段加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情,就是下面的三件在类的加载过程中,相对于类加载过程里面的的连接和初始化阶段而言,加载阶段是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。第二个部分:连接阶段连接阶段之验证小阶段验证的目的验证做的具体内...
ConstantValue属性 ConstantValue属性在类加载过程的准备阶段做的事情是什么在编译时Javac将会为被static和final修改的常量生成ConstantValue属性(此时ConstantValue属性的值是多少,暂时不知道,),在类加载的准备阶段虚拟机便会根据ConstantValue为常量设置相应的值(这个值是什么意思呢,比如我们在程序中定义final static int a = 100,那么这...
Nginx实现负载均衡 在看这个知识点之前,先学会nginx的反向代理先看nginx的反向代理,就看这个链接:https://blog.csdn.net/weixin_43689480/article/details/95860813nginx实现负载均衡的过程想要的结果就是:给 www.sina.com 添加多个tomcat服务器首先安装两个tomcat服务器,都放到nginx服务器里面,两个端口分别是80...
EditPlus操作linux里面的文件 有的时候我们不是很了解vi命令,不好处理linux里面的文件,此时告诉大家一个好技巧,就是通过EditPlus来链接你的linux服务器,来处理linux里面的文件,十分好用哦。连接过程如下首先选中下面的FTP settings然后就是点击add添加你的linux服务器然后要注意点击下面的Advanced Options选项进行配置然后在注意点击下面的OK然后我们就可以愉快的...
nginx报错403 forbidden 访问nginx的时候报错了403 forbidden然后看我看nginx的日志/var/log/nginx/error.log里面报错,说明没有权限[error] 1996#0: *1 open() "/root/nginx/html/favicon.ico" failed (13: Permission denied), client: 42.120.74.111, server: loc...
Nginx的安装 首先是安装前准备环境首先需要安装gcc的环境yum install gcc-c++下面表示已经安装好了,所以不会在安装了然后是安装PCREPCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。yum inst...
阿里云域名绑定ip 首先点击域名的解析按钮然后点击新手引导然后输入ip地址然后启动自己服务器里的nginx服务器,此时使用域名访问就成功了怎么安装nginx,看这个文章https://blog.csdn.net/weixin_43689480/article/details/95771905...
解决linux端口占用 就比如解决redis的端口占用使用redis-server启动,发现6379端口被占用了使用下面的命令,查看端口,找到pidnetstat -apn|grep :6379然后使用kill -9 pid来关闭端口kill -9 25768...
数据结构的时间复杂度和空间复杂度 为什么需要时间复杂度和空间复杂度你可能会有些疑惑,我把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。为什么还要做时间、空间复杂度分析呢?这种分析方法能比我实实在在跑一遍得到的数据更准确吗?首先,我可以肯定地说,你这种评估算法执行效率的方法是正确的。很多数据结构和算法书籍还给这种方法起了一个名字,叫事后统计法。但是,这种统计方法有非常大的局限性。1. 测试结果...
Mockito框架里面的@Mock注解底层原理 @Mock注解就是其实就是用cglib的原理帮我们new了一个@Mock注解作用类的子类,什么意思呢,往下看首先是Company,此时hh方法返回值是”字符串”,package com.one.util;import lombok.AllArgsConstructor;import lombok.Data;@Data@AllArgsConstructorpublic class...
运算符表达式之添加新符号 最基本的运算符表达式我看这个比较好,可以很简单的就处理了运算符表达式,下面关注的其实就是一点,就是符号栈,就是下面的operatorStack栈,当往operatorStack栈里面添加符号的时候,只要添加的符号的运算等级比operatorStack栈顶的运算符等级低,那么就把operatorStack栈顶的运算符弹出来,进行运算,如果添加的符号的运算等级比operatorStack栈顶的运算符...
ThreadLocal类的作用,原理和应用场景 ThreadLocal类的作用通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改,这就是ThreadLocal类的作用什么意思呢,我们看下面的代码,我们看到结果应该是萧一和萧二和萧三增加之后的年龄应该都是增加2,但是结果呢,萧二是增加了2,然后萧一增加了4,然后萧三增加了6,这就有问题了packag...
idea代码重构 idea重构代码的奇淫技巧不要使用粘贴复制的方法,这一种方法太low,怎么做呢,用代码的重构比如下面的代码,有A,B,User这三个类User类代码 package com.domain; /\*\* \* @Author: wb-mqk568853 \* @Date: 2019/6/17 20:39 \*/ public class User { ...
Ubuntu安装Mysql Ubuntu上面安装mysql首先执行下面的命令 sudo apt-get install mysql-server 然后出现下面的框,然后我们输入root,然后直接点击enter键,这样root用户的密码就设置好了然后执行下面的命令 sudo apt install mysql-client 然后执行下面的命令sudo apt install libmysqlcli...
LockSupport类里面的park()和unpark()多次调用 LockSupport类里面的park()和unpark()多次调用多次调用unpark方法和调用一次unpark方法效果一样,因为在源码里面都是直接将_counter赋值为1,而不是加1。简单说就是:线程A连续调用两次LockSupport.unpark(B)方法唤醒线程B,然后线程B调用两次LockSupport.park()方法, 线程B依旧会被阻塞。因为两次unpark调用效果跟一次调用...
java插入排序 | @Testpublic void hello() {int[] arr = {6, 5, 7, 3};System.out.println(“排序之前:”);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");} // 直接插入排序 insertSort(arr); ...