Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。
1.有哪些优点
较高的性能(Golang Web框架比对数据)
简单易用的中间件
使用了性能高可扩展的HTTP路由httprouter
社区长期有着很高的活跃度
Github星星多(Orz)
…等
Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。
较高的性能(Golang Web框架比对数据)
简单易用的中间件
使用了性能高可扩展的HTTP路由httprouter
社区长期有着很高的活跃度
Github星星多(Orz)
…等
Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎。
因为业务调整采用了ES作为数据库,所以需要了解ES对于这一块的设计如何实现类似Mysql中Group By的查询的效果。
ES实现Group By有两种方式:TermsAgg、CompositeAgg,它们也具有不同程度的优缺点。
TermsAgg的使用方式非常粗暴,直接进行桶嵌套即可,如下:
TermsAgg请求DSL语句
1 | { |
TermsAgg执行结果
1 | { |
CompositeAgg的使用方式略微有一些不同,下面:
CompositeAgg请求DSL语句
1 | { |
CompositeAgg执行结果
1 | { |
TermsAgg
优点:使用简单、没有数据量限制。
缺点:数据结构层次深、不支持分页。
CompositeAgg
优点:使用简单、数据结构清晰可读,支持分页。
缺点:有数据量限制。
至于ES这两种分组方式的性能方面还没有研究,后续学习笔记会更新性能上面的差异。
代理通常用于在几台服务器之间分配负载,无缝显示来自不同网站的内容或通过除 HTTP 之外的协议将处理请求传递给应用服务器。
正向代理
gfw 科学上网。
客户端访问鉴权。
反向代理
负载均衡。
保证内网的安全,阻止 web 攻击。
比较通俗的来解释:正向代理代理的是客户端,服务端不知道实际发起请求的客户端、反向代理代理的是服务端,客户端不知道实际接收请求的服务端。
一张图表示(来源:知乎 wplulala)

索引用于快速查找具有特定列值的行。没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。这比顺序读取每一行要快得多。
InnoDB和MyIsam只支持Btree,因此默认均是Btree,Memory和Heap支持Hash和Btree,如无明确声明,则默认索引均是Hash(包括主键)。
主键索引:数据列不允许重复,不允许为null,一个表只能有一个主键。
唯一索引:数据列不允许重复,允许为null,一个表允许多个列创建唯一索引。
普通索引:基本的索引类型,没有唯一性的限制,允许为null。
全文索引:全文索引是目前实现大数据搜索的关键技术。
Mysql的索引遵循最左原则,在创建多列索引时,要根据业务需求,where条件中使用最频繁的一列放在最左边。
什么是事务?事务(Transaction)一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),具有4个特性:原子性、一致性、隔离性、持久性,简称ACID。
那么Mysql的事务隔离级别又是什么呢?Mysql的事务隔离级别分别是4种:未提交读(Read Uncommitted)、已提交读(Read Committed)、Repeatable Read(可重复读)、Serializable(可串行化)。可以简单理解为Mysql事务的4种执行标准。
原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
未提交读(Read Uncommitted),指当前事务可以读取到其他事务还未提交的数据变化,最容易带来的问题是脏读(Dirty Read),很少应用到生产环境。
已提交读(Read Committed),大部分数据库默认隔离级别但不包括Mysql,指当前事务可以读取其他事务已提交的数据变化,具有隔离性的基本标准,但是在出现交叉事务的并发操作场景中会发生两次读取的数据结果集不一致的问题,即不可重复读(Nonrepeatable Read)。
Repeatable Read(可重复读),Mysql数据库的默认隔离级别,这里顺便解释一下为什么Mysql的隔离级别不是Read Committed,因为在Mysql5.0之前日志格式只有statement这一种,这种格式导致主从复制一致性很难得到保证。这种隔离级别可以解决Nonrepeatable Read的问题,但如果也出现在交叉事务的并发操作场景会出现幻读(Phantom Read)的现象,这一行为状态是当前事务不能及时有效的读取其他事务的数据变化。
Serializable(可串行化),Mysql事务隔离最高级别,望文生义大概意思是事务的执行是有序(串行化顺序)的,不存在事务交叉执行的场景从而解决了Phantom Read的问题,但是在高并发的业务场景下请求会出现阻塞、超时、锁竟抢的问题,系统的可用性也随之降低。
https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html // Mysql事务官方文档
什么是锁?在多进程(线程)编程中为了数据的一致性、有效性,如果一资源被某进程(线程)上锁,那么在释放锁之前其他进程(线程)无法进行操作或者等待获取(上)锁。
悲观锁(Pessimistic locking),顾名思义对待任何事务都持悲观态度,做任何事情都会认为会有竞抢行为~所以在进行任何操作之前都要做好万全准备(上锁)才会继续执行后续的操作。通常是利用系统提供的锁机制来实现。
比如:
1 | Mysql中的上锁命令:for update、lock in share mode等 |
乐观锁(Optimistic locking),和悲观锁相反对待任何事务都持乐观态度,只会在最后即将执行操作的时刻前才会进行验证。通常是通过程序配合来实现。
比如:
1 | update `orders` set hash = md5(now()) where uid = 1 and hash = {lastHash}; |
悲观锁优点很鲜明,因为每次执行的操作都是独占的,数据的一致性、有效性、安全性较高。但缺点同样突出,每次操作都会产生上锁的开销,在并发请求比较密集的情况下容易阻塞或者驳回请求,甚至是造成死锁,也大大降低了系统的性能。
乐观锁优点是省去了锁的开销,能较高的提高系统吞吐量,缺点是如果出现在并发高且竟抢(冲突)行为比较多的场景下数据的一致性很难保证。
Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。
1 | 单纯的缓存模式, 整个数据的生命周期随着Redis Server的停止而消失。 |
1 | RDB(Redis DataBase) |
Firebase 是一个移动平台,可以帮助您快速开发高品质应用,扩大用户群,并赚取更多收益。Firebase 由多种互补功能组成,您可以自行组合和匹配这些功能以满足自己的需求。
AIzaSyCm5Vufc1FAtWE1kupGhVDRb0ThkCoWC7d // 这个是我的
1 | // 初始化环境 |
1 | { |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true