什么是InnoDb
InnoDb: InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。 COMPACT行格式 从图中可以看出来,一条完整的记录其实可以被分为记录的额外信息和记录的真实数据两大部分 变长字段长度列表MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型,我们也可以把拥有这些数据类型的列称为变长字段,变长字段中存储多少字节的数据是不固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来,这样才不至于把MySQL服务器搞懵,所以这些变长字段占用的存储空间分为两部分: 真正的数据内容 占用的字节数 在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放,我们再次强调一遍,是逆序存放! 变长字段长度列表中只存储值为 非NULL 的列内 ...
什么是Spring Security
Spring Security教程 相对于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。 自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了 自动化配置方案,可以零配置使用 Spring Security。 因此,一般来说,常见的安全管理技术栈的组合是这样的: SSM + Shiro Spring Boot/Spring Cloud + Spring Security 1.项目创建pom.xml 中的 Spring Security 依赖: 1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b ...
什么是JAVA内存模型
JAVA内存模型 JVM 内存结构和 Java 虚拟机的运行时区域有关; Java 内存模型和 Java 的并发编程有关。 JVM内存模型 6个区域 堆区(Heap):堆是存储类实例和数组的,通常是内存中最大的一块。实例很好理解,比如 new Object() 就会生成一个实例;而数组也是保存在堆上面的,因为在 Java 中,数组也是对象。 虚拟机栈(Java Virtual Machine Stacks):它保存局部变量和部分结果,并在方法调用和返回中起作用。 方法区(Method Area):它存储每个类的结构,例如运行时的常量池、字段和方法数据,以及方法和构造函数的代码,包括用于类初始化以及接口初始化的特殊方法。 本地方法栈(Native Method Stacks):与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的 Java 方法服务,而本地方法栈则是为 Native 方法服务。 程序计数器(The PC Register):是最小的一块内存区域,它的作用通常是保存当前正在执行的 JVM 指令地址。 运行时常量池(Run-Time Constant Pool):是方法区的一 ...
什么是Docker
1、简介Docker是一个开源的应用容器引擎;是一个轻量级容器技术; Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像; 运行中的这个镜像称为容器,容器启动是非常快速的。 2、核心概念docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上); docker客户端(Client):连接docker主机进行操作; docker仓库(Registry):用来保存各种打包好的软件镜像; docker镜像(Images):软件打包好的镜像;放在docker仓库中; docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用 使用Docker的步骤: 1)、安装Docker 2)、去Docker仓库找到这个软件对应的镜像; 3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器; 4)、对容器的启动停止就是对软件的启动停止; 3、安装Docker1)、安装linux虚拟机 1)、VMWare、VirtualBox(安装); ...
什么是Redis
Redis redis 简介简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 为什么要用 redis/为什么要用缓存主要从“高性能”和“高并发”这两点来看待这个问题。 高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! 高并发: 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。 为什么要用 redis 而不用 map/guava 做缓存?缓存分为本地缓存和分布式缓存 ...
什么是CAS
CAS( Compare-And-Swap)”比较并交换”(乐观锁的原理)CAS 的特点是避免使用互斥锁,当多个线程同时使用 CAS 更新同一个变量时,只有其中一个线程能够操作成功,而其他线程都会更新失败。更新失败的线程并不会被阻塞,而是被告知这次由于竞争而导致的操作失败,但还可以再次尝试。 CAS 的思路 CAS 相关的指令是具备原子性的 CAS 有三个操作数:内存值 V、预期值 A、要修改的值 B。 核心思路:仅当预期值 A 和当前的内存值 V 相同时,才将内存值修改为 B。 下面我们用图解和例子的方式,让 CAS 的过程变得更加清晰,如下图所示: 假设有两个线程,分别使用两个 CPU,它们都想利用 CAS 来改变右边的变量的值。我们先来看线程 1,它使用 CPU 1,假设它先执行,它期望当前的值是 100,并且想将其改成 150。在执行的时候,它会去检查当前的值是不是 100,发现真的是 100,所以可以改动成功,而当改完之后,右边的值就会从 100 变成 150。 如上图所示,假设现在才刚刚轮到线程 2 所使用的 CPU 2 来执行,它想要把这个值从 100 改成 200 ...
什么是Mockito
Mockito1 Mockito 介绍1.1 Mockito是什么?Mockito是mocking框架,它让你用简洁的API做测试。而且Mockito简单易学,它可读性强和验证语法简洁。 1.2 为什么需要Mock测试驱动的开发( TDD)要求我们先写单元测试,再写实现代码。在写单元测试的过程中,我们往往会遇到要测试的类有很多依赖,这些依赖的类/对象/资源又有别的依赖,从而形成一个大的依赖树,要在单元测试的环境中完整地构建这样的依赖,是一件很困难的事情。如下图所示: 为了测试类A,我们需要Mock B类和C类(用虚拟对象来代替)如下图所示: 1.3 Stub和Mock异同[1] 相同:Stub和Mock都是模拟外部依赖 不同:Stub是完全模拟一个外部依赖, 而Mock还可以用来判断测试通过还是失败 1.4 Mockito资源 官网: http://mockito.org API文档:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html 项目源码:https://github.com/mockito/mo ...
第一天
哈喽啊,以后会在这里记录我的java学习之路,加油! 种一棵树,最好的时间是十年前,其次就是现在。
什么是GIT
配置SSH: 配置账号: git config –global user.name “your name” git config –global user.email “your_email@youremail.com“ 提交代码: git sgit add .git commit -m “提交内容描述”git pull origin ‘分支’git push origin ‘分支’ 切换分支: git fetch origin ‘分支’ git checkout -b ’分支’ origin/’分支’ 切换分支:git checkout 分支名 如果切换失败: git fetch git checkout -b 分支名 origin/分支名 回退版本: 在一个分支中 git reset –soft head~11表示回退1个版本 2表示回退2 ...