自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

花明的博客

打怪升级...

  • 博客(135)
  • 资源 (1)
  • 收藏
  • 关注

转载 Shell 命令

Shell 编程概述在 Linux 下有一门脚本语言叫做:Shell 脚本,这个脚本语言可以帮助我们简化很多工作,例如编写自定义命令等,所以还是很有必要学习它的基本用法的,一个简单的 hello.sh 脚本像下面这样,第一行 #!/bin/bash 标识该 Shell 脚本由哪个 Shell 解释:#!/bin/bash echo "Hello World!"赋予可执行权限# 赋予可执行权限chmod a+x hello.sh# 执行./hello.sh# 结果Hello Wor

2021-09-10 17:40:33 194 1

转载 Mybatis-缓存

一级缓存一级缓存介绍在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。具体执行过程如下图所示每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果

2021-09-06 17:27:54 201

转载 Mybatis- 应用

主键返回通常我们会将数据库表的主键id设为自增。在插入一条记录时,我们不设置其主键id,而让数据库自动生成该条记录的主键id,那么在插入一条记录后,如何得到数据库自动生成的这条记录的主键id呢?有两种方式使用useGeneratedKeys和keyProperty属性<insert id="insert" parameterType="com.yogurt.po.Student" useGeneratedKeys="true" keyProperty="id"> INSERT

2021-09-04 11:17:06 206

转载 Mybatis-基础入门

概述Mybatis是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低什么是ORMObject Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应studen

2021-09-04 09:57:35 156

转载 分布式锁实现

对于一个单机的系统,我们可以通过synchronized或者ReentrantLock等这些常规的加锁方式来实现,然而对于一个分布式集群的系统而言,单纯的本地锁已经无法解决问题,所以就需要用到分布式锁了,通常我们都会引入三方组件或者服务来解决这个问题,比如数据库、Redis、Zookeeper等。通常来说,分布式锁要保证互斥性、不死锁、可重入等特点互斥性指的是对于同一个资源,任意时刻,都只有一个客户端能持有锁不死锁指的是必须要有锁超时这种机制,保证在出现问题的时候释放锁,不会出现死锁的问题可重入指的

2021-08-27 11:18:58 74

转载 分布式ID

什么是分布式ID在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。分布式ID需要满足那些条件全局唯一:必须保证ID是全局性唯一的,基本要求高性能:高可用低延时

2021-08-26 16:49:49 90

转载 滑动窗口算法基本原理

学过计算机网络的同学,都知道滑动窗口协议(Sliding Window Protocol),该协议是 TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。滑动窗口算法其实和这个是一样的,只是用的地方场景不一样,可以根据需要调整窗口的大小,有时也可以是固定窗口大小。滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,

2021-08-26 09:54:03 4157 1

转载 分布式事务

什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操作,「要么全部成功执行,要么全部不执行」为什么会有分布式事务上图中包含了库存和订单两个独立的微服务,每个微服务维护了自己的数据库。在交易系统的业务逻辑中,一个商品在下单之前需要先调用库存服务,进行扣除库存,再调用订单服务,创建订单记录。正常情况下,两个数据库各自更新成功,两边数据维持着

2021-08-26 09:52:29 100

转载 CAP和BASE理论

问题的提出在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看下面三种业务场景:火车站售票假如我们的用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然后拿着车票去检票口,再坐上火车,开始一段美好的旅行,一切似乎都是那么和谐。想象一下,如果他选择的目的地是杭州,而某一趟开往杭州的火车只剩下最后一张车票,可能在同一时刻,不同售票窗口的另一位乘客也购买了同一张车票。假如说售票系统没有进行一致性的保障,两人都购票成功了。而在检票口 检票的时候,其中一位乘客会被告知他的车票

2021-08-25 15:22:11 90

转载 InheritableThreadLocal和TransmittableThreadLocal详解

