自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 问答 (1)
  • 收藏
  • 关注

转载 数据库三范式

1.范式说明1.1 第一范式(1NF)无重复的列  所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能同时有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。  在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是

2021-05-06 18:02:29 406

原创 重构方法学习—对对象进行重构

Move method(搬移方法)含义:在该函数最常用引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单独的委托函数,或是将旧函数完全移除原因如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的任务。Move Field(搬移字段)含义:在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段原因对于一个字段,在其所驻类之外的另一个类中有更多函

2020-12-14 23:48:20 299

原创 重构方法学习—对函数进行重构

1. Extract Method(提炼函数)含义:将一部分代码提炼成一个小的方法,然后替换原有逻辑的地方三种情况无局部变量有局部变量对局部变量再赋值局部变量只在提炼代码赋值:直接提炼成方法就可以局部变量之外也使用了此变量局部变量在提炼方法后面没有使用,那么直接在提炼的目标方法中修改就可以了局部变量在提炼方法后面仍然使用,那么通过返回结果返回该变量改变后的值2. Inline Method(内联函数)含义:在函数调用的地方,使用函数体来替换函数的调用

2020-12-11 00:31:46 315

原创 重构方法学习—对函数进行重构

### 1. Extract Method(提炼函数)* 含义: * 将一部分代码提炼成一个小的方法,然后替换原有逻辑的地方* 三种情况 * 无局部变量 * 有局部变量 * 对局部变量再赋值 * 局部变量只在提炼代码赋值:直接提炼成方法就可以 * 局部变量之外也使用了此变量 * 局部变量在提炼方法后面没有使用,那么直接在提炼的目标方法中修改就可以了 * 局部变量在提炼方法后面仍然使用,那么通过...

2020-12-11 00:30:49 311

原创 01--Netty--001、Netty初认识

第一节,Netty初认识Netty的优势网络应用框架的关注点:I/O模型,线程模型和事件处理模型易用性API接口对数据协议、序列化的支持IO模型IO请求分为两个阶段,调用阶段和执行阶段IO调用阶段:用户进程向内核发起系统调用,即请求数据发出的过程IO执行阶段:内核等待IO请求处理完成(包括网络IO和磁盘IO)返回。又可分为两个阶段等待数据就绪,写入内核缓存区,即你需要的数据,已经写入的内存中,但是无法给用户来使用将内核缓存区数据拷贝到用户态缓存区,此过程正是将数据拷贝到

2020-10-28 11:06:10 70

原创 Java序列化和反序列化--jdk的序列化和反序列化方式

