- 博客(108)
- 收藏
- 关注
原创 MySQL中having和where的区别及应用详解
WHERE子句用于在执行查询之前筛选行,而HAVING子句用于在执行聚合查询后筛选结果集。WHERE出现在FROM子句之后,GROUP BY子句之前;而HAVING出现在GROUP BY子句之后、ORDER BY子句之前。WHERE可以使用比较操作符和逻辑操作符来指定过滤条件,而HAVING不仅可以使用比较操作符和逻辑操作符,还可以使用聚合函数。
2024-03-06 14:07:29
1587
原创 springboot自定义拦截器
与过滤器的区别,过滤器实现的是 javax.servlet.Filter接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。而拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。接口方法的实现逻辑,拦截处理接口入参,打印入参值、请求时间、url、ip、接口路径。拦截器需要被spring容器管理,定义之后需要注册到容器中才能生效。
2023-07-06 23:39:38
869
原创 springboot统一拦截包装接口返回值
方法返回值类型注解(此注解使用在controller的方法上,用来标识接口返回的数据类型,可以有json、html或者ingore),只要不是ignore、html或xml,就当做json,在方法handleReturnValue中使用Result来统一包装。包装器(把处理器handler加入到RequestMappingHandlerAdapter的list中)代替手动封装每个接口的返回值。
2023-07-06 23:20:51
639
原创 springboot分组校验
接口insert和update的入参都是StudentReq,其中的字段id和sex分别被注解StudentValidator.Update.class和StudentValidator.Insert.class表示,同时接口层面也使用了注解标识。则接口会校验被标识的字段。主要2个场景,场景1:多个接口使用相同的入参,不同接口需要校验的内容不同。场景2:针对同一个接口,某个值(一般是类型)的不同会影响其他值的内容,此时需要根据某个值的内容来做不通的校验。
2023-07-06 22:31:04
1415
原创 NIO异步通讯原理
1、相关概念(1)阻塞(Block)和非阻塞(Non-Block): 关注的是线程或者进程在运行过程中是否等待调用结果的状态,多用于server端数据处理方式。 阻塞:程序运行过程中,当前线程或者进程在数据返回前会被操作系统挂起,只有等到返回数据后才继续执行(BIO模型) 非阻塞:当前线程或者进程运行过程中,不管数据有没有准备好都不会被操作系统挂起而是直接继续执行其他工作。(2)同步(Synchronization)和异步(Asynchronous)的方式:...
2020-09-06 21:51:56
2080
原创 Java线程池的状态
1、线程池也有自己的生命周期,不同于线程的新建状态,就绪状态,运行状态,阻塞状态,死亡状态等状态,线程池有5种状态:Running,SHUTDOWN,STOP,TIDYING,TERMINATED。线程池状态定义代码如下:private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));private static final int COUNT_BITS = Integer.SIZE - 3;private s...
2020-09-06 00:06:50
371
原创 工厂模式——简单工厂模式、工厂方法模式和抽象工厂模式
1、简述 工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式,属于创建型模式。2、不使用工厂模式 (1)类图分析 一个接口Computer,接口有两个实现类HP和Apple,同时有一个测试类Client。不使用工厂模式时,在Client中直接通过new操作符类创建HP和Apple类的实例。 (2)代码展示 Computer接口:package com.factory;public interface Computer { void comput
2020-09-05 23:37:05
448
原创 单例模式
1、单例模式定义 单例模式可定义为:一个类只有一个实例,并且该类能够自行创建此实例的模式。在Java中,单例模式可以保证一个类在JVM中只有一个实例对象存在。 一般情况下,我们定义一个普通的类之后,当需要该类的实例对象时只需要通过new操作符就可以获得此类的一个实例对象,这是因为Java类都包含一个或一个以上的构造方法,构造方法用于构造该类的实例对象,Java语言通过new关键字来调用构造方法,从而返回该类的实例对象。还需要明确的是,当没有在类中自定义构造方法时候,系统会为类提供一个默认的无参构
2020-09-05 23:32:11
134
原创 建造者模式——案例分析与代码演示
1、概述 建造者模式多用在对象构成比较复杂的场景中,比如汽车、电脑等包含的组件数量和种类很多很大的情形下。建造者(Builder)模式的定义如下,把一个复杂对象的构造与它的装配分离,使同样的构造过程可以创建不同的装配,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象(小的组件),然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 由于实现了构建和装配的解耦,不同的构建器相同的装配,可以产生不同的对象;相同的构建器,不同的装配顺
2020-09-05 22:41:44
171
原创 代理模式——案例分析与代码演示
1、代理模式定义 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。比如租房中介,我们想租房的时候找租房中介,租房中介是户主的代理,代替户主带着租客看房、签约等后续后续操作。此模式的UML图如下:2、代理模式的使用场景(1)控制访问:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。(2)功能增强(符合开闭原则...
2020-09-05 22:19:35
308
原创 Java中Thread类的start()和run()方法
1、两个方法的区别start(): 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程。举例说明:class ThreadTest extends Thread{ public void run(){ ... } };然后假设在main方法中带创建了一个线程mythread...
2020-08-30 15:48:13
3112
原创 Java实现多线程的两种方式讲解
1、两种方式 继承Thread和实现Runnable接口 a、Runnable是一个接口,该接口中只包含了一个run()方法。我们可以定义一个类A实现Runnable接口;然后,通过new Thread(new A())等方式新建线程,通过这种方式创建出来的多个线程共享A类对象的数据。它的定义如下: public interface Runnable { public abstract void run(); } b、...
2020-08-30 15:28:39
1579
原创 Java中线程池拒绝策略——代码讲解
1、在使用ThreadPoolExecutor创建多线程时候,需要出入多个参数,如下: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
2020-08-30 13:28:25
694
原创 Quartz概念详解
1、Quartz是什么: Quartz是由Java开发,可以用来执行定时任务的开源框架2、主要概念Scheduler- 与调度程序交互的API。 Job - 由希望由调度程序执行的组件实现的接口。 JobDetail - 用于定义作业的实例。 Trigger(即触发器) - 定义执行给定作业的计划的组件。 JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。 TriggerBuilder - 用于定义/构建触发器实例。3、Scheduler...
2020-08-16 14:21:38
2036
原创 Redis数据类型——set
1、简介 Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。2、操作(1)SADD key member1 [member2]——向集合添加一个或多个成员(2)SCARD key——获取集合的成员数(3)SMEMBERS key——返回集合中的所有成员(4)SISMEMBER key member——判...
2020-08-01 13:31:05
146
原创 Redis数据类型——list
1、简介 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 2的32次方- 1 个元素 (4294967295, 每个列表超过40亿个元素)。2、操作(1)LPUSH key value1 [value2]——将一个或多个值插入到列表头部(2)LPOP key——移出并获取列表的第一个元素返回的是小米,不是华为。因为是通过lpush先后插入huawei和xiaomi,所以xiaom...
2020-08-01 12:36:15
118
原创 Redis数据类型——hash
1、简介 Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 232- 1 键值对(40多亿)。2、操作(1)HSET key field value——将哈希表 key 中的字段 field 的值设为 value(2)HLEN key——获取哈希表中字段的数量(3)HGETALL key——获取在哈希表中指定 key 的所有字段和...
2020-07-31 15:15:44
161
原创 JVM监控命令之——JSTAT
1、简介JSTAT即JVM Statistics Monitoring Tool,JVM统计数据监控工具,可以用来查看JVM中GC、类加载等信息[option] : 操作参数 LVMID : 本地虚拟机进程ID [interval] : 连续输出的时间间隔 [count] : 连续输出的次数(默认一直打印)参数解析:Option Displays… class class loader的行为统计。Statistics on the behavior of the cl
2020-07-29 11:23:09
317
原创 JVM监控命令之——JSTACK
1、简介 stack trace,用于打印java线程的调用栈(执行栈,瞬时),包括class全名、方法名、行号等,如果指定-m还会打印native帧;不过对于实际工作情况,我们通常用于追踪多线程任务调度过程、对象lock(或者死锁)、并发同步阻塞、IO线程执行状态等;比如排查某个线程为何wait(假死,阻塞等)。 也即是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jsta...
2020-07-29 11:08:49
374
原创 JVM监控命令之——JINFO
1、简介 jinfo命令可以查看JVM参数并动态修改部分JVM参数。 格式:-flag <name> 打印指定名称的参数 -flag [+|-]<name> 打开或关闭参数 -flag <name>=<value> 设置参数 -flags 打印当前指定java进程中已经设定的所有JVM参数信息 -sysprops 打印当前java进程中设定的系统环境参数 <no option> 打印上面两个选项2、操...
2020-07-29 10:52:58
285
1
原创 JVM监控命令之——JPS
1、简介 jps是用于查看有权访问的hotspot虚拟机的进程,当未指定hostid时,默认查看本机jvm进程,也可查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。 jps可以列出jvm进程lvmid、主类类名、main函数参数、jvm参数和jar名称等信息。格式:jps [options] [hostid]参数解析:-l : 输出主类全名或jar路径 -q : 只输出LVMID -m : 输出JVM启动时传递给main()的...
2020-07-29 10:21:41
438
原创 MySQL索引数据结构
1、简介 索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。2、几种数据结构介绍 本文介绍的是InnoDB 存储引擎中的 B+ 树索引。要介绍 B+ 树索引,就不得不提二叉查找树、平衡二叉树和 B 树这三种数据结构。B+ 树就是从这三中数据结构演化(优化)而来...
2020-07-29 08:43:55
220
原创 如何找出某一天访问网站最多的 IP
1、Question现有海量日志数据保存在一个超大文件中,该文件无法直接读入内存,要求从中提取某天访问百度次数最多的那个 IP。2、分析这道题只关心某一天访问百度最多的 IP,因此,可以首先对文件进行一次遍历,把这一天访问百度 IP 的相关信息记录到一个单独的大文件中。 接下来采用的方法与上一题一样,大致就是先对 IP 进行哈希映射。 接着使用 HashMap 统计重复 IP 的次数,最后计算出重复次数最多的 IP。注:这里只需要找出出现次数最多的 IP,可以不必使用堆,直接用一.
2020-07-22 19:40:34
604
原创 如何从大量数据中找出高频词
1、Question有一个 1GB 大小的文件,文件里每一行是一个词,每个词的大小不超过 16B,内存大小限制是 1MB,要求返回频数最高的 100 个词(Top 100)。2、分析仍然是大数据量的处理问题。由于文件大小远超过内存大小。所以仍然采用分治思路。把大文件拆分多分。如果5000份,每份200KB。如果2000份,每份500KB。此处分成5000份,每份200KB。每次处理200KB的文件思路如下:首先遍历大文件,对遍历到的每个词x,执行hash(x) % 5000,将...
2020-07-22 19:38:53
1570
原创 如何从大量的URL中找出相同的URL
1、Question给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL2、分析50亿 * 64B = 320GB (1GB=1000 MB=1000 000 KB=1000 000 000 B)320GB的文件,无法直接加载到内存中进行处理。对于数据量太大无法一次加载到内存的题目,一般采用分治法。把大的文件拆分中多个文件,然后单独处理每个文件,最终再汇总每个计算结果。把320GB分成1000份,一份大概
2020-07-22 19:35:20
1739
原创 rabbitmq中持久化
1、简介 持久化是为了提高rabbitmq可靠性的一种机制,避免在异常情况(重启,关闭,宕机)下消息系统中数据的丢失。2、持久化方案 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exchange和Message都持久化。3、交换器持久化 交换器的持久化是在声明交换器时,将durable参数设置为true实现的。交换器不设置持久化对消息的可靠性来说没有什么影响,但是当broker服务重启之后,exchange将不复存...
2020-07-15 10:25:20
4138
原创 Java中hashcode和equals详解
1、hashCode概念(1)hash与hash表 hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值。这个时候,我们就需要知道另一个东西,hash表,通过hash算法得到的hash值就在这张hash表中,也就是说,hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值,后面会以直接取余法来讲。(2)hashcode 有了前面的基础,这里讲解就简单了,hashcode就是通过hash函数得来的...
2020-07-08 10:04:09
4660
1
原创 redis集群架构详解
1、redis集群架构 redis集群即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。它由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。2、redis集群的作用集群的作用,可以归纳为两点:(1)数据分区:数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大...
2020-07-07 12:09:45
819
原创 redis主从复制架构详解
1、主从复制主从复制,是指将一台Redis服务器的数据(主服务器master)复制到其他的Redis服务器(从服务器slave)。数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。(主从之间是1 : n关系,n >= 0)2、主从复制的操作和使用(1)开启主从复制 主从复制的开启,完全是在从节点发起的,主节点被动接收从节点的请求并做出相应处理就好。...
2020-07-07 10:11:49
292
1
原创 redis架构模式以及各自特点
1、单机版(1)架构图(2)特点 a、架构简单,只要一个redis实例。 b、内存容量有限 c、处理能力有限 d、无法高可用(单机存在单点故障)2、主从复制 Redis 的主从复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(...
2020-07-07 08:36:52
956
原创 Redis如何做到高并发和高可用
1、高并发单机的redis的QPS一般在几万(官方说法可以达到10万)。所以对于十万、百万甚至千万级别的QPS,单机的redis肯定不能支撑这么大的访问量。解决此类高并发问题,可以采用redis的主从架构模式。主从架构:一主多从实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发。但是,在主从架构中,每个redis实例都容纳了所有的完整数据,比如redis...
2020-07-06 20:45:27
2266
原创 RabbitMQ如何保证高可用
1、前奏概念 首先需要知道rabbitmq的queue中的元数据是什么概念? 任何文件系统中的数据分为两种:数据和元数据。 数据是指普通文件中的实际数据,是有现实意义、实际价值和含义的数据。而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属...
2020-07-05 11:12:06
2717
原创 分布式锁——基于缓存Redis实现分布式锁
1、分布式锁实现的三个核心要素:(1)加锁最简单的方法是使用 setnx 命令。key 是锁的唯一标识,按业务来决定命名。比如想要给一种商品的秒杀活动加锁,可以给 key 命名为 “lock_sale_商品ID” 。而 value 设置成什么呢?我们可以姑且设置成 1。加锁的伪代码如下:setnx 的含义:就是 SET if Not Exists,其主要有两个参数 setnx(key, value)。该方法是原子的,如果 key 不存在,则设置当前 key 成功,返回 1;如果当前 key
2020-06-26 14:57:32
471
原创 分布式锁——理论篇
1、什么是分布式锁 分布式锁是什么呢?当然是一种锁了,只不过是在分布式系统中使用的锁。在分布式系统中,为了防止分布式系统中的多个进程之间相互干扰,保证一个方法或属性在高并发情况下的同一时刻只能被同一个线程执行和使用,就需要一种分布式协调技术来对这些进程进行控制和调度。而分布式锁就是能够实现分布式协调调度的技术。2、为什么使用分布式锁 在单机环境中Java提供了很多并发处理相关的API。比如在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如Ree...
2020-06-26 11:47:10
306
原创 分布式锁——基于数据库的实现
基于数据库的实现由两种实现方式:基于数据库表和基于数据库排他锁的方式。1、基于数据库表 要实现分布式锁,最简单的方式就是直接创建一张锁表,然后通过操作该表中的数据来实现了。当我们要锁住某个方法或资源时,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录。 创建这样一张数据库表: 当我们想要锁住某个方法时,执行以下SQL: 因为我们对method_name做了唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有...
2020-06-26 11:43:14
328
原创 Excel文件(.xls和.xlsx)文件的读取总结
1、.xls和.xlsx的区别(1)文件格式不同。xls 是一个bai特有的二进制格式,其核心结构是du复合文档类型zhi的结构,而 xlsx 的核心结构是 XML 类型的结构,采用的是基于 XML 的压缩方式,使其占用的空间更小。xlsx 中最后一个 x 的意义就在于此。(2)版本不同。xls是excel2003及以前版本生成的文件格式,而xlsx是excel2007及以后版本生成的文件格式。(3)兼容性不同。xlsx格式是向下兼容的,可兼容xls格式。(4)读取方式,两种:使用导入jxl
2020-06-13 09:32:08
5667
原创 Java中stream流
1、什么是stream流 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只...
2020-05-25 18:41:17
282
原创 Git入门基础、具体操作和设置github远程仓库
1、Git是什么Git是目前世界上最先进的分布式版本控制系统。2、Git安装①下载得到安装包,并运行②选择软件的安装位置③选择需安装的组件(默认即可,直接下一步)④选择使用的编辑器(默认即可,直接下一步)⑤环境变量调节⑥使用OpenSSH,直接下一步即可⑦使用OpenSSL库⑧配置命令行会话(默认即可)⑨配置终端(默认即可)⑩配置额外的选项(默认即可)安装完成在桌面空白处右键鼠标,若出现“Git GUI Here
2020-05-20 16:38:01
925
原创 TCP连接释放——四次握手
1、数据传输结束后,通信的双方都可释放连接。现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。2、B 发出确认,确认号 ack = u + 1,而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程,从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。3、若 B 已经没有要向 A 发送的数据,其.
2020-05-14 13:07:01
2144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人