自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java中使用注解校验参数

一、参数校验的注解Java中参数校验的注解来自三方面,分别是javax.validation:validation-api,对应包javax.validation.constraints org.springframework:spring-context,对应包org.springframework.validation org.hibernate:hibernate-validator,对应包org.hibernate.validator.constraints1.啊validatio

2021-02-09 17:35:23 9178

原创 Java编程中一些奇怪的问题及其解决方案

服务端开发遇到一个奇怪问题,使用swagger和前端进行交互时,发现接口的入参对象,在swagger上变成了另一个对象,两个类中的成员变量使用了@ApiModelProperty修饰。原因是@ApiModel修饰这两个类是,取得名字一样,或者都没有使用@ApiModel注解修饰,默认给它们一样的名字。解决方法:使用@ApiModel修饰这2个类,value设置不同值或不设置,或者只用@ApiModel修饰其中一个类。

2023-02-16 19:15:52 323

原创 Java并发——多线程

创建线程的方法一、继承Thread自定义线程类继承Thread,并重写run方法创建自定义线程类的对象调用对象的start方法二、实现Runnable自定义类实现Runnable接口,并重写run方法创建自定义类对象创建Thread类对象,并传入自定义类对象调用线程类对象的start方法自定义类实现Callable接口,并重写call方法创建实现类对象创建线程池,并传入实现类对象获取执行结果ExecutorService es = Executors.newFixedTh

2021-08-19 08:36:06 183

原创 rocketMQ的消息介绍、发送方式和消费方式

rocketMQ中消息有以下几种普通消息 顺序消息 延时(定时)消息 事务消息一、普通消息普通消息的发送方式有三种同步发送 异步发送 单向发送1.1 同步发送原理:同步发送是指消息发送方发出一条消息后,会在收到服务端同步响应之后才发下一条消息的通讯方式。应用场景:此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。1.2 异步发送原理异步发送是指发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息的通讯方式。发送消息时需要实现异步发送回

2021-08-18 20:21:48 5629

原创 spring事务传播级别

spring有7种事务传播级别(传播行为),分别是public enum Propagation { REQUIRED(0), SUPPORTS(1), MANDATORY(2), REQUIRES_NEW(3), NOT_SUPPORTED(4), NEVER(5), NESTED(6);}下面3篇文章讲解了7种传播级别的含义,并通过代码演示了在外部方法有无事务时,调用不同传播级别修饰的方法,遇到异常时事务的回滚情况。还部分讲述了不同传播

2021-08-14 17:16:13 194

原创 ElasticSearch学习笔记

es vs solrSolr利用zookeeper进行分布式管理,而es自身带有分布式协调管理功能solr支持多个格式的数据,比如json、xml、csv等,而es只支持json格式solr查询快,但是更新索引慢(即插入删除慢),用于电商等查询多的应用;es建索引快,即实时性查询快ELK: ElasticSearch, LogStash, Kibanaes默认端口:9200kibana默认端口:5601核心概念索引(index):相当于关系型数据库中的数据库类型(type):相当于

2021-07-25 20:53:44 131 1

原创 MyBatis基础

事务管理器jdbc:使用jdbc的提交和回滚managed数据源类型pooledunpooledjdnixml配置文件中的元素,必须按照以下顺序书写,否则报错properties先读取properties中的属性,然后读取resource文件中的属性,遇到同名属性,后读取的属性会覆盖前面读取的属性。所以当properties和resource文件中有同名属性时,resource文件中属性起作用。settingstypeAliases使用typeAlias自定义类型的别名

2021-06-26 17:18:56 98

原创 工具篇:mysql(六)——索引

