- 博客(42)
- 收藏
- 关注
转载 Spring自定义注解
1. 准备工作首先这里创建了一个简单的SpringBoot项目:各个类的内容如下所示:@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private Integer id; private String name;}@Componentpublic class UserDao { public User findUserById(Integer id) { if(id >
2021-01-21 14:33:19
283
转载 Java集合框架
一、集合框架图对于以上的框架图有如下几点说明:(1)所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。(2)集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。(3)抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。(4)实现类:8个实现类(实线表示),对接口的具体实现。(5)C
2021-01-08 14:46:05
305
1
转载 Stream的实现原理
一、Stream API我们已经学会如何使用Stream API,用起来真的很爽,但简洁的方法下面似乎隐藏着无尽的秘密,如此强大的API是如何实现的呢?比如Pipeline是怎么执行的,每次方法调用都会导致一次迭代吗?自动并行又是怎么做到的,线程个数是多少?本节我们学习Stream流水线的原理,这是Stream实现的关键所在。首先回顾一下容器执行Lambda表达式的方式,以ArrayList.forEach()方法为例,具体代码如下://ArrayList.forEach()publi.
2021-01-06 16:05:37
965
转载 SpringBoot知识清单
一、前言在过去两三年的Spring生态圈,最让人兴奋的莫过于SpringBoot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而SpringBoot应用本质上就是一个基于Spring框架的应用,它是Spring对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于Spring生态圈的应用。二、抛砖引玉:探索Spring IOC容器如果有看过SpringApplication.run()方法的源码,SpringBoot冗长无比的启动流程一定会让你
2021-01-05 20:42:51
161
转载 ShardingSphere分库分表
一、前言由于关系型数据库大多采用B+树类型的索引,在数据量超过阈值的情况下,索引深度的增加也将使得磁盘访问的IO次数增加,进而导致查询性能的下降;同时,高并发访问请求也使得集中式数据库成为系统的最大瓶颈。二、项目介绍Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由JDBC、Proxy和Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言
2020-11-09 00:00:21
859
转载 Apache BeanUtils和Spring BeanUtils
一、对象拷贝在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。在具体介绍两种BeanUtils之前,先来补充一些基础知识。它们两种工具本质上就是对象拷贝工具,而对象拷贝又分为深拷贝和浅拷贝,下面进行详细解释。1. 什么是浅拷贝和深拷贝在Jav
2020-11-08 22:41:56
524
转载 MyBatis实现动态SQL
一、前言MyBatis令人喜欢的一大特性就是动态SQL。在使用JDBC的过程中,根据条件进行SQL的拼接是很麻烦且很容易出错的,MyBatis动态SQL的出现,解决了这个麻烦。MyBatis通过OGNL来进行动态SQL的使用的,目前,动态SQL支持以下几种标签:元素 作用 备注 if 判断语句 单条件分支 choose(when、otherwise) 相当于Java中的if else 多条件分支 trim(where、set) 辅助元素
2020-11-08 21:39:23
219
转载 Java中的锁的解释
1. 公平锁/非公平锁(1)公平锁是指多个线程按照申请锁的顺序来获取锁。(2)非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。对于Synchronized而言,也是一种非公平锁。由于其并不像ReentrantLock是通过AQS(AbstractQueuedSynchronizer)来实现线程调度的,所以并没
2020-11-01 23:04:07
81
转载 Redis
一、Redis你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。说起我的诞生,跟关系数据库MySQL还挺有渊源的。在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展得越来越快,它容纳的数据也越来越多,用户请求也随之暴涨,而每一个用户请求都变成了对它的一个又一个读写操作,MySQL是苦不堪言。尤其是到“双11”、“618“这种全民购物狂欢的日子,都是MySQL受苦受难的日子。据后来MySQL告诉我说,其实有一大半的用户请求都是读操作,而且经常都是重复查询一个东西
2020-11-01 22:17:51
93
转载 Redis设置了过期时间key的注意事项和过期策略
一、在为key设置过期时间需要注意的事项1. DEL/SET/GETSET等命令会清除过期时间在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。//设置mykey的过期时间为300s127.0.0.1:6379>setmykeyhelloex300OK//查看过期时间127.0.0.1:6379>ttlmykey(integer)294//使用set命令覆盖myk...
2020-11-01 21:50:38
948
转载 RabbitMQ和Kafka对比
一、异步消息模式异步消息可以作为解耦消息的生产和处理的一种解决方案。提到消息系统,我们通常会想到两种主要的消息模式——消息队列和发布/订阅模式。1. 消息队列利用消息队列可以解耦生产者和消费者。多个生产者可以向同一个消息队列发送消息,但是,一个消息在被一个消息者处理的时候,这个消息在队列上会被锁住或者被移除并且其他消费者无法处理该消息,也就是说一个具体的消息只能由一个消费者消费。需要额外注意的是,如果消费者处理一个消息失败了,消息系统一般会把这个消息放回队列,这样其他消费者可以继续处理。
2020-11-01 21:08:01
949
1
转载 提升系统性能的10个建议
1. 使用反向代理服务器让应用更快更安全如果你的Web应用只跑在一台机器上,那要提升其性能非常简单:换一台更快的,多配几个处理器,多加几条内存,磁盘阵列也要高速的。换了以后,这台机器上跑的WordPress服务器、Node.js或Java应用速度都会加快。(要是应用还会访问另一台数据库服务器,那也简单:找两台更快的机器,用更快的网络连起来就行了。)麻烦在于,机器速度并不是问题。很多时候Web应用慢,是因为要在各种任务之间切换,一会儿要处理数千个连接上的用户请求,一会儿要向磁盘读写文件,一会儿又要运行
2020-10-25 22:45:45
5999
1
转载 数据库数据量很大,分页查询很慢,有什么优化方案
1. 准备工作为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。表名:order_history描述:某个业务的订单历史表主要字段:unsigned int id,tinyint(4) int type字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增数据量:5709294MySQL版本:5.7.16selectcount(*)fromorders_history;返回结果:57092...
2020-10-25 21:44:15
1080
转载 一致性Hash算法
1. 一致性Hash算法一致性Hash算法是1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:(1)平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利
2020-10-25 20:29:53
1287
1
转载 HTTP状态码详解
1. 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。(1)100(继续):请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。(2)101(切换协议):请求者已要求服务器切换协议,服务器已确认并准备切换。2. 2xx(成功)表示成功处理了请求的状态代码。(1)200(成功):服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。(2)201(已创建):请求成功并且服务器创建了新的资源。(3)202(已接受): 服务器.
2020-10-19 00:45:41
231
转载 SQL语法速成手册
一、基本概念1. 数据库术语(1)数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。(2)数据表(table):某种特定类型数据的结构化清单。(3)模式(schema):关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。(4)列(column):表中的一个字段。所有表都是由一个或多个列组成的。(5)行(row):表中的一个记录。(6)主键(primary
2020-10-18 21:41:55
143
转载 Spring事务传播属性
一、传播属性传播属性定义的是当一个事务方法碰到另一个事务方法时的处理行为,一共有七种行为,定义如下:传播性 值 描述 PROPAGATION_REQUIRED 0 支持当前事务,如果没有就新建事务 PROPAGATION_SUPPORTS 1 支持当前事务,如果没有就不以事务的方式运行 PROPAGATION_MANDATORY 2 支持当前事务,如果当前没事务就抛异常 PROPAGATION_REQUIRES_NEW 3
2020-10-13 16:37:01
480
原创 IDEA使用MyBatis Generator
1. 添加插件依赖pom.xml<!-- mybatis逆向生成插件 --><build> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</versio...
2020-09-26 22:21:41
274
转载 MySQL锁
一、对MySQL的锁的了解当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。二、隔离级别与锁的关系(1)在读未提交(Read Uncommitted)级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突。(2)在读已提交(Read Committ
2020-09-26 20:46:41
212
转载 数据库的事务隔离级别总结
一、事务及其四大特性事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit),它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。举个例子来说,张三给李四转了1000元钱,那么在数据库操作时,就要先把张三的账户减去1000元,再把李四的账户加上1000元,两部分操作放在一起,才是一个完整的转账过程,也可称之为事务。1
2020-09-26 18:55:55
250
转载 数据库分库分表思路
一、数据切分关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作
2020-09-13 21:07:39
572
转载 Git rebase用法小结
1. 前言rebase在git中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。它的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!(特别适用于gerrit钩子丢失导致push失败的合并提交)前提:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)2. 合并多个commit为一个完整commit当我们在本地仓库中提
2020-09-13 21:05:27
5599
1
转载 API接口应该如何设计?如何保证安全?如何签名?如何防重?
一、说明在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢?下面我们就来讨论下常用的一些API设计的安全方法,可能不一定是最好的,有更牛逼的实现方式,但是这篇是我自己的经验分享。二、token简介Token:访问令牌access token,用于接口中,用于标识接口调用者的身份、凭证,减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请
2020-09-07 00:04:09
471
转载 Lombok简介、使用、工作原理、优缺点
一、Lombok简介官方介绍Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your
2020-09-07 00:03:51
1484
转载 ES如何做到亿级数据查询毫秒级返回
一、面试题ES在数据量很大的情况下(数十亿级别)如何提高查询效率?二、面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过ES,因为啥?其实ES性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下5~10s,坑爹了。第一次搜索的时候,是5~10s,后面反而就快了,可能就几百毫秒。你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过ES,或者就是自己玩玩demo,被问到这个问题容易懵逼,显示出你对ES确实玩
2020-09-06 18:22:23
1382
转载 SpringCloud微服务架构学习笔记与示例
一、分布式服务框架的发展1.1 第一代服务框架 代表:Dubbo(Java)、Orleans(.Net)等 特点:和语言绑定紧密1.2 第二代服务框架 代表:Spring Cloud等 现状:适合混合式开发(例如借助Steeltoe OSS可以让ASP.Net Core与Spring Cloud集成),正值当年1.3 第三代服务框架 代表:Service Mesh(服务网格) => 例如Service Fabric、lstio、Linkerd、Conduit等
2020-09-06 18:22:12
259
1
转载 为什么HashMap的加载因子是0.75
1. 为什么HashMap需要加载因子?HashMap的底层是哈希表,是存储键值对的结构类型,它需要通过一定的计算才可以确定数据在哈希表中的存储位置:staticfinalinthash(Objectkey){inth;return(key==null)?0:(h=key.hashCode())^(h>>>16);}//AbstractMappublicinthashCode(){inth=...
2020-08-26 19:22:00
407
转载 Java设计模式详解
一、设计模式原则很多优秀的文章和书籍都讲的很明白了,我说下自己的体会。 1.单一职责原则,就是一个类只负责做一件事情。这样就可以做到解耦合的效果,让代码看起来比较清爽,也体现了java的封装性。还有个原则叫迪米特法则,就是一个对象对另一个对象有尽量少的了解,说的也是解耦合的事情。 2.里氏替换原则和依赖导致原则,说的是继承的事情。父类可以做的事情,子类都可以去做,子类可以尽量去依赖父类去做事情;但是反过来,父类不能依赖子类去做一些事情。体现了java的继承特性。 3.接口隔离原则,接口也应该尽可能的隔离
2020-08-26 19:21:41
237
1
转载 HashMap夺命二十一问
1. HashMap的数据结构?哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过8时,链表转换为红黑树。transient Node<K,V>\[\] table;2. HashMap的工作原理?HashMap底层是hash数组和单向链表实现,数组中的每个元素都是链表,由Node内部类(实现Map.Entry接口)实现,HashMap通过put&get方法存储和获取。存储对象时,将K/V键值传给put()方法:(1)调用hash(K)
2020-08-16 22:12:50
152
转载 深入理解Java的三种工厂模式
一、简单工厂模式简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。(1)实现汽车接口public interface Car { String getName();}(2)奔驰类public class Benz implements Car { @Override public String getName() { return "Benz"; }}(3)宝马类.
2020-08-16 22:12:38
99
转载 Java应用线上问题排查思路
一、前言本文总结了一些Java应用线上常见问题的定位步骤,分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。只不过这里先提示一下。在线上应急过程中要记住,只有一个总体目标:【尽快恢复服务,消除影响】。不管处于应急的哪个阶段,我们首先必须想到的是恢复问题,恢复问题不一定能够定位问题,也不一定有完美的解决方案,也许是通过经验判断,也许是预设开关等,但都可能让我们达到快速恢复的目的,然后保留部分现场,再去定位问题、解决问题和复盘。
2020-08-09 22:16:21
2284
转载 设计模式——单例模式(七种实现方法)
1. 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式结构图:单例模式有多种写法各有利弊,现在我们来看看各种模式写法。2. 饿汉模式public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return insta
2020-08-09 22:16:01
340
转载 使用Spring MVC搭建第一个项目
一、概述1. 什么是Spring MVC?Spring MVC属于Spring Frame Work的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。2. 环境配置Eclipse:Mars Release (4.5.0)Apache-
2020-08-03 08:31:53
244
转载 算法复杂度速查表
一、前言复杂度通常会使用大-O记号来表示,比如快速排序的平均时间复杂度是O(nlog(n))。虽然我是【理解派】,但是虽然每个算法/数据结构都理解了,不时仍有可能忘记具体某个算法/数据结构的复杂度(特别是在最好、最坏和平均情形下的复杂度)。因此制作一个速查表是蛮有必要的。二、图例最佳 好 一般 不好 糟糕 三、抽象数据结构的操作复杂度数据结构 时间复杂度 空间复杂度 平均 最差 最差 访问 搜索 .
2020-08-03 08:31:35
123
转载 TCP的三次握手与四次挥手理解
1. TCP报文(1)序列号seq占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生。给字节编上序号后,就给每一个报文段指派一个序号。序列号seq就是这个报文段中的第一个字节的数据编号。(2)确认号ack占4个字节,期待收到对方下一个报文段的第一个数据字节的序号。序列号表示报文段携带数据的第一个字节的编号。而确认号指的是期望接收到下一个字节的编号。因此当前报文段最后一个字节的编号+1即为确认号。(3)确认ACK占1位,
2020-07-28 17:55:13
306
转载 深入理解Spring MVC思想
一、前言为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平。你的一个决定会影响团队未来的几年。要考虑方面太多:(1)简单易用,以提高开发效率。使小部分的精力在框架上,大部分的精力放在业务上。(2)性能优秀,这是一个最能吸引眼球的话题。(3)尽量使用大众的框架(避免使用小众的、私有的框架),新招聘来的开发人员有一些这方面技术积累,减低人员流动再适应的影响。如果你还在为这件事件发愁,本文最适合你了。选择Spring MVC吧。Spring MVC是当
2020-07-28 17:54:58
256
转载 用好Git和SVN,轻松驾驭版本管理
一、Git vs SVN1. Git是分布式的,SVN是集中式的这是Git和SVN最大的区别。若能掌握这个概念,两者区别基本搞懂大半。因为Git是分布式的,所以Git支持离线工作,在本地可以进行很多操作,包括接下来将要重磅推出的分支功能。而SVN必须联网才能正常工作。2. Git复杂概念多,SVN简单易上手所有同时掌握Git和SVN的开发者都必须承认,Git的命令实在太多了,日常工作需要掌握add、commit、status、fetch、push、rebase等,若要熟练掌握,还必须掌握re
2020-07-19 13:09:52
165
转载 Linux下C/C++ TCP/IP编程
一、客户端和服务端操作流程1. 服务器端:socket() --> bind() --> listen() --> accept() --> recv() --> close()创建socket --> 绑定socket和端口号 --> 监听端口号 --> 接收来自客户端的连接请求 --> 从socket中读取字符 --> 关闭socket2. 客户端:socket() --> connect() --> send()
2020-07-19 13:09:40
1150
1
转载 SpringBoot注解大全
一、注解(annotations)列表1. @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让springBoot扫描到Configuration类并把它加入到程序上下文。2. @Configuration:等同于spring的XML配置文件。使用Java代码可以检查类型安全。3. @EnableAutoConfiguration:自动配置
2020-07-13 18:05:25
91
转载 SpringBoot Json数据交互
一、Json报文SpringBoot默认会使用Json作为响应报文格式。首先,我们创建一个UserController用于处理前端的Web请求。定义一个简单的控制器,与通常返回URL的Controller不一样的是,login()使用了@ResponseBody注解,它表示此接口响应为纯数据,不带任何界面展示,可以获得标准Json。// 等同于SpringMVC @Controller 可以返回字符串跳转至jsp等页面@Controller@RequestMapping("/user")
2020-07-13 18:05:13
604
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人