事务隔离级别与MVCC
MySql常见的几种存储引擎及其特点:MyISAM独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;无法处理事务MyISAM存储引擎特别适合在以下几种情况下使用:1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据InnoDB健壮的事务型存储引擎在以下场合下,使用InnoDB是最理想的选择:1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。4.外键约束。MySQL支持外键的存储引擎只有InnoDB。5.支持自动增加列AUTO_INCREMENT属性。一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。MEMORY 存储介质是系统内存一般在以下几种情况下使用Memory存储引擎:1.目标数据较小, ...
mysql 索引
索引索引(key)是存储引擎用于快速找到记录的一种数据结构。它和一本书中目录的工作方式类似——当要查找一行记录时,先在索引中快速找到行所在的位置信息,然后再直接获取到那行记录。在MySql中,索引是在存储引擎层而不是服务器层实现的,所以不同的存储引擎对索引的实现和支持都不相同。
索引的优点
索引大大减少了服务器需要扫描的数据量
索引可以帮助服务器避免排序和临时表
索引可以将随机I/O变为顺序I/O
索引类型
普通索引
UNIQUE索引
主键索引
MyISAM索引与InnoDB索引那个快MyISAM索引的实现 MyISAM索引文件和数据文件是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。下图是MyISAM的索引原理图:(为了简化,一个页内只存放了两条记录。)
上图所提供的示例表字段有Col1(ID)、Col2(age)、Col3(name)三个,其中Col1为Primary Key(主键),上图很好地说明了树中叶子保存的是对应行的物理位置。通过该值,存储引擎能顺利地进行回表查询,得到一行完整记录。同时,每个叶子页也保 ...
数据库中的锁
两段锁协议两段锁协议是指每个事务的执行可以分为两个阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)。加锁阶段: 在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。解锁阶段: 当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。
通俗来讲:就是说一个事务中必需先完成所有的加锁,然后才可以进行锁的释放。
可以证明,若并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。如果事务是良构的且是两阶段的,那么任何一个合法的调度都是隔离的。具体的数学推到过程可以参照 《事务处理:概念与技术》 这本书的 7.5.8.2节.
另外要注意两段锁协议和防止死锁的一次封锁法的异同之处。一次封锁法要求 ...
nginx location 使用指南
什么是location
它是nginx基于http协议跟外界沟通的桥梁,用来匹配并执行一个规范化的URI,任何http请求都需要经过它的“同意”才能通过nginx的大门
它长什么样子呢,比如我们常见的一种配置
123location /hello { return 200 'hello world';}
/xxxx 除了这种还有没有其他的写法? 是不是没有? 要想知道有没有其他的写法是不是要从系统层面(api)去了解一下,才能扩展 官方
12location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }
语法规则很简单,一个location关键字,后面跟着可选的修饰符,后面是要匹配的字符,花括号中是要执行的操作。
修饰符= 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。~ 表示该规则是使用正则定义的,区分大小写。* 表示该规则是使用正则定义的,不区分大小写。^ 表示如果该符号后面的字符是最佳匹配,采用该规 ...
ThreadPoolExecutor源码解析
构造方法参数1.构造方法就不在此赘述,重点关注构造方法种的参数。
参数名
作用
corePoolSize
核心线程池大小
maximumPoolSize
最大线程池大小
keepAliveTime
线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit
keepAliveTime时间单位
workQueue
阻塞任务队列
threadFactory
新建线程工厂
RejectedExecutionHandler
当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
2.重点理解: corePoolSize , maximumPoolSize ,workQueue这三者之间的联系
a.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线 程。 b.当线程池达到corePoolSize时,新提交 ...
本地缓存 Guava Cache + Caffeine Cache
为什么我们要使用本地缓存?
空间换时间-消耗内存空间提升速度
某些热key重复hit到很多次
缓存的总容量不会超过内存的总量
GuavaCache构造12345678910111213141516171819202122232425LoadingCache<String, String> build = CacheBuilder.newBuilder()// key的最大数量.maximumSize(1000L)// 并发最大线程数.concurrencyLevel(10)// 基于写过期时间.expireAfterWrite(10, TimeUnit.SECONDS)// 基于访问过期.expireAfterAccess(15, TimeUnit.MINUTES)// 记录命中数 未命中数等.recordStats()// 从缓存移除数据的监听器.removalListener(new RemovalListener<String, String>() { public void onRemoval(RemovalNotificatio ...
自动化编译工具瞭望
前言: 随着前端vue、react、Angular等框架越来越火,自动化构建工具也时不时映入我们的眼帘,转眼已是几分天下的局面,功能很强大,使得前端项目开发和维护越来越方便,但是想灵活运用,学习曲线却越发陡峭,文档更是爆炸式的膨胀,我们面对的是各种基于不同编译工具的专项功能插件,及对应的配置参数。
搞好了:解放双手,极大的提升"开发体验",一键搞定一切,空对空导弹一键发射,发射后不管!自动追击目标。脱靶自动启动自曝程序,不会伤及地面。
搞不好:鸡肋,加重负担,浪费人力(专人维护,其他人一点不会,或者多版本迭代后变得难以上手),反而浪费时间(调试流程别扭,半自动半手动ctrl+c还得关闭这个软件打开那个软件),黑盒(最禁忌!直接傻眼),过度依赖编译工具,束缚技术选型,单一技术栈。
编译工具带给我们什么?(1)搭建开发环境:
热更新
mock数据
代理
(2)生成上线文件:
编译(less,sass,es6,typescript,.vue,.jsx )
语法校验
压缩校验 css ,js
css3代码自动补全
px转rem
自动化测试
自 ...
es6新特性
一. es6对象的扩展1. 属性的简洁表示法ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。
12345678910111213let birth ='foo';const Person ={ name:'张三'; //等同于birth: birth birth, // 等同于hello: function ()... hello(){ console.log('我的名字是',this.name);} };
2. 属性名表达式JavaScript 定义对象的属性,有两种方法。
12345678// 方法一obj.foo =true;// 方法二obj['a'+'bc']=123;
ES6 允许字面量定义对象时,用表达式作为对象的属性名。
123456789let propKey ='foo';let obj ={ [propKey]:true, ['a ...
函数式编程
一、JS引擎的工作原理先引入几个概念:执行环境栈、执行环境、全局对象、变量对象、活动对象、作用域和作用域链
然后贴一段代码:
12345678910var x = 1; //定义一个全局变量 xfunction A(y){ var x = 2; //定义一个局部变量 x function B(z){ //定义一个内部函数 B console.log(x+y+z); } return B; //返回函数B的引用}var C = A(1); //执行A,返回BC(1); //执行函数B,输出 4
下面我们从全局初始化、执行函数A、执行函数B 三个阶段来分析JS引擎对这段代码的处理过程
1.全局初始化JS引擎在进入一段可执行代码时,会完成三项初始化工作:
首先,创 ...
nuxt.js
Nuxt.js是什么?
一个基于 Vue.js 的通用应用框架
基于它初始化新项目的基础结构代码,或者在已有 Node.js 项目中使用
预设了利用 Vue.js 开发服务端渲染的应用所需要的各种配置
提供了一种命令叫:nuxt generate,为基于 Vue.js 的应用提供生成对应的静态站点的功能
为 客户端/服务端 这种典型的应用架构模式提供了许多有用的特性,例如异步数据加载、中间件支持、布局支持等
Nuxt.js的特性
基于 Vue.js
自动代码分层
服务端渲染
强大的路由功能,支持异步数据
静态文件服务
ES6/ES7 语法支持
打包和压缩 JS 和 CSS
HTML头部标签管理
本地开发支持热加载
集成ESLint
支持各种样式预处理器: SASS、LESS、 Stylus等等
支持HTTP/2 推送
目录结构1234567891011├── assets/ # 资源目录 assets 用于组织未编译的静态资源如 LESS、SASS 或 JavaScript├── components/ # 组件目录 componen ...