使用explain查看sql的执行计划,包括使用到的索引explain sql的结果包括以下几列,id:select选择标志符,这是select的查询序号。表示sql执行顺序,按照序号从大到小的顺序执行;序号相同时,按照展示顺序从上往下执行。 select_type:表示select查询的类型, (1) SIMPLE(简单SELECT,不使用UNION或子查询等) (2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY) (...

2021-06-25 10:10:16 124

原创 redis——主从复制和哨兵模式

redis集群,配置至少一主二从,或是一主多重。每个server默认是主节点(master/leader),从节点(slave/follower)需要专门配置。数据复制是单向的,只能从主节点复制到从节点。一般每个server,不论机器本身内存多少,redis内存不要超过20G。通过下述命令可以查看主从信息>info replication单机多配置文件模拟集群时,需要修改下述信息端口号(port) pid文件(pidfile) rdb文件名(dbfilename) 日志文件

2021-05-06 23:38:16 102

原创 redis——配置参数、持久化、订阅

redis配置文件中的参数config get requirepass #查看配置文件中的密码属性,默认密码是空,即不需要密码config set requirepass abc123 #设置配置文件中的密码属性,设置为abc123。设置密码后必须先认证才能执行命令,否则任何命令都没有权限auth xxx #输入密码登录config get dir #查看redis的目录save #保存配置文件maxmemory-policy noeviction #内存达到上限后的处理策略,一共有6种1

2021-05-06 11:09:45 158

原创 redis——事务、监视、模版

一、redis事务multi:开启事务exec:提交执行事务discard:取消事务redis的事务不具有原子性,即一个事务中的多个命令,可能部分成功、部分失败。编译异常:命令都不会执行运行异常:正确命令会执行,错误命令不执行二、redis监视redis使用watch key命令监视一个key,实现乐观锁。监视时获取key的版本号,提交事务时,如果发现key的被其他线程修改,那么当前事务执行失败。#A客户端的线程watch key #监视一个keymulti…… #...

2021-04-18 10:42:26 163

原创 redis-特殊数据类型及其命令

redis除了五种基本数据类型,还有三种特殊数据类型,分别是geospatial:存储、查询地理位置信息 hyperloglog bitmaps一、geospatialgeoadd china:city 116 39 beijing 137 32 shanghai #在指定key中添加经度、纬度及其对应的位置,可以同时添加多个geopos china:city beijng #返回指定位置的经纬度geodist china:city beijiing shanghai km #返回两个位

2021-04-11 12:44:57 123

原创 redis——基本数据类型及其命令

一、stringappend key "hello" #追加字符串到key末尾,不存在则相当于setstrlen key #返回key内容的长度incr key #key中数值增1decr key #key中数值减1incrby key 10 #key中数值增加10,相当于设置步长decrby key 5 #key中数值减5,相当于设置步长getrange key 0 3 #返回[0,3]字符串,长度是4getrange key 0 -1 #返回全部,相当于get keyset...

2021-04-04 22:14:34 94

原创 NoSql基础

NoSql是not noly sql的缩写,泛指非关系型数据库。包括四大类,分别是key-value类型的数据库,比如redis、memcache 列数据库,比如hbase 图形数据库,比如neo4j 文档型数据库,比如oss以上

2021-02-21 16:33:31 152

原创 redis基础

redis是remote dictionary server的缩写,是一种key-value类型的NOSql数据库。redis官方数据显示,redis可以实现11万/秒的读取和8万/秒的写入。redis-benchmark:redis自带的性能测试工具。redis默认有16个数据库,序号分别是0-15。默认使用0号数据库。每个数据库中的数据是相互隔离的。select 1: 切换到1号数据库。 dbsize:查看当前数据库中已经存储数据的数量 keys *: 查看当前数据库中所有的key

2021-02-21 16:29:54 102

原创 设计模式

设计模式常见的七大原则单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则(ocp) 迪米特法则 合成复用原则以上

2021-02-13 23:21:46 89

原创 工具篇:mysql(五)——查询中的and和or

在sql查询中and与or混合使用时,or的优先级低于and,即or前面的多个and条件相当于带有括号,or后面的多个and条件也相当于带有括号,or前后的条件是并列关系。如果需要单个条件的或,那么需要使用括号改变优先级。比如对于如下表create table test(id bigint not null auto_increment primary key,name varchar(30) not null default '',gender tinyint not null def

2020-12-26 13:21:18 981

原创 数据结构——红黑树

红黑树是一种含有红黑结点并能自平衡的二叉查找树。具有如下性质每个节点要么是黑色,要么是红色。 根节点是黑色。 每个叶子节点(NIL)是黑色。 每个红色结点的两个子结点一定都是黑色。 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。根据性质5,可以推导出:如果一个结点存在黑子结点,那么该结点肯定有两个子结点。红黑树并不是一个完美平衡二叉查找树,根结点的左子树和右子树可以高度不同,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5

2020-10-07 16:35:44 250 1

原创 Java虚拟机——运行时数据区域

根据《Java虚拟机规范》的规定,Java虚拟机管理的内存区域,包括以下五个运行时数据区域:程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区其中,线程隔离(线程私有)的区域包括程序计数器、Java虚拟机栈和本地方法栈,它们的生命周期与线程相同;线程共享的区域包括Java堆和方法区。程序计数器一块较小的内存区域,可以看作是当前线程执行字节码的行号指示器。如果线程执行Java方法,那么计数器记录正在执行的虚拟机字节码指令的地址;如果执行本地方法,计数器值是空。唯一一个在《J

2020-10-06 12:56:38 126

原创 CPU缓存

缓存又叫高速缓冲存储器,其作用在于缓解主存速度慢、跟不上CPU读写速度要求的矛盾。缓存的实现原理,是把CPU最近最可能用到的少量信息(数据或指令)从主存复制到CACHE中,当CPU下次再用这些信息时,它就不必访问慢速的主存,而直接从快速的CACHE中得到,从而提高了得到这些信息的速度,使CPU有更高的运行效率。缓存的工作原理:是当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存

2020-10-04 22:27:41 265

原创 Java虚拟机——类文件结构

一、Class文件结构Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件中,中间没有任何分隔符。根据《java虚拟机规范》的规定,class文件格式采用一种类似于C语言结构体的伪结构来存储数据。伪结构中只有两种数据类型:无符号数和表。无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1、2、4、8个字节的无符号数。 表由多个无符号数或其他表作为数据项构成的复合数据类型。整个class文件本质上也可以视为一张表。class文件具体内容包含魔数、版

2020-10-04 21:16:36 3025

原创 Java并发——锁优化

自旋锁让请求锁的线程执行忙循环(自旋)而不放弃处理器的执行时间,这项技术就是自旋锁。jdk1.4.2中引入,默认关闭。jdk6中默认开启。自旋次数默认10次,可以使用参数修改。jdk6中引入了自适应自旋,即自选时间不再固定,而是由前一次在同一锁上的自旋时间及锁的拥有者的状态来决定。如果在同一锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行,那么虚拟机认为这次自旋也很可能成功,进而允许自旋等待较长时间,比如100次忙循环。如果对某个锁,自旋很少成功获得锁,那么以后获取这个锁可能直接省略掉...

2020-09-02 23:38:51 200

原创 设计模式——策略模式/工厂模式

策略模式将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现,并使他们可以相互替换,从而导致客户端程序独立于算法的改变。使用组合实现优于继承设计原则找出应用中需要变化的部分,把它们独立出来,不要和那些不变的代码混在一起。 面向接口编程,而非面向实现。 多用组合,少用继承适用场景许多相关的类仅仅是行为上的差异 运行时选择不同的算法变体 通过条件语句在多分支中选择其一a...

2020-08-31 09:35:51 182

原创 工具篇:git merge

git merge合并代码时可以带以下参数--ff: 这是git merge的默认参数。ff即fast-forward的缩写,表示用fast-forward模式。这种方式会把源分支的提交历史合并到当前目标分支,提交历史相当于在当前分支进行的逐个提交。head指向源分支的最后一次提交代码,且不会为这次merge创建新的提交。比如回退代码到head^时,是包含合并代码的提交向前一步,即回退到源分支的倒数第2个提交上。--no-ff:这是合并带注解tag时的默认参数,表示关闭fast-forward模式。

2020-08-19 16:47:59 1213

原创 Java并发——线程安全

一、线程安全的定义如果一个对象可以安全地被多个线程同时使用,那么它就是线程安全的。(这个定义没有可操作性)当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么就称这个对象是线程安全的。——Brian Goetz《Java并发编程实战》二、共享数据线程安全程度分类按照线程安全的”安全程度“由强到弱,可以把Java语言中各种操作共享的数据分为五类不可...

2020-08-18 23:17:40 174

原创 设计模式——代理模式

慕课网,模式的秘密——代理模式,https://www.imooc.com/video/4877代理模式:为其他对象提供一种代理,以控制对这个对象的访问。代理对象起到中介的作用,可以去掉功能或是增加额外服务。几种代理模式远程代理,类似客户端-服务器,为不同地理的对象,提供局域网代表对象。 虚拟代理:根据需要,将资源消耗很大的对象进行延迟,真正需要的时候才创建。 保护代理:控制对一个对象的访问权限。 智能引用代理:提供对目标对象额外的功能。代理的两种实现方式静态代理:代理和被代理对象在

2020-07-26 23:32:09 124

原创 spring学习笔记(六)——AOP part3

慕课网,spring入门,第6章Spring AOP的API介绍NameMatchMethodPointcut接口,比如下图mappedNames属性,会匹配sa开头的方法名BeforeAdvice接口ThrowsAdvice接口afterThrowing方法中,Exception参数是必有的,其他参数可以没有。AfterReturningAdvice接口around advice,MethodInterceptor接口introduction advice,Intro

2020-07-25 12:16:07 154

原创 权限——http鉴权方式

常用的http鉴权方式有以下四种http basic authentication session-cookie 使用token进行签名的鉴权 OAuth(开发授权)一、http basic authentication浏览器把用户名和密码进行base64加密后,放在请求头中,由服务器进行解密和验证。验证通过后发送请求的资源。浏览器的每次请求都会携带加密后的用户名和密码,服务器每次收到请求后都会解密和验证。由于base64加密方式可逆,所以安全性不高。二、session-cookie

2020-07-15 23:46:35 3466

原创 关于数据库缓存的各种问题及其解决方法

在高qps的系统中,为了避免每次请求都查询数据库,给数据库造成很大的压力,一般都会使用缓存来减轻数据库的访问压力。不过缓存的一些问题会导致缓存失去应有的作用,使得请求还是访问了数据库,给数据库造成了很大的压力。这些问题包括缓冲穿透 缓冲击穿 缓冲雪崩 一、缓存穿透缓冲穿透是指请求查询的数据,在数据库中根本不存在,所以缓存中也不会有,这样每次请求都会查询数据库的现象。解决方案有两种,一是缓存空值,二是使用布隆过滤器。1.1 缓存空值发生缓存穿透,是因为缓存中没有存储这些空数据的k.

2020-06-11 15:27:45 1288

原创 工具篇:Java中邮件类MimeMessage说明

MimeMessage类位于javax.mail.internet包下,是用于发送邮件的一个类,其中header变量包含了众多与邮件头信息有关的变量headers头信息 索引序号 变量名 含义 0 Return-Path 1 Received 2 Resent-Date 3 Resent-From 4 Resent-Sender 5 Resent-To 6 Re...

2020-06-04 14:47:52 4116

原创 分布式锁——Redis实现

分布式锁是在分布式场景中,实现共享资源互斥访问的一种方式。Java中synchronized或ReentrantLock只能保证在一个jvm中的最多只有一个线程可以获取资源的锁,但是如果是分布式场景,会有多个jvm中各自的线程都会竞争共享资源。这时synchronized或ReentrantLock就无能为力,就需要使用分布式锁。分布式锁的特点互斥性:同一时间只能有一个线程获取锁 可重入性:一个线程获取锁之后,可以再次获取锁 锁超时:支持锁超时,防止死锁分布式锁的实现方式redis zo

2020-06-03 10:15:34 196

原创 数据库——mvcc

一、基本概念mvcc是multi-version concurrency control(多版本并发控制)的英文缩写,它是应用程序并发读写数据库时,提供高性能的一种并发控制方式,相当于一种数据库乐观锁的实现方式。这里的多版本是指当多个事务对同一数据进行读写时,该数据会存在多条拷贝,即多个版本,而每个事务只能看到其中的某个合理的版本号数据。二、适用范围mvcc适用于数据库两种事务隔离级别,即读已提交和可重复读。另外两种事务隔离界别,读未提交,由于可以读取到其他事务的未提交数据,所以不需要做版...

2020-05-29 19:17:16 406

原创 查看机器cpu数

java中新建线程池时需要设置核心线程数和最大线程数,而设置前需要先了解机器的cpu数,否则不能充分发挥多核cpu的优势。一般情况,逻辑cpu数=物理cpu数乘以每cpu的核数。如果cpu支持超线程技术,逻辑cpu数会大于上述乘积,比如是乘积的2倍。# 物理cpu数cat /proc/cpuinfo | grep "physical id" | sort | uniq|wc -l#...

2019-12-27 17:57:14 289

原创 Java代码笔记——上传excel文件

excel文件自带很多格式,所以处理excel上传的文件,比csv要复杂一些。本文提供了xls和xlsx格式的excel文件上传。数据结果最终存储在List<List<String>>中。import com.google.common.collect.Lists;import com.me.handler.MsgRuntimeException;import o...

2019-12-07 10:56:49 455

原创 工具篇:gatling

gatling:一个开源的性能测试工具,可以用于测试系统负载、高并发等情况。一、安装步骤我的安装版本:jdk1.8,idea community edition,gatling:3.3.1,sbt:1.3.3安装jdk1.8 安装idea idea中安装scala插件(如果下载失败,换个网络或是在低峰时段重试) idea中安装scala sdk 安装gatling和sbt...

2019-11-25 17:46:50 688 1

原创 jvm调优命令

1. jps:查看java进程简单信息2. jmap:查看java进程的jvm信息(1)参数配置和heap的使用情况jmap -heap jvmPid(2)把堆中数据导出到文件。获取文件后可以使用工具查看,比如mat等。jmap -dump:format=b,file=/path/to/java_heap_dump/heap_dump.hprof jvmPid...

2019-11-25 16:57:59 174

原创 工具篇:mysql(四)——sql

一、update当update table时,如果数据来自与其他表的关联,那么使用inner joinupdate tableA a inner join tableB b on a.id=b.aid and b.name = 'tom' set a.date=b.date where a.id = 5;...

2019-11-07 14:48:46 146

原创 工具篇:mysql(三)——修改表结构

一、创建表-- 创建表testcreate table test(id int not null default 0 primary key,name varchar(30) not null default '',age tinyint not null default 0);-- 修改表名rename table test to test1;二、列的修改...

2019-09-25 14:47:51 215

原创 Linux命令片:N

netstat-a:列出所有当前链接-t:只列出tcp协议的链接-u:只列出udp协议的链接-n:禁用域名解析功能,只显示ip、不显示主机名,可以加快查询速度-l:列出正在监听的套接字-p:查看进程信息(mac上的netstat是简化版,不支持该参数。如果需要查看进程信息,需要使用lsof -i:portNumber)...

2019-07-18 19:49:34 597

原创 工具篇:zookeeper

zookeeper入门(zk介绍,并使用本地多个配置文件启动伪集群):https://www.jianshu.com/p/1f4c70d7ef40#启动server(如果配置文件是/path/to/zk/conf/zoo.cfg,那么可以省略该参数)/path/to/zk/bin/zkServer.sh start /path/to/zk/conf/zoo.cfg#查看服务状态/pa...

2019-07-18 14:21:05 142

空空如也

空空如也

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

TA关注的人

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