InheritableThreadLocal简介由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadLocal能够被子线程使用,实现方式就会相当困难(需要用户自己在代码中传递)。在此背景下,InheritableThreadLocal应运而生。应用调用链追踪:在调用链系统设计中,为了优化系统运行速度,会使用多线程编程,为了保证调用链ID能够自然的在多线程间传递,需要考虑ThreadLocal传递问题(大多数系统会使用线程池技术,这已经不仅仅是InheritableT

2021-08-24 13:45:34 1643

转载 RabbitMQ基础

RabbitMQ 简介RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ 发展到今天,被越来越多的人认可,这和它在易用性、扩展性、可靠性和高可用性等方面的卓著表现是分不开的。RabbitMQ 的具体特点可以概括为以下几点:可靠性: RabbitMQ使用一些机制来保证消息的可靠性,如持久化、传输确认及发布确认等。灵活的路由

2021-08-22 19:21:27 162

转载 Redis-避免缓存穿透的利器之BloomFilter

Bloom Filter 概念布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。Bloom Filter 原理布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它

2021-08-22 17:24:04 127

转载 SpringBoot自动装配原理

前言使用过 Spring 的小伙伴,一定有被 XML 配置统治的恐惧。即使 Spring 后面引入了基于注解的配置,我们在开启某些 Spring 特性或者引入第三方依赖的时候,还是需要用 XML 或 Java 进行显式配置。但是,Spring Boot 项目,我们只需要添加相关依赖,无需配置,并且我们通过 Spring Boot 的全局配置application.properties或application.yml即可对项目进行设置比如更换端口号,配置 JPA 属性等等。为什么 Spring Boot

2021-08-22 15:44:51 85

原创 排查JVM内存溢出泄露的方式

Jconsole终端输入jconsole就会出现jdk自带的gui监控工具, 可以根据内存使用情况间接了解内存使用和gc情况jstat命令比如jstat -gcutil pid查看对应java进程gc情况s0: 新生代survivor space0简称 就是准备复制的那块 单位为%s1:指新生代s1已使用百分比,为0的话说明没有存活对象到这边e:新生代eden(伊甸园)区域(%)o:老年代(%)ygc:新生代 次数ygct:minor gc耗时fgct:full gc耗时(秒)GC

2021-08-22 11:42:40 159

转载 MySQL分库分表

数据库瓶颈不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用IO瓶颈磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库CPU瓶颈第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加C

2021-08-21 13:28:01 93

原创 SQL题目

create table student( id int(11) not null primary key auto_increment, name varchar(16) not null, age int(11), sex varchar(1));alter table student modify column sex varchar(1) comment '1=男,0=女';insert into studentvalues (1,

2021-08-20 17:03:53 194

转载 MySQL主从复制

概述随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡读写分离,一主一丛或一主多从。主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。主从复制可以分为:主从同步:当用户写数据主服务器必须和从服务器同步了才告诉用户写入成功,等待时间比较长。主从异步:只要用户访问写数据主服务器,立即返回给用户主从半同步:当用户访问写数据主服务器写入并同步其中一个从服务器就返回给用户成功。形式一主一从一主多从一主一从和一主多从是我们现在见的最

2021-08-20 15:06:27 121

转载 Redis集群及分布式一致性协议

Redis 单机模式单机模式就是指 Redis 主节点以单个节点的形式存在,这个主节点可读可写,上面存储数据全集。在3.0版本之前,Redis 只能支持单机模式,出于可靠性考量,通常单机模式为“1主 N 备”的结构,如下所示:需要说明的是,即便有很多个 Redis 主节点,只要这些主节点以单机模式存在,本质上仍为单机模式。单机模式比较简单,足以支撑一般应用场景,但单机模式具有固有的局限性:不支持自动故障转移,扩容能力极为有限(只能Scale-Up, 垂直扩容),高并发瓶颈不支持自动故障转移Redi

2021-08-19 20:29:23 1711

原创 Redis基础

Redis有哪些数据结构string 字符串字符串类型是 Redis 最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的。字符串类型实际上可以是字符串:简单的字符串、XML、JSON;数字:整数、浮点数;二进制:图片、音频、视频。使用场景:缓存、计数器、共享 Session、限速Hash(哈希)在 Redis中哈希类型是指键本身是一种键值对结构,如 value={{field1,value1},……{fieldN,valueN}}使用场景:哈希结构相对于

2021-08-19 14:24:56 72

转载 Redis 常见面试题

概述Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。另外,Redis 除了做缓存之外,也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。分布式缓存常见的技术选型方案有哪些分布式缓存的话,使用的比较多的主要是 Memcached 和 Redis。不过,现在基本没

2021-08-18 15:45:46 132

转载 MySQL-索引

索引概念索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。索引的优势和劣势优势可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些如果按照

2021-08-17 17:54:41 79

转载 MySQL-事务

什么是事务事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行成功,要么全部执行失败。事务的四大特性(ACID)原子性(Atomicity,或称不可分割性)一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有的操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性一致性(Consistency)数据库总是从一个一致性的状态转换到另外一个一致性的状态,在事务开始之前和之后

2021-08-16 20:52:13 512

原创 数据库基本概念

概念元组 : 元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。码 :码就是能唯一标识实体的属性,对应表中的列。候选码 : 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是候选码。主码 : 主码也叫主键。

2021-08-16 11:01:03 357

原创 Spring框架

概念Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。Spring 最核心的思想就是不重新造轮子,开箱即用!Spring 提供的核心功能主要是 IoC 和 AOP。学习 Spring ,一定要把 IoC 和 AOP 的核心思想搞懂!列举一些重要的 Spring 模块Spring Core核心模块, Sprin

2021-08-12 23:03:21 312

原创 Java基础- Semaphore,CountDownLatch,CyclicBarrier

Semaphore(信号量)synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。public class SemaphoreExample1 { // 请求的数量 private static final int threadCount = 550; public static void main(String[] args) throws InterruptedException {

2021-08-10 22:57:25 222

原创 Java基础- ReentrantLock

ReentrantLock概述ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于 synchronized 的使用,但是 ReentrantLock 提供了比 synchronized 更强大、灵活的锁机制,可以减少死锁发生的概率源码:public class ReentrantLock implements Lock, java.io.Serializable { private final Sync sync; abstract static class

2021-08-10 22:04:54 279

原创 Java基础- AQS

概述AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS 就是一个抽象类,主要用来构建锁和同步器。AQS 为构建锁和同步器提供了一些通用功能的实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,Fut

2021-08-10 22:00:30 56

原创 Java基础-Synchronized关键字

概述Synchronized是Java中保证线程安全的使用较多的一个关键字使用场景修饰实例方法,对当前实例对象this加锁public class Synchronized { public synchronized void aaa(){ }}修饰静态方法,对当前类的Class对象加锁public class Synchronized { public synchronized static aaa(){ }}修饰代码块,指定一个加锁的对象,给对象

2021-08-10 00:10:35 127 1

原创 Java基础- Java内存模型(JMM)

概念Java内存模型,是java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别现代计算机的内存模型现代计算机中,cpu的指令速度远超内存的存取速度, 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。基

2021-08-09 22:29:01 61

原创 Java基础- volatile关键字

概念volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。尤其在C语言、C++以及Java中,都有volatile关键字。都可以用来声明变量或者对象。volatile是并发编程中常用的关键字,可以保证修饰的变量对所有线程的可见性和程序执行的顺序即有序性volatile的用法volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。volatile的用法比较简单,只需要在声明一个可能被多线程同时访问的变量时,使用volatile

2021-08-08 21:32:24 74

原创 Java基础-Java线程池

概念线程池,其实就是维护了很多线程的池子,类似这样的池化技术还有很多的,例如:HttpClient 连接池、数据库连接池、内存池等等。线程池的优点在 Java 并发编程框架中的线程池是运用场景最多的技术,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来至少以下4个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行提高线程的可管理性。线程是稀缺资源,如果无限制地创

2021-08-08 15:13:27 84

转载 Redis主从复制

前言Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。这篇文章中,将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、实际应用中需要注意的问题(如数据不一致问题、复制超时问题、复制缓冲区溢出问题)、主从复制相关的配置(重点是repl-timeout、client-

2020-07-01 16:40:26 120

转载 Redis持久化机制

概述持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是

2020-06-28 16:25:43 186

转载 Redis获取客户端 服务器信息常用命令

AUTH password通过设置配置文件中 requirepass 项的值(使用命令 CONFIG SET requirepass password ),可以使用密码来保护 Redis 服务器。如果开启了密码保护的话,在每次连接 Redis 服务器之后,就要使用 AUTH 命令解锁,解锁之后才能使用其他 Redis 命令。CONFIG SET requirepass secret_password 将密码设置为 secret_passwordCONFIG GET requirepass获取配置

2020-06-16 10:32:59 2836 1

转载 Redis 命令

字符串 stringSET key value [EX seconds] [PX milliseconds] [NX|XX]SET key value:可以对已存在或不存在的键进行设置值EX seconds:将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value

2020-06-16 10:25:17 145

原创 阿里云 Redis安装

环境信息:系统:centos7.0下载安装下载:wget http://download.redis.io/releases/redis-4.0.10.tar.gz解压:tar -xvzf redis-4.0.10.tar.gz进入解压目录:cd redis-4.0.10安装:make配置redis-4.0.10目录下有个redis-conf文件,编辑这个文件注释掉bind 127.0.0.1这一行或者改成bind 0.0.0.0,这样可以使所有的ip访问redis修改 pro

2020-06-15 20:35:59 243

原创 Spring/SpringBoot参数校验

参数校验数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据JSR(Java Specification Requests) 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!校验的时候我们实际用的是 Hibernate Validator 框架。H

2020-05-13 11:31:15 338

转载 Spring/SpringBoot常用注解

1. @SpringBootApplication这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上。@SpringBootApplicationpublic class SpringSecurityJwtGuideApplication { public static void main(java.lang.String[] a...

2020-04-29 20:02:46 273

转载 SpringBoot 处理异常的几种常见姿势

1. 使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常这是目前很常用的一种方式,非常推荐。测试代码中用到了 Junit 5,如果你新建项目验证下面的代码的话,记得添加上相关依赖1. 新建异常信息实体类非必要的类,主要用于包装异常信息。src/main/java/com/twuc/webApp/exception/ErrorResponse.ja...

2020-04-29 08:32:56 661

转载 代码注释规范-IDEA 配置 Java 类 方法注释模板

三种常用的 Java 注释方式 // 声明常量 int number; /* * 类主函数 */ public static void main(String[] args) { } /** * @param masterId 品牌商Id * @param shopId 店铺Id * @p...

2020-04-26 11:38:51 956

java_API_1.7

java的API文档,1.7版本,中文版,,,,,,,你值得拥有

2017-10-16

空空如也

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

TA关注的人

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