自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL中的四种事务隔离级别

对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致性的问题。SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致情况:隔离级别脏读不可重复读幻读read uncommitted(读未提交)yesyesyesread committed(读提交)-yesyesrepeatable read(可

2021-06-12 13:43:26 520 1

原创 spring-data-redis实现向redis发布阅订的功能

redis的发布/阅订模式不了解的小伙伴可以看我的另一篇博客:redis发布/订阅模式这里就直接开始说明Java代码如何实现redis发布阅订的功能啦引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>阅

2021-06-03 08:21:31 549 1

原创 redis发布/订阅模式

大家都知道Redis中的list结构可以作为队列来满足一些生产消费的业务场景。实际上Redis还提供了发布/订阅(publish/subscribe)模式来实现类似的生产消费的功能。list与发布/订阅的不同list中的任务或消息无法被重复消费,消息被一个消费者pop 掉以后,其他消费者就获取不到了这个消息了。而发布/订阅模式中可以有多个订阅者消费同一个消息。list可以保存任务或消息,直到客户端连接之后才消费掉。但发布/订阅模式中订阅者无法获取到订阅之前的历史消息,由于这个缺陷,在一些严格的生产消

2021-05-29 00:54:14 5532 3

原创 Integer中为什么-128~127之间的值可以直接==

在判断两个Integer是否相等的时候我们一般都是使用equals来比较是否相等,很多网上的博客也有提到过两个Integer的值在[-128, 127] 之间的时候,可以直接通过==来比较是否相等。那么为什么[-128, 127] 之间的Integer可以直接用==呢?从自动装箱说起public class Demo { public static void main(String[] args) { Integer i1 = 100; Integer i2 =

2021-04-22 16:42:03 1087

原创 MapStruct优雅的转换bean对象

日常开发中,我们常常需要将业务相关的各种PO,VO,DTO对象互相转换,比较常用的工具类就是 BeanUtil ,但是BeanUtil有两个问题:底层使用了反射,效率不高无法自定义转换规则,例如其中一个bean中的datetime是Date类型,而另一个bean中的datetime是String类型,这就无法转换过去了这里我要推荐一个比较好用的bean转换工具:MapStructMapStruct用法准备工作创建maven项目,引入以下依赖<dependency> &l

2021-03-12 15:53:23 703

原创 java中Socket设置超时时间的两种方法

方法1:调用Socket的connct 方法打开连接,并设置连接超时时间Socket socket = new Socket()socket.connect(new InetSocketAddress(ip, port), 3000); //设置超时3000毫秒以上代码是设置Socket的连接超时时间,当连接超时时,会抛出如下异常:在不设置连接超时时间的情况下,socket默认的超时时间应该是20毫秒左右(我试了5次大概都是20毫秒就会抛出异常)方法2:调用Socket的setSoTime

2021-02-21 16:57:13 13585 1

原创 js实现二分查找算法

binarySearchIndex(array, target) { let high = array.length - 1 let low = 0 while (low <= high) { let mid = (high + low) >>> 1 let midVal = array[mid] console.log('当前mid', mid) if (midVal == target) { ..

2021-02-07 16:54:54 125

原创 quartz整合springboot将定时任务持久化

持久化配置在springboot项目中引入quartz依赖之后,默认是将任务和触发器保存在内存中,如果希望将任务和触发器保存在数据库中,只需在 application.yml 添加以下配置:spring: quartz: job-store-type: jdbc jdbc: initialize-schema: always #每次启动程序都会将旧的quartz表删除,重新创建,所以我们在第一次启动程序之后,要将这个属性改为"never"另外,你的springbo

2020-12-30 14:14:29 469

原创 spring监听redis的key失效事件

有时候我们在项目中会需要监听redis的key失效事件,springboot-boot-starter-data-redis 这个包为我们提供了监听redis的key失效的功能。/** * Redis 的 Key 失效监听器 */public class RedisJobEventMessageListener extends KeyExpirationEventMessageListener { public RedisJobEventMessageListener(RedisMessa

2020-12-11 11:37:28 537

原创 long类型的id属性传到前端会精度丢失的解决方案

记录一个前段时间使用雪花算法时候遇到的坑。场景大概是这样的:我有一个设备信息实体类,设备id是 long 类型,映射到数据库中是一个设备表,主键id是 bigint 类型。id的生成策略是使用雪花算法。使用postman调用接口,获取到的JSON是正常的{ "id": 1297873308628307970, ... //其他属性省略}但是到了前端那边id的值却变成了1297873308628300000仔细一比较发现这两个数值还挺像的,只有后4位不一样,当时立马想到了是不是精度

2020-10-12 11:29:39 3662

原创 阻塞队列LinkedBlockingQueue源码学习

前上一篇博客学习了ArrayBlockingQueue,今天学习LinkedBlockingQueue源码并与之对比。LinkedBlockingQueue总结同样先直接总结LinkedBlockingQueue相关的特性,再根据源码来进行说明,它的主要特性如下:底层用链表实现数据存储;是一个FIFO无界阻塞队列。队列的最大容量默认是Intenger的最大值Integer.MAX_VALUE,也可以设置自定义容量;重要属性介绍LinkedBlockingQueue有一个内部类 Node ,

2020-10-08 16:35:35 290

原创 阻塞队列ArrayBlockingQueue源码学习

ArrayBlockingQueue总结先直接总结ArrayBlockingQueue相关的特性再根据源码来进行说明,它的主要特性如下:他是一个由数组实现的FIFO有界阻塞队列,数组由final修饰;ArrayBlockingQueue有界且固定,在构造函数时必须指定大小,确认后不支持改变(确定数组长度且不可变);默认在多线程环境下不保证"公平性";通过 ReentrantLock 与 Condition 实现线程安全;重要属性介绍ArrayBlockingQueue的属性还是比较简单,

2020-10-08 13:47:19 134

原创 Java中异常为什么性能差

Throwable源码首先给大家看一段JDK的Throwable源码上面这段JDK的源码就是抛出异常时会调用的方法,更准确的说是Throwable 的所有构造方法中都会调用fillInStackTrace ,由于所有的异常都直接或间接的继承了Throwable ,所以当我们所以当我们new一个异常的时候,一定会执行fillInStackTrace (创建子类的时候会先执行父类的构造方法)这个方法暴露出两个问题使用了synchronized修饰了整个异常方法需要追踪线程运行堆栈信息异常种类

2020-09-09 08:48:24 585 4

原创 MySQL中Limit性能优化的方案

在MySQL中Limit有两种语法:limit offset, rowslimit rows其中offset表示偏移量,rows表示要返回的记录条数。比如我们要查出第1000到第1010行的记录,就会写成 limit 999, 10 。一般我们在实际开发中做分页查询的时候,rows不会太大,因为rows表示每页要显示的数量(你总不可能每页要显示个几万条吧)。而随着页数的加深,offset就会变大,查询效率随之就变慢了。为什么当offset很大时,查询效率会变慢呢?比如当我们用 limit 10

2020-08-10 14:31:20 7554 7

原创 nginx代理tcp协议

nginx1.9以后新增了对tcp协议的支持,我们只需做一点简单的配置,就可以转发tcp协议请求了。nginx使用了一个新的模块stream 来支持tcp协议,这个模块与 http 模块比较类似。下面我以MySQL来做测试,使用nginx来配置一个MySQL的代理。修改nginx.conf文件,添加一个 stream 模块,该模块与 http 模块是同一层级。重启nginx,然后用工具测试一下连接。连接成功。over。...

2020-07-20 10:46:20 3183

原创 TreeMap是如何实现去重和排序的

TreeMap实现了SortedMap接口,它是一个key有序的Map类。TreeMap的默认排序规则TreeMap并不是根据插入的顺序来排序,而是根据key元素的 compareTo 方法来排序。测试代码:Map<Integer, Object> map = new TreeMap<>();map.put(5, new Object());map.put(10, new Object());map.put(8, new Object());map.put(12, n

2020-07-18 14:38:33 5980 1

原创 MySQL5.7和8.0中in和exists关键字

之前看了网上很多关于in和exists性能相关的博客,但总感觉自己测试的结果和他们说的不太一样,所以写下这篇博客,记录下自己测试后得出的总结。特别强调,MySQL5.7和8.0中对这两个关键字有不同的优化,所以我要分开两个版本来讨论。数据准备我准备了一张tb_class表和一张tb_stu表注:600个班级,12万个学生。tb_stu是大表,tb_class是小表。为了避免索引优化带来的影响,所以我两张表的id都没有设置主键和索引。MySQL5.7测试测试查询效率我们首先测试一下当外层表时小

2020-07-11 18:03:42 1553 1

原创 nginx配置websocket

nginx如何支持websocketWebSocket 和HTTP虽然是不同协议,但是两者“握手”方式兼容。通过HTTP升级机制,使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。如下图所示因为WebSocket协议是一个hop-by-hop协议(此类头部字段只对单次转发有效。会因为转发给缓存/代理服务器而失效),为了让Nginx代理服务器可以将来自客户端的Upgrade请求发送到后端服务器,要求Upgrade和Connection的头信息必须

2020-06-29 15:33:37 2892

原创 MySQL的存储过程中使用游标来接收查询结果集

我们如果要在MySQL的存储过程中遍历一个查询语句的结果集,需要使用到游标cursor(SQL server中可以定义表类型的变量Table,但MySQL中不行,只能用游标)。假设我需要从 tb_stu 这张表中查询出所有记录插入到tb_stu_copy1中,等价于insert into tb_stu_copy1 select * from tb_stu;以下是存储过程的具体sqlCREATE PROCEDURE curdemo () BEGIN DECLARE stop_flag INT DE

2020-06-18 09:59:38 2455

原创 浮点数在计算机内存中的存储方式

以前刚开始学习的时候有听老师说过两个浮点数相加会出现精度丢失的现象,那时候不理解原因,只是作为一个知识记下来,最近在工作中也遇到了同样的问题,于是想研究下底层的原因。十进制小数如何转为二进制我们知道在计算机中,所有数据都是以二进制0和1来存储的,那么我们十进制的小数是如何用二进制形式表示的呢?答案是采用"乘2取整,顺序排列"法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分全部为零结束(有可能遇到乘不尽而不停循环的情况出现)。.

2020-06-01 10:59:43 2509 2

原创 Zuul网关导致请求头信息丢失的解决办法

在使用zuul网关的时候遇到了一个问题,我的请求头中的Authorization信息经过zuul之后就被丢失了。按照网上找来的解决办法,我给网关服务加了一个过滤器:@Componentpublic class WebFilter extends ZuulFilter { @Override public String filterType() { return ...

2020-04-19 17:12:50 6385 1

原创 记一次docker更换阿里云镜像源遇到的坑

今天第一次给我的CentOS7安装了docker,安装完成后想拉取一个mysql的镜像。结果用docker search mysql的时候提示我:Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: net/http: TLS handshake timeout看到这个错误信息,最...

2020-03-15 13:57:22 3951

原创 乐观锁的思想和其在Java中的实现

首先我们要明白,所谓的乐观锁和悲观锁其实都是一种思想,基于思想,可以做出很多种实现。乐观锁与悲观锁的概念非常好理解。悲观锁当一个公共变量(比如一个有状态的单例对象)被多个线程访问的时候,我们假设每个线程都会去修改这个公共变量,于是我们要让访问这个公共变量的线程上锁,这样其他线程要想访问这个变量就会阻塞等待锁的释放。这个就是悲观锁的思想。在关系型数据库中就用到了很多这种锁机制,比如行锁,表锁等...

2020-02-14 21:07:54 1151

原创 在idea上远程调试java项目

要debug远程服务器上的项目其实很简单,就两个步骤:在启动服务端项目的时候同时也开启debug端口在idea项目中配置远程调试相关的配置,并用debug模式启动按照以上思路,我们进行详细的操作说明首先我们准备一个测试项目,将其打包放到服务器上,这里我新建了一个springboot项目并打成jar包放在我的服务器上。按照普通的启动方式,我们会用java -jar spring_le...

2020-01-23 17:19:15 693

原创 Linux定期备份数据的实现

Linux上定期备份还是很简单的,主要思路就是先编写一个备份数据的sh脚本,然后用crontab去定期执行这个脚本。按照以上思路我们开始实际操作1.我们找到我们要备份的目录,记住它的路径,比如我这里选择的是我电脑上的/opt/o2o/images/目录,这个目录用于保存我的网站里面所用到的图片2.创建一个用于保存备份数据的文件夹,这里我选择在/root/下面创建文件夹3.创建一个备份数...

2020-01-16 21:13:58 819

原创 配置tomcat成为文件服务器

我们在开发网站的时候时常会遇到前端需要获取一些图片或者其他文件资源,比如前端发来一个请求http://localhost:8080/upload/WechatIMG14.jpeg,我们后端就会把WechatIMG14.jpeg图片返回给前端页面上。就像下面这样这种功能我们当然也可以通过自己写Java代码来实现,但是既然tomcat已经为我们提供了现成的解决方案,我们何必不用它呢。配置的方法...

2020-01-01 23:18:22 2517

原创 SQL server中将传入的字符串按照特定的分隔符拆分转为一列

效果如下:下面贴上存储过程的代码,大家可以自行复制过去创建存储过程CREATE Function [dbo].[GetTableFromText](@ParaContext varchar(max),@splitChar char) returns @ReturnTable table(ResultColumn varchar(200))asBegin Declare @startI...

2019-12-29 10:45:49 683

原创 Mysql配置主从同步并在Java代码中实现自动读写分离

配置Mysql主从同步为了配置Mysql的主从同步,首先需要两个安装了Mysql的主机。我自己有两台阿里云的Linux服务器,IP分别为:118.xx.xx.211106.xx.xx.56(为了保护的我服务器免受攻击,所以不方便公开IP的全部地址。没有阿里云服务器的小伙伴也可以在电脑上开两个虚拟机并安装好Mysql,效果也是一样的)我们以118.xx.xx.211的服务器为Mysql...

2019-12-09 17:24:47 1654 1

原创 RedisTemplate使用scan代替keys方法

我们知道Redis是单线程的,keys命令会使线程阻塞,并且keys是以遍历的方式实现的,时间复杂度是 O(n),Redis库中的key越多,查找时阻塞的时间越长,如果这时候有大量的业务请求送达Redis,有可能导致Redis崩溃,所以线上环境都要禁用keys命令的。而scan命令是通过增量迭代的方式实现的,每次执行都只返回一个下标位置和少量key,我们通过多次调用scan [下标位置]命令,...

2019-12-05 16:48:07 5570 3

原创 url中的特殊字符+ % # & = ? /无法被后端解析解解决方法

项目中有一个接口是用GET方法接收参数的,测试的时候发现当URL的参数中出现 + 号的时候,传到后端 + 号全都变成了空格了。然后从网上找到了原因:URL参数中是不能出现+ % # & = ? /等特殊字符的,因为这些字符在URL中有默认的含义,比如&在URL中表示参数间的分隔符,如果不将&转义而直接放在GET请求的参数里,后端的Tomcat就会以这个&为分隔符将...

2019-11-30 12:49:04 6185

原创 关于sql中子查询not in 后面不能为null的理解

平时在sql查询中都要注意not in后面的条件中不能有null,如果有null就没有返回结果了,而in后面有null依然可以有返回结果。说下我的理解:in后面的子句可以理解为or拼接比如select * from t_student where height in(175, 177, null)后面的height in (175, 177, null)可以理解为height =175...

2019-11-14 09:31:47 612 1

原创 Spring Cloud学习笔记2 构建高可用的Eureka Server集群

在上一篇博客中我们介绍了搭建Spring Cloud注册与消费模块。但是在实际项目中,可能有较多的微服务实例,如果只搭建单台Eureka Server,这时候Eureka Server 就会承担非常高的负载压力,我们知道微服务实例是通过注册中心来查询其他实例的,所以这个单台的Eureka Server的服务器如果出现意外宕机,那么整个微服务系统将无法正常工作。这篇博客将介绍用一台电脑模拟搭建Eu...

2019-11-12 10:23:16 170

原创 Spring Cloud学习笔记1 服务注册与发现组件Eureka

1.简介我们知道微服务系统由很多个服务单元组成,比如一个电商系统平台,可能会把账户业务,会员业务,商品业务,订单业务等业务模块拆解出来作为单独的微服务单元,这些微服务之间互相依赖,且数量越多,管理维护的难度就越大,所以一套微服务系统需要服务注册中心来统一管理微服务单元。在SpringCloud中,可选择Consul、Zookeeper、和Eureka作为服务注册和发现的组件,其中Eureka是...

2019-11-09 09:14:00 166

原创 nginx对同一个IP进行限流

todo

2019-10-21 18:49:23 1534

原创 代码安全之使用不可变对象

我们先来看一个例子:public static void main(String[] args) { try { Date d1 = str2date("2019-10-20 09:10:00"); Date d2 = str2date("2019-10-20 09:12:00"); Date d3 = st...

2019-10-21 10:00:52 109

原创 nginx配置防盗链

现在流行前后端分离开发的情况下,一般我们都会将静态资源放在nginx的html目录下。这种情况下,我们就无法通过Java代码写拦截器来防盗链了。所以这里我们来说明一下如何使用nginx来配置防盗链。1.我们先修改本地hosts文件,将 www.czx.com 映射到 127.0.0.1。2.在html文件夹下放一张图片,图片名就叫123.jpg然后修改nginx的html文件夹下的ind...

2019-10-20 22:59:54 1419

原创 使用nginx搭建负载均衡

文章目录负载均衡的简单理解nginx的负载均衡策略nginx的负载均衡配置负载均衡的简单理解在我们平时做开发测试的时候都是将请求直接发送给tomcat,这个阶段由于访问量小单台服务器完全没有压力。但是在我们线上环境的时候,访问流量远远大于我们开发测试环境,单台服务器不足以承受过大的流量压力,因此需要多台服务器来进行性能的水平扩展以及避免单点故障。这时候就出现一个问题,如何将这些访问流量分发给各...

2019-10-19 08:43:10 480

原创 使用iText动态生成pdf,并用pdf.js在线预览

Java有很多生成pdf的工具库,常用的有Apache PdfBox,iText,POI。我的项目里用的是iText。下面说下详细步骤:后台引入依赖: <!--pdf生成类库--> <dependency> <groupId>com.itextpdf</groupId> <...

2019-10-16 16:13:10 2319

原创 设计模式之代理模式

我们知道一些微商都喜欢招一些下级代理来帮他们卖货。一般下级代理都不囤货,收到订单就通知上级去发货。那么我们就以这个为业务场景来编写一段代码。假设微商们有都有一个方法叫sell(售货),这个方法接收两个参数分别是consignee(收货人),goodsName(商品名)/** * 一个定义微商共有行为的接口 */public interface WechatSalemen { /*...

2019-10-10 22:28:48 123 1

原创 redis集群配置主从同步和哨兵机制

主从同步概念redis的主从同步是指集群中多个redis之间的数据同步。一般有两种模式:一主多从和级联模式。一主多从是指集群中有一台主redis服务器(master)和多台从redis服务器(replica)。级联模式是指某些redis服务器既是从redis,同时其本身又是一些redis服务器的主redis。用图片表示的话就像下图一样。...

2019-09-18 20:30:29 1596

空空如也

空空如也

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

TA关注的人

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