基本概念序列化:把存储在内存中的数据,转换为可传输数据流的过程,以便进行网络传输或者保存到本地反序列化:把流中的数据,转换成对象的形式原因:在服务之间调用,或者rpc之间调用时,对象是如何进行传输的,那么就是通过序列化转变为可以传输的流,进行交互。基本案例实体类都是User工具类为SerialUtilpublic class SerialUtil { public <T> byte[] serialize(T obj){ ByteArrayOutpu

2020-09-22 23:08:14 303

原创 Maven学习--002--Archetype

Archetype介绍Archetype 是一个 Maven 项目模板工具包。原型被定义为原始模式或模型,从中创建所有其他相同类型的东西。这些名称适合我们尝试提供一个系统,该系统提供生成Maven项目的一致方法。Archetype 将帮助作者为用户创建 Maven 项目模板,并为用户提供生成这些项目模板的参数化版本的方法。-- 摘自官网Archetype创建使用工具创建一个maven项目导入pom文件<properties> <jdk.version>1.8

2020-09-15 19:32:42 140

原创 Maven学习--001--坐标、依赖、多环境切换

Maven坐标一个完整的坐标信息,由 groupId、artifactId、version、packaging、classifier 组成,如下是一个简单的坐标定义。<groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.2.3</version><packaging>jar</packaging

2020-09-14 23:47:24 126

原创 映射框架--MapStruct--001--基本使用

简介MapStruct是满足JSR269规范的一个Java注解处理器,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。您所要做的就是定义一个mapper接口(@Mapper),该接口用于声明所有必须的映射方法。在编译期间MapStruct会为该接口自动生成实现类。该实现类使用简单的Java方法调用来映射source-target对象,在此过程中没有反射或类似的行为发生。编译时期使用自动生成get和set方法,进行

2020-08-31 21:05:36 281

原创 Java8新特性-006-Stream初识

基本概念流由三部分组成数据源,可以是List,数组…零个或者多个中间操作,可以让前面一个流转换成另外一个流终止操作,得到最后的结果流操作的分类惰性求值只有终止操作执行时,中间操作才会执行//在执行count终止操作的时候,xxx(),yyy()中间操作才会执行stream.xxx().yyy().count();//对于没有终止操作而言,中间操作,即中间的方法是不会执行,即xxx() yyy()不会执行stream.xxx().yyy()及早求值,即指在调用方法的

2020-08-20 00:35:28 150

原创 Java8新特性-005-方法引用

lambda表达式的语法糖,一种特殊情况,让代码更加简洁入门案例public class MethodDemo { public static void main(String[] args) { List<String> list = Arrays.asList("hello","world","hello world"); //传统写法 list.forEach(item -> System.out.println(item.

2020-08-17 23:26:05 98

原创 Java8新特性-004-Optional

主要目的:为了解决NPE问题概念一个容器,内部可能包含空值或者非空值如果包含则isPresent()返回true,否则false是一个基于值的对象,所以,不要进行==的比较。基于值的对象有如下特点:final,不可变相等是基于equals方法,而不是==没有可访问的构造方法,构造通过工厂方法创建Optional是一个容器,内部真正保存数值的是final修饰的value对象提供了三个工厂方法通过empty构造,容器内部的value为Null的一个Optional容器对象.

2020-08-15 14:36:12 125

原创 Java8新特性-003-Predicate

作用判断一个传入的参数,是否符合传入的行为,返回boolean值源码@FunctionalInterfacepublic interface Predicate<T> { //唯一抽象方法 boolean test(T t); default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other);

2020-08-11 23:13:03 524

原创 Java8新特性-002-Function

函数式接口@FunctionalInterfacepublic interface Function<T, R> { //抽象方法 R apply(T t); //默认方法 default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(befor

2020-08-10 00:14:46 319

原创 Java8新特性-001-Lambda表达式

概念Lambda表达式的基本结构(parma1,param2,param3) -> { 执行体 }函数式接口:可以认为是一个标识仅且只有一个抽象方法,独一无二的,只存在一个的接口中可以有覆盖了Object中的方法,万物皆是object的子类创建方式为下面三种lambda表达式方法引用构造器引用函数式接口注解@FunctionalInterface如果一个接口使用了该注解表示函数式接口,如果不是下面的两个条件,编译器则报错是一个接口,而不是其他类型,包括

2020-08-10 00:13:59 105

原创 字符串转义问题--多次转义问题

问题点使用ObjectMapper.readValue(StringEscapeUtils.unescapeJava(data), List.class)将data字符串,进行转义然后转换成list分析解决原始字符串String str = "[{\"name\":\"aaa\",\"content\":\"{\\\"expression\\\":\\\"#requestTime<1111\\\"}\"}]";转义字符一个\代表一次转义,所以,使用两个\表示字符串中的\,\\

2020-07-27 20:27:33 2141

原创 Ehcache初体验 -- 代码实现

Ehcache初体验 – 代码实现最近项目中使用了ehcache作为了一级缓冲,由案例出发,深入理解1. 使用ehcache步骤与使用其他插件类似导入包 pom创建配置文件,此处为ehcache专有的ehcache.xml创建管理缓冲类EhcacheManager获取到操作缓冲的对象Cache,对缓冲进行操作2. ehcache简单实现导入包<parent> <groupId>org.springframework.boot</grou

2020-07-22 23:32:25 242

原创 缓冲--01--常见缓冲问题及解决方案

缓存穿透、缓存击穿、缓存失效1. 使用缓存存储数据的步骤1、先查询缓存,如果没有数据,再去查询数据库2、查询完数据库之后,如果数据不为空,再将结果写入缓存2. 缓存穿透1. 什么叫缓存穿透?一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很...

2019-12-30 22:18:06 591

原创 CompletionService

小案例代码public class ComplateServiceDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(3); CompletionService service = ...

2019-12-24 13:33:54 169

原创 Redis设计与实现--02--单机数据库-06-服务端

一、命令请求的执行过程步骤客户端向服务器发送命令请求 SET KEY VALUE服务器接受并处理客户端发来的请求,在数据库中进行设置操作服务器将命令回复给客户端客户端接受之后,打印出来1. 发送命令请求客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议根式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器2. 读取命令请求套接字可读时,服...

2019-12-13 13:28:30 74

原创 Redis设计与实现--02--单机数据库-05-客户端

Redis使用I/O多路复用技术实现的文件事件处理器,对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redisClient结构redis服务器状态结构的clients属性是一个链表,保存了所有与服务器连接的客户端的状态结构一、客户端属性比较通用的属性与特定功能相关的属性接下来介绍一个比较重要的属性1. 输入缓冲区客户单状态的输入缓冲区用于保存客户端发送的...

2019-12-13 13:27:09 98

原创 Java源码学习--并发量06--01--AtomicInteger

AtomicInteger一、结构实现了Number抽象类,定义了一些默认方法public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); public abstract...

2019-12-10 17:58:41 86

原创 Redis设计与实现--02--单机数据库-04-文件事件和时间事件

Redis服务器是一个事件驱动程序,共有两类事件文件事件:Redis服务器通过套接字与客户端进行连接(或其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。可以理解为对外的操作事件时间:Redis服务器的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。一、文件事件Redis基于Reactor模式开发自...

2019-12-06 13:29:49 119

原创 Java源码学习--并发锁05--03--CountDownLatch

CountDownLatch俗称倒计时,技术锁,并不是为了加锁,而是通过计数达到等待的功能等待的形式让一组线程在全部启动完成之后,在一起执行(先启动的线程需要阻塞等待后启动的线程,直到一组线程全部都启动完成后,再一起执行)主线程等待另外一组线程都执行完成之后,再继续执行。一、重要方法1. await流程 CountDownLatch |-&gt...

2019-12-05 15:55:42 85

原创 Redis设计与实现--02--单机数据库-03-AOF持久化

Redis除了RDB持久化方案以外,还提供了AOF持久化功能。与RDB通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入的AOF文件的所有命令都是Redis的命令请求协议格式保存的服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态一、AOF持久化的实现AOF持久化功能的实...

2019-12-04 13:19:31 101

原创 Redis设计与实现--02--单机数据库-02-RDB持久化

数据库状态:数据库中的非空数据库以及它们的键值对称为数据库状态一、RDB文件的创建和载入以下两个命令用于生产RDB文件SAVEBGSAVESAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器阻塞期间,服务器不能处理任何命令请求BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进行(父进程)继续处理命令请求RDB文件的创建可以...

2019-12-03 23:26:53 92

原创 Java源码学习--并发锁05--02--ReentrantLock

AQS的具体实战–ReentrantLock可重入锁构造器接受fairness参数,fairness是true时,保证获取锁的顺序,false不保证公平锁的吞吐量较低,获得锁的公平性不能代表线程调度的公平性一、类结构ReentrantLock实现了Lock接口Lock接口定义了各种加锁,释放锁的方法public interface Lock { // 获得锁方法,获取不到...

2019-12-03 22:28:17 84

原创 Java源码学习--并发锁05--01--AQS

基本属性总体流程一、类结构源码代码public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { ....}解释AQS是抽象类,是给子类使用,同样的,抽出了很多共用的方法,...

2019-12-03 17:48:57 99

原创 springboot--疑难问题--跨域问题

创建过滤器进行拦截,然后设置返回,即可解决@Component@WebFilter(urlPatterns = "/*",filterName = "ACAFilter")@Order(1)public class ACAFilter implements Filter { @Override public void init(FilterConfig filterCo...

2019-12-02 16:06:01 91

原创 Redis设计与实现--03--多机数据库--复制

一、旧版本(Redis2.8以前)的复制功能旧版本的复制分为同步和命令传播同步:作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态命令传播:用于主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态1. 同步当客户端从服务器发送SALEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,将从服务器的数...

2019-12-01 23:32:10 127 1

原创 Java源码学习--并发_线程池04--01--ThreadPoolExecutor

Executor(I)->ExecutorService(I)->AbstractExecutorService©->ThreadPoolExecutor©通过接口的继承关系,可以发现,单一职责原则,Executor就是用来负责任务的执行,ExecutorService用来管理任务,必然会存在一个抽象类,来封装ExecutorService中针对线程的通过管理方法,子类可以使...

2019-11-29 16:12:34 144 1

原创 Java源码学习--并发线程属性类03--01--ThreadLocalMap->ThreadLocal

ThreadLocalThreadLocal提供了一种方式,在多线程环境下,每个线程都可以拥有自己独特的数据,并且可以在整个线程执行过程中,从上由下传递。1. 结构类的定义:泛型类,支持其他类型public class ThreadLocal<T> {}1.1 关键属性代码// threadLocalHashCode 表示当前 ThreadLocal 的 ha...

2019-11-28 00:44:49 104 1

原创 Java源码学习--并发任务类02--01--FutureTask

CallableCallable是一个接口,约定了线程要做的事情,和Runnable一样,区别在于有返回值代码public interface Callable<V> { V call() throws Exception;}Runnable接口该接口指定了线程执行的任务,实现了此接口的类,即可作为线程执行的任务,进行执行代码public interface...

2019-11-27 19:54:13 113 1

原创 Java源码学习--并发集合类01--02--ConcurrentHashMap

属性内存中属性的偏移量,用于在CAS操作中,获取到属性对应的内存地址,从而获取到值// Unsafe mechanicsprivate static final sun.misc.Unsafe U;private static final long SIZECTL;private static final long TRANSFERINDEX;private static fina...

2019-11-26 17:21:47 141

原创 Redis设计与实现--01--数据结构04--整数集合

Redis使用整数集合作为集合键的底层实现的条件一个集合只包含整数值元素集合的元素数量不多一、实现整数集合是Redis用于保存整数值的集合抽象数据结构可以保存类型为int16_t,int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。由intset.h/intset结构实现typedef struct intset{ //编码方式 uint32_t...

2019-11-26 13:20:19 82

原创 Java源码学习--并发集合类01--01--CopyOnWriteArrayList

CopyOnWriteArrayList特点线程安全的,多线程直接使用,无须加锁通过锁+数组拷贝+volatile关键字保证了线程安全每次数组操作,都会把数组拷贝一份出来,在新数组上进行操作,操作完成之后再赋值回去整体步骤:对数组进行操作的时候加锁从原数组拷贝出新数组在新数组上进行操作,并把新数组赋值给数组容器1. 继承体系代码public class Cop...

2019-11-26 11:28:05 97

原创 Redis设计与实现--01--数据结构03--跳跃表

跳跃表跳跃表示一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。Redis使用跳跃表作为有序集合键的底层实现之一,满足下面条件之一,就会使用跳跃表实现有序集合键有序集合包含的元素数量比较多有序集合的中的元素的成员是比较长的字符串Redis在两个...

2019-11-25 23:55:57 88

原创 Redis设计与实现--01--数据结构02--字典

字典又称符号表,关联数组或者映射,用于保存键值对。字典中的每个键都是独一无二,不重复字典实现Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典的一个键值对。哈希表table属性是一个数组,每个元素是一个dictEntry结构的指针,每个dictEntry结构保存着一个键值对typedef struct dictht{ ...

2019-11-22 19:49:20 110

原创 Redis设计与实现--01--数据结构01--SDS和链表

一、简单动态字符串Redis没有直接使用C语言传统的字符串表示(以空字符串结尾的字符数组),构建了一种名为简单动态字符串的抽象模型。但是也存在C语言的字符串字符串的使用方式C字符串:用在无须对字符串值进行的字符串字面量SDS:可以被修改的字符串,在Redis的数据库里面,包含字符串值的键值对在底层都是SDS实现的。1 SDS1.1 SDS结构SDS结构代码stru...

2019-11-22 17:17:47 109

原创 Java源码学习--04--LinkedHashMap

LinkedHashMapLinkedHashMap是继承HashMap的,提供了两大特性:按照插入顺序进行访问实现了访问最少最先删除功能,其目的是把很久都没有访问的key自动删除内部实现:LinkedHashMap在HashMap基础上,多了一个双向链表来维持顺序。使用了HashMap中的增删功能,同时使用了钩子方法,来进行多余的操作。代码public class Link...

2019-11-22 15:29:43 134 1

空空如也

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

TA关注的